SELinuxを無効化・確認する方法|enforcing/permissive/disabled切替とgetenforce・sestatus

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > SELinuxを無効化・確認する方法|enforcing/permissive/disabled切替とgetenforce・sestatus
「Apacheを起動したのに接続できない」「ファイルを作成したのに権限エラーが出る」——こういったトラブルの原因がSELinuxだったというケースは、Linuxサーバー管理者なら一度は経験しているはずです。

SELinuxはサーバーのセキュリティを強化する重要な機能ですが、設定が複雑なため、開発環境や検証環境では一時的に無効化したい場面もあります。
また「今のモードが何か」「恒久的な設定と一時的な設定の違い」を把握していないと、再起動後に思わぬ状態に戻ってしまうことも。

この記事では、SELinuxの3つの動作モード(Enforcing・Permissive・Disabled)の違いと確認方法、getenforceとsestatusの使い分け、一時的・恒久的な切替手順を実サーバーの出力例つきで解説します。
sestatusの-v・-bオプション、setenforceの文字列指定、sedコマンドでの設定変更、ausearchによる拒否ログ確認まで、現場で使う操作を網羅しています。
CentOS7/RHEL 9/AlmaLinux 9/Rocky Linux 9 で動作確認済みです。

この記事のポイント

・getenforce でモードを確認、sestatus で詳細状態を確認する(-v・-bオプションも解説)
・一時的な切替は setenforce 0/1(または Permissive/Enforcing の文字列指定も可)。再起動で元に戻る
・恒久的な無効化は /etc/selinux/config を SELINUX=disabled に変更して再起動
・本番サーバーでは Permissive で動作確認してから判断するのが鉄則


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

SELinuxの3つの動作モード

SELinux(Security-Enhanced Linux)はNSAが開発した強制アクセス制御(MAC: Mandatory Access Control)の仕組みで、RHEL系ディストリビューション(CentOS/AlmaLinux/Rocky Linux)のデフォルトセキュリティレイヤーです。通常のLinuxパーミッション(DAC)より厳密なポリシーでプロセスのアクセスを制御します。

SELinuxには3つの動作モードがあります。それぞれの違いを正しく理解することが、適切な設定の前提です。
モード 動作 主な用途
Enforcing ポリシーを強制適用。ポリシー違反のアクセスを拒否し、ログに記録する 本番環境の通常運用
Permissive ポリシー違反を許可するが、ログには記録する(実際の制限はかけない) トラブルシュート・動作確認
Disabled SELinuxを完全に無効化。ポリシーチェックもログ記録も行わない 開発環境・検証環境での一時的な無効化(非推奨)
重要なのは「一時的な設定(setenforce)」と「恒久的な設定(/etc/selinux/config)」の2層構造があることです。
setenforceで変更した設定は再起動すると消えます。恒久的に変更したいなら設定ファイルの変更が必要です。

また「とりあえずDisabledにする」は今や推奨されません。Permissiveモードでログを確認しながらポリシーを調整するのが、現場での正しいアプローチです。

現在のSELinuxの状態を確認する

1. getenforceで動作モードを確認する

最もシンプルに現在のモードを確認するコマンドです。

# getenforce Enforcing

表示される値の意味は以下のとおりです。

Enforcing:有効状態。SELinuxのポリシーが強制適用されている
Permissive:ポリシー違反を許可するが、監査ログに記録する
Disabled:完全に無効化された状態

シェルスクリプトでSELinuxのモードを条件分岐に使う場面でもよく活用します。

#!/bin/bash # SELinuxの状態をチェックして処理を分岐する例 SEL_MODE=$(getenforce) if [ "$SEL_MODE" = "Enforcing" ]; then echo "SELinuxはEnforcingモードです。ポリシー違反に注意してください。" elif [ "$SEL_MODE" = "Permissive" ]; then echo "SELinuxはPermissiveモードです(ログのみ記録)。" elif [ "$SEL_MODE" = "Disabled" ]; then echo "SELinuxは無効化されています。" fi

