SELinuxはサーバーのセキュリティを強化する重要な機能ですが、設定が複雑なため、開発環境や検証環境では一時的に無効化したい場面もあります。
この記事では、SELinuxの現在の状態を確認する方法と、一時的・恒久的に無効化する手順を、CentOS7とRHEL9/Rocky Linux9の両方に対応して解説します。
【この記事でわかること】
・getenforce コマンドで現在のSELinuxの動作モードを確認できる
・一時的な無効化は setenforce 0(再起動すると元に戻る)
・恒久的な無効化は /etc/selinux/config の SELINUX=disabled に変更して再起動
・本番サーバーでの無効化は推奨しない。Permissiveモードで影響調査してから判断する
・SELinuxの動作状態をgetenforceコマンドで確認する方法
・setenforceコマンドで一時的にSELinuxを無効化・許可モードに変更する方法
・/etc/selinux/configファイルを編集して恒久的に無効化する方法
・SELinuxが原因の権限エラーをaudit2allowやsealertで調査するヒント
・無効化前に知っておくべきSELinuxのセキュリティ上の注意点
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
SELinuxとは何か
SELinux(Security-Enhanced Linux)は、アメリカ国家安全保障局(NSA)が開発したLinuxのセキュリティ機能です。通常のLinuxでは、root権限を奪取されると攻撃者はシステム全体を自由に操作できます。SELinuxはこの問題に対処するため、rootを含むすべてのユーザーやプロセスの権限を細かく制限します。
具体的には、Apacheが読めるディレクトリ、MySQLが書き込めるファイルといった「プロセスごとのアクセス制限」をカーネルレベルで強制します。これにより、万が一Apacheが攻撃者に乗っ取られても、システム全体への被害を限定的に抑えられます。
ただし、この細かなアクセス制御が「設定していないサービスが動かない」というトラブルの原因にもなります。開発・検証環境や、SELinuxの恩恵よりも管理の簡便さを優先する場面では、無効化を選択することも現実的な判断です。
SELinuxの動作モードを確認する
まずは現在のSELinuxの状態を確認します。1. getenforceコマンドで動作モードを確認する
getenforce コマンドで現在のSELinuxの動作モードを確認できます。# getenforce Enforcing
・Enforcing:有効状態。SELinuxのポリシーが強制適用されている
・Permissive:ポリシー違反を許可するが、監査ログに記録する。動作確認・トラブルシュートに使う
・Disabled:完全に無効化された状態
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
・Current mode:現在の動作モード(setenforceで変更した値が反映される)
・Mode from config file:/etc/selinux/configに記載されている設定値(再起動後に適用される)
この2つが異なる場合は、一時的に変更されている状態です。
SELinuxを一時的に無効化する
setenforce コマンドを使うと、再起動するまでの間だけSELinuxの動作モードを変更できます。※設定ファイル(/etc/selinux/config)は変更されないため、再起動後は元の設定に戻ります。
1. EnforcingからPermissiveに変更する
SELinuxを「ログ記録のみ・制限なし」の状態にします。# setenforce 0 # getenforce Permissive
2. PermissiveからEnforcingに戻す
# setenforce 1 # getenforce Enforcing
setenforce で「Disabled」(完全無効)にすることはできません。Disabledにするには /etc/selinux/config の変更と再起動が必要です。SELinuxを恒久的に無効化する
再起動後も無効化を維持するには、設定ファイル/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 で保存・終了します。2. システムを再起動する
# shutdown -r now
3. 再起動後に状態を確認する
# getenforce Disabled # sestatus SELinux status: disabled
Disabled と表示されれば、SELinuxの無効化は完了です。Permissiveモードで動作確認してから無効化する(推奨手順)
本番サーバーでSELinuxを無効化する前に、まずPermissiveモードで動作確認を行うことを強くお勧めします。Permissiveモードでは、SELinuxのポリシー違反をログに記録しながらも、アクセスは許可します。これにより「どのポリシーが引っかかっているか」を調べてから対処できます。
1. Permissiveモードに変更してサービスを動かす
# setenforce 0 # systemctl start httpd
2. auditログでSELinuxの拒否を確認する
# 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が制限しようとしていた操作が確認できます。3. audit2allowでポリシーを確認する(参考)
拒否されている操作に対して、どんなポリシーを追加すれば解決できるかを確認できます。# grep "denied" /var/log/audit/audit.log | audit2allow
トラブルシュート
「setenforce: SELinux is disabled」と表示される
すでに /etc/selinux/config でSELINUX=disabled が設定されており、カーネル起動時からSELinuxが無効化されています。setenforce コマンドは無効化済みの状態では使えません。設定変更後に再起動したら自動ラベル付けで起動が遅くなった
DisabledからEnforcingに戻した場合、システムはファイルシステム全体へのSELinuxラベル付け(autorelabel)を行うため、起動に時間がかかることがあります。/.autorelabel ファイルが作成されている場合は処理中です。無効化後にApacheやNginxが起動しない
SELinuxが原因でなく、別の設定ミスや依存サービスの問題の可能性があります。journalctl -u httpd や systemctl status httpd でエラー内容を確認してください。本記事のまとめ
| やりたいこと | コマンド・手順 |
|---|---|
| 現在のモードを確認する | getenforce |
| 詳細な状態を確認する | sestatus |
| 一時的にPermissiveにする | setenforce 0 |
| 一時的にEnforcingに戻す | setenforce 1 |
| 恒久的に無効化する | /etc/selinux/config で SELINUX=disabled に変更し再起動 |
| SELinuxの拒否ログを確認する | grep "denied" /var/log/audit/audit.log |
SELinuxのエラーで詰まっていませんか?
SELinuxはApacheやNFSなど多くのサービスで権限エラーの原因になります。原因の切り分けと対処法を体系的に理解することが重要です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:sedコマンドで文字列を置換する方法|-iの一括置換やファイル編集も
- 前のページへ:dfコマンドでディスク容量を確認する方法|使用率の見方や容量不足の対処も
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます