「SELinuxが有効だとアプリが動かないから、とりあえず無効にしている」――そんな運用をしていないでしょうか。
SELinux(Security-Enhanced Linux)は、Linuxカーネルに組み込まれた強制アクセス制御(MAC: Mandatory Access Control)の仕組みです。正しく理解すれば、サーバーのセキュリティを大幅に強化できる強力な防御層になります。
この記事では、SELinuxの基本的な仕組みから3つの動作モード、実際の設定手順、トラブルシューティングまでを、現場ですぐ使えるレベルで解説します。RHEL系ディストリビューション(AlmaLinux・Rocky Linux・CentOS)での実用を想定しています。

SELinuxとは?なぜ重要なのか
SELinux(Security-Enhanced Linux)は、米国NSA(国家安全保障局)が開発し、Linuxカーネルに組み込まれたセキュリティモジュールです。通常のLinuxのアクセス制御(DAC: Discretionary Access Control=任意アクセス制御)に加えて、強制アクセス制御(MAC)の層を追加します。
通常のLinuxでは、ファイルの所有者がパーミッションを自由に設定できます。しかし、もしroot権限を奪われた場合、DACだけではあらゆるファイルへのアクセスを防げません。SELinuxは、root権限を持つプロセスであっても「ポリシーで許可されていない操作はブロックする」という仕組みで、この弱点を補います。
SELinuxが重要な理由は主に3つあります。
・侵入後の被害を限定する: Webアプリの脆弱性を突かれても、SELinuxのポリシーがプロセスのアクセス範囲を制限するため、被害の拡大を防げます
・ゼロデイ攻撃への防御層: パッチが提供される前の未知の脆弱性に対しても、ポリシー外の動作をブロックすることで影響を最小化できます
・コンプライアンス要件への対応: PCI DSSやISMSなどのセキュリティ基準では、強制アクセス制御の導入が推奨されています
SELinuxがない場合のリスク
SELinuxを無効化した状態でサーバーを運用する場合、どのようなリスクがあるかを理解しておきましょう。
1. 権限昇格の被害が拡大する
Webアプリケーションの脆弱性を突かれてapacheユーザーの権限でシェルを取られた場合、SELinuxが無効だと、apacheユーザーがアクセスできるすべてのファイルが読み取り・改ざんの対象になります。SELinuxが有効であれば、httpdプロセスがアクセスできるファイルはポリシーで定義された範囲に限定されます。
2. 設定ファイルの書き換えリスク
攻撃者がサーバーに侵入した場合、/etc/passwd や /etc/shadow、cron設定などのシステムファイルを書き換えてバックドアを仕込むことがあります。SELinuxは、各プロセスがアクセスできるファイルをラベル(セキュリティコンテキスト)で厳密に管理するため、ポリシー外のファイル操作をブロックします。
3. 横移動(ラテラルムーブメント)の抑止
侵入者が1つのサービスの権限を奪った後、そこを足がかりに他のサービスやネットワークリソースへアクセスを広げる「横移動」は、深刻な被害につながります。SELinuxはプロセスごとにアクセス境界を設定するため、この横移動を効果的に抑止します。