インストールスクリプトや構成管理ツールでSELinuxの有効・無効を判定して処理を分岐するパターンでよく使います。

2. sestatusで詳細な状態を確認する

より詳細な情報を確認するには sestatus コマンドを使います。

# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 33

注目すべき項目は以下の2つです。

Current mode:現在の動作モード(setenforceで変更した値が反映される)
Mode from config file:/etc/selinux/configに記載されている設定値(再起動後に適用される)

この2つが異なる場合は、一時的に変更されている状態です。たとえば Current mode が permissive で、Mode from config file が enforcing なら、再起動後に Enforcing に戻ります。

sestatus -v:プロセスとファイルのSELinuxコンテキストも表示する

# sestatus -v SELinux status: enabled (中略) Process contexts: Current context: unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 Init context: system_u:system_r:init_t:s0 /usr/sbin/sshd system_u:system_r:sshd_t:s0-s0:c0.c1023 File contexts: /etc/passwd system_u:object_r:passwd_file_t:s0 /etc/shadow system_u:object_r:shadow_t:s0 /bin/bash system_u:object_r:shell_exec_t:s0

あるプロセスがどのSELinuxコンテキストで動いているかを確認したいときに便利です。

sestatus -b:SELinuxブーリアン設定の一覧を表示する

# sestatus -b | grep httpd httpd_can_network_connect off httpd_can_network_connect_db off httpd_execmem off httpd_read_user_content off

SELinuxブーリアンはポリシーの一部の挙動をon/offで切り替える仕組みです。たとえば httpd_can_network_connect がoffのままだと、Apacheが外部のデータベースに接続できません。ブーリアンの変更は setsebool -P コマンドで行います(-Pで永続化)。

getenforceとsestatusの使い分け

getenforce:シンプルに現在のモードだけ知りたいとき(スクリプトでの条件分岐にも使いやすい)
sestatus:恒久設定との差異を確認したいとき、ポリシー名やバージョンも確認したいとき
sestatus -v:プロセスやファイルのSELinuxコンテキストまで確認したいとき
sestatus -b:ブーリアン設定の一覧を確認したいとき(httpd系の接続問題など)

SELinuxを一時的に切り替える(setenforce)

setenforce コマンドを使うと、再起動するまでの間だけSELinuxの動作モードを変更できます。
設定ファイル(/etc/selinux/config)は変更されないため、再起動後は元の設定に戻ります。

1. EnforcingからPermissiveに変更する

SELinuxを「ログ記録のみ・制限なし」の状態にします。
サービスが動かない原因がSELinuxかどうかを切り分けるときに使います。

# setenforce 0 # getenforce Permissive # 数値の代わりに文字列でも指定できる # setenforce Permissive

2. PermissiveからEnforcingに戻す

# setenforce 1 # getenforce Enforcing # 文字列での指定も可能 # setenforce Enforcing

setenforceの制限事項

注意: setenforce で「Disabled」(完全無効)にすることはできません。Disabledにするには /etc/selinux/config の変更と再起動が必要です。
また、すでに Disabled 状態のサーバーで setenforce を実行すると「SELinux is disabled」エラーになります。

「setenforceで変えたはずなのに再起動したら戻った」はSELinuxあるあるの失敗パターンです。恒久変更は必ず設定ファイルで行うことを徹底してください。

SELinuxを恒久的に無効化する(/etc/selinux/config)

再起動後も無効化を維持するには、設定ファイル /etc/selinux/config を編集します。

1. /etc/selinux/configを編集する

# vi /etc/selinux/config

ファイルを開くと、以下のような記述があります。

# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. # mls - Multi Level Security protection. SELINUXTYPE=targeted

`SELINUX=enforcing` の行を `SELINUX=disabled` に変更します。

# 変更前 SELINUX=enforcing # 変更後 SELINUX=disabled

変更したら `:wq` で保存・終了します。sedコマンドで一発変更することもできます。

# sedコマンドで変更する(変更前確認→変更→変更後確認を一括で) grep "^SELINUX=" /etc/selinux/config sed -i "s/^SELINUX=.*/SELINUX=disabled/" /etc/selinux/config grep "^SELINUX=" /etc/selinux/config

2. システムを再起動する

# shutdown -r now

3. 再起動後に状態を確認する

# getenforce Disabled # sestatus SELinux status: disabled

`Disabled` と表示されれば、SELinuxの無効化は完了です。

恒久的にPermissiveに設定する方法

本番サーバーで「完全無効化はしたくないが、常にPermissiveにしたい」という場合は、/etc/selinux/config で `SELINUX=permissive` に設定します。

# sedコマンドで変更する sed -i "s/^SELINUX=.*/SELINUX=permissive/" /etc/selinux/config grep "^SELINUX=" /etc/selinux/config

# /etc/selinux/config の設定(viで直接変更した場合) SELINUX=permissive # 再起動後に確認 # sestatus SELinux status: enabled Current mode: permissive Mode from config file: permissive

Permissiveモードでは引き続き監査ログが記録されるため、後から「どんなアクセスをブロックしようとしていたか」を追跡できます。

Permissiveモードで動作確認してから無効化する(推奨手順)

本番サーバーでSELinuxを無効化する前に、まずPermissiveモードで動作確認を行うことを強くお勧めします。
Permissiveモードでは、SELinuxのポリシー違反をログに記録しながらもアクセスは許可します。これにより「どのポリシーが引っかかっているか」を調べてから対処できます。

1. Permissiveモードに変更してサービスを動かす

# setenforce 0 # systemctl start httpd

2. auditログでSELinuxの拒否を確認する

# ausearchコマンドで直近の拒否ログを確認する(推奨) ausearch -m avc -ts recent # または audit.logから直接確認する grep "denied" /var/log/audit/audit.log | tail -20

type=AVC msg=audit(1711234567.890:1234): avc: denied { read } for pid=12345 comm="httpd" name="index.php" dev="sda1" ino=78901 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=1

`denied` の行があれば、SELinuxが制限しようとしていた操作が確認できます。
ファイルのSELinuxコンテキストが問題の場合、chconコマンドで一時的にコンテキストを修正するか、semanage fcontext+restoreconで恒久的に設定できます。

# ファイルのSELinuxコンテキストを確認する ls -Z /var/www/html/app.conf # httpdが読めるコンテキストに変更する(一時的) chcon -t httpd_config_t /var/www/html/app.conf # または恒久的にデフォルトコンテキストを設定(推奨) semanage fcontext -a -t httpd_config_t "/var/www/html/app.conf" restorecon -v /var/www/html/app.conf

「なぜ拒否しようとしたか」を人間が読める形で表示するには `audit2why` コマンドが便利です。

# grep "denied" /var/log/audit/audit.log | audit2why type=AVC msg=audit(1711234567.890:1234): avc: denied { read } for pid=12345 comm="httpd" Was caused by: Missing type enforcement (TE) allow rule. You can use audit2allow to generate a loadable module to allow this access.

3. audit2allowでポリシーを確認する(参考)

拒否されている操作に対して、どんなポリシーを追加すれば解決できるかを確認できます。

# 拒否ログから必要なポリシーを確認する grep "denied" /var/log/audit/audit.log | audit2allow # ポリシーモジュールとして作成・適用する(root権限が必要) ausearch -m avc -ts recent | audit2allow -M mypolicy semodule -i mypolicy.pp

ポリシーを追加できる場合はSELinuxを有効なまま運用できます。開発環境ならPermissiveのまま、本番環境ならポリシー追加での解決が理想です。
注意:audit2allowは「拒否されたアクセスをすべて許可する」方向に動くため、内容を必ず確認してから適用してください。