SELinuxの3つのモードと切り替え方法
SELinuxには3つの動作モードがあります。用途に応じて適切に切り替えることが重要です。
| モード | 動作 | 用途 |
|---|---|---|
| Enforcing | ポリシーを強制する(違反はブロック+ログ記録) | 本番運用 |
| Permissive | ポリシー違反をログに記録するが、ブロックはしない | 検証・トラブルシュート |
| Disabled | SELinuxを完全に無効化する | 非推奨 |
1. 現在のモードを確認する
# 現在のモードを確認 getenforce # 詳細なステータスを表示 sestatus
sestatus を実行すると、現在のモード、設定ファイル上のモード、使用中のポリシーなどが一覧で表示されます。
2. 一時的にモードを切り替える(再起動で元に戻る)
# EnforcingからPermissiveに一時変更 sudo setenforce 0 # PermissiveからEnforcingに戻す sudo setenforce 1
この変更はサーバーを再起動すると元に戻ります。トラブルシューティング時にPermissiveで動作確認する場合に便利です。
3. 永続的にモードを変更する
# /etc/selinux/config を編集 # SELINUX=enforcing → 変更可能な値: enforcing, permissive, disabled sudo vi /etc/selinux/config # 変更例(Enforcingに設定) SELINUX=enforcing SELINUXTYPE=targeted
注意: Disabledから Enforcing に戻す場合、ファイルシステム全体のセキュリティラベルの再付与(リラベル)が必要です。再起動時に自動実行されますが、ファイル数によっては数十分かかることがあります。
SELinuxポリシーの基本とトラブルシューティング
SELinuxで最も多い困りごとは「正当なアクセスなのにブロックされる」というケースです。ここでは、実務で遭遇する典型的な問題の解決手順を紹介します。
1. 拒否ログを確認する(audit.log)
SELinuxがアクセスを拒否すると、/var/log/audit/audit.log に記録されます。
# SELinuxの拒否ログを確認 sudo ausearch -m avc --start today # 直近のSELinux拒否メッセージを見やすく表示 sudo ausearch -m avc -ts recent | audit2why
audit2why は、拒否の原因と推奨される対処方法を教えてくれるツールです。
2. sealertで詳細な解決策を確認する
setroubleshoot-server パッケージをインストールすると、sealert コマンドでより詳しい解析結果が得られます。
# setroubleshootのインストール sudo dnf install setroubleshoot-server # ログを解析して対処法を表示 sudo sealert -a /var/log/audit/audit.log
sealert は「このブール値をオンにしてください」「このファイルのコンテキストを変更してください」など、具体的な修正コマンドを提案してくれます。
3. セキュリティコンテキストを修正する
ファイルを移動したりコピーしたりすると、SELinuxのセキュリティコンテキスト(ラベル)が正しくない状態になることがあります。
# ファイルのセキュリティコンテキストを確認 ls -Z /var/www/html/ # コンテキストをデフォルトに復元 sudo restorecon -Rv /var/www/html/ # ポートのコンテキストを追加(例: httpd用にポート8080を許可) sudo semanage port -a -t http_port_t -p tcp 8080
4. ブール値で機能を個別に許可する
SELinuxのブール値(Boolean)は、ポリシーを変更せずに特定の機能をオン・オフできるスイッチです。
# 現在のブール値を一覧表示 sudo getsebool -a # httpdがネットワーク接続することを許可(例: リバースプロキシ構成) sudo setsebool -P httpd_can_network_connect on # httpdがメールを送信することを許可 sudo setsebool -P httpd_can_sendmail on
-P オプションを付けると、再起動後も設定が維持されます。
中小企業でも今日からできること
「SELinuxは難しそうだから無効にしている」という声をよく聞きますが、段階的に導入すれば運用負荷は最小限に抑えられます。
| ステップ | 内容 | 所要時間 |
|---|---|---|
| Step 1 | sestatusで現状を確認する | 1分 |
| Step 2 | Permissiveモードでログを収集する(1〜2週間) | 5分(設定) |
| Step 3 | sealertでブロックされる操作を確認し、必要なブール値やコンテキストを設定 | 1〜2時間 |
| Step 4 | Enforcingモードに切り替える | 1分 |
まずはPermissiveモードで運用して、どのようなアクセスがブロック対象になるかをログで把握することから始めてください。いきなりEnforcingにして業務が止まるリスクを避けられます。
よくある誤解と注意点
【注意】「SELinuxを無効にするのがベストプラクティス」は誤り
インターネット上には「SELinuxはdisabledにしましょう」と書かれた記事が数多くありますが、これはセキュリティの観点からは推奨されません。RHEL公式ドキュメントでもSELinuxの無効化は非推奨とされています。トラブルの原因がSELinuxかどうかを切り分けるには、Disabledではなく Permissive モードを使ってください。
【注意】SELinuxだけでサーバーを守れるわけではない
SELinuxは多層防御(Defense in Depth)の一つの層です。ファイアウォール、パッチ管理、ログ監視、アクセス制御など、他のセキュリティ対策と組み合わせて初めて効果を発揮します。
【注意】ファイルのコピーと移動でコンテキストが変わる
cp コマンドはコピー先のデフォルトコンテキストが付与されますが、mv コマンドは元のコンテキストがそのまま引き継がれます。Webサーバーの公開ディレクトリにファイルを配置する際、mv で移動するとコンテキスト不一致でアクセスが拒否されることがあります。restorecon でコンテキストを修正する習慣をつけてください。

本記事のまとめ
SELinuxは「難しいから無効にする」ものではなく、「正しく理解して運用する」ことでサーバーの防御力を大幅に高められる仕組みです。Permissiveモードでの段階的な導入から始めれば、情シス1人体制の環境でも無理なく運用できます。
| 項目 | ポイント |
|---|---|
| SELinuxの役割 | プロセスごとにアクセスを制限する強制アクセス制御(MAC) |
| 推奨モード | 本番環境はEnforcing、検証時はPermissive |
| トラブル時 | audit2why・sealertで原因を特定してからポリシーを調整 |
| 導入手順 | Permissiveでログ収集→問題解消→Enforcingに切り替え |
Linuxのファイルパーミッションやfirewalldの設定方法については、姉妹サイトLinuxMaster.JPで詳しく解説しています。SELinuxとあわせて、サーバー全体のセキュリティを底上げしたい方はぜひご覧ください。
SELinux、「とりあえず無効」のままになっていませんか?
SELinuxを正しく使いこなせば、サーバーの防御力は格段に上がります。
正しいセキュリティ知識を体系的に身につけたい方へ、メルマガで実践的なセキュリティ対策ノウハウをお届けしています。


コメント