トラブルシュート

「setenforce: SELinux is disabled」と表示される

すでに /etc/selinux/config で `SELINUX=disabled` が設定されており、カーネル起動時からSELinuxが無効化されています。setenforce コマンドは無効化済みの状態では使えません。

設定変更後に再起動したら起動が遅くなった(autorelabel)

Disabledから Enforcing/Permissive に戻した場合、システムはファイルシステム全体へのSELinuxラベル付け(autorelabel)を行うため、起動に時間がかかることがあります。
Disabledから戻す際は、事前に `touch /.autorelabel` を実行してから再起動するのが正しい手順です。

# DisabledからEnforcingに戻す正しい手順 # 1. 設定ファイルをEnforcingに変更する sed -i "s/^SELINUX=.*/SELINUX=enforcing/" /etc/selinux/config # 2. ファイルシステムの自動ラベル付けを有効にする(必須) touch /.autorelabel # 3. 再起動(起動時にラベル付けが実行される) shutdown -r now

# autorelabelが実行中かどうか確認する ls -la /.autorelabel -rw-r--r-- 1 root root 0 Apr 1 10:00 /.autorelabel # ファイルが存在すれば処理中(再起動後に消える)

大容量のファイルシステムでは数十分かかる場合があります。

無効化後にApacheやNginxが起動しない

SELinuxが原因でなく、別の設定ミスや依存サービスの問題の可能性があります。journalctl -u httpd や systemctl status httpd でエラー内容を確認してください。

selinux/configの編集ミスで起動しない

/etc/selinux/config のSELINUX値に誤字がある場合、起動時にエラーが出ることがあります。救済策として、起動時のGRUBメニューでkernel起動パラメータに `enforcing=0` を追加することで、Permissiveモードで起動できます。

本記事のまとめ

やりたいこと コマンド・手順
現在のモードを確認する getenforce
詳細な状態を確認する(設定ファイルとの差異も) sestatus
プロセス・ファイルのコンテキストも確認する sestatus -v
ブーリアン設定の一覧を確認する sestatus -b
一時的にPermissiveにする(再起動で戻る) setenforce 0(または setenforce Permissive
一時的にEnforcingに戻す(再起動で戻る) setenforce 1(または setenforce Enforcing
恒久的に無効化する /etc/selinux/config で SELINUX=disabled に変更し再起動
恒久的にPermissiveにする /etc/selinux/config で SELINUX=permissive に変更し再起動
DisabledからEnforcingに戻す SELINUX=enforcing設定後 touch /.autorelabel して再起動
SELinuxの拒否ログを確認する ausearch -m avc -ts recent
拒否理由を分かりやすく表示する grep "denied" /var/log/audit/audit.log | audit2why
ポリシーを追加して対処する audit2allow -M mypolicysemodule -i mypolicy.pp

AlmaLinux 10での初期設定もあわせて確認

SELinuxの基本仕様(Enforcing/Permissive/Disabledの3モード、getenforce/sestatus、/etc/selinux/config)はAlmaLinux 10でも同じ流れで踏襲されています。
ただしAlmaLinux 10ではカーネル6.12・DNF 5・FIPS 140-3対応など周辺環境が変わっており、サーバー初期構築時にはSELinuxだけでなくfirewalld・SSH鍵認証・dnf更新を同じ順序で押さえておくのが安全です。
AlmaLinux 10のサーバー初期設定を10項目に整理した手順は、「AlmaLinux 10 サーバー初期設定10項目|SELinux・firewalld・dnf・SSH鍵認証」でまとめています。CentOS 7からAlmaLinux系に移行する方は、本記事のSELinux設定とあわせて参照してください。

SELinuxの設定で詰まったことはありませんか?

SELinuxに限らず、Linuxサーバー構築では「設定した通りに動かない」「エラーの意味がわからない」といった壁に何度もぶつかります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。