SELinux 設定内容の「意味」を徹底解説する完全ガイド

SELinux 設定内容の「意味」を徹底解説する完全ガイド Linuxサーバ

〜何を設定しているのか/なぜ必要なのか/何が変わるのか〜
今回は、SELinux を 運用で使えるレベルまで理解するために、
「設定している内容」そのものを 1つずつ分解して、意味・目的・影響・確認方法を解説します。


スポンサーリンク
  1. 結論:SELinux は「追加のルール」であり、設定の本体は2つだけ
  2. 1. SELinux モード設定の意味(getenforce / setenforce / 「/etc/selinux/config」)
        1. 1-1. getenforce(今どう動いているかを確認)
        2. 1-2. setenforce(実行中に一時的に切り替える)
        3. 1-3. /etc/selinux/config(永続的なモード設定)
  3. 2. 「コンテキスト(ラベル)」設定の意味(ls -Z / ps -eZ)
        1. 2-1. ファイルのコンテキスト確認:ls -Z
        2. 2-2. プロセスのコンテキスト確認:ps -eZ
  4. 3. 「設定の正解」= restorecon と semanage fcontext の意味
        1. 3-1. restorecon(あるべきラベルに戻す)
        2. 3-2. semanage fcontext(そのパスはこういう用途だ、と永続定義する)
        3. 3-3. chcon(危険:一時変更)
  5. 4. Boolean の意味(setsebool / getsebool)
        1. 4-1. 例:Apache から DB へ TCP 接続したい(httpd_can_network_connect)
  6. 5. ポート設定の意味(semanage port)
        1. 5-1. 例:MySQL を 13306 で待ち受けする
  7. 6. DAC(rwx)と SELinux の関係を “設定として” 理解する
        1. 6-1. DAC が OK でも SELinux が NG なら動かない
        2. 6-2. SELinux が OK でも DAC が NG なら動かない
  8. 7. トラブルシュート(“どの設定”を見ればよいか)
        1. 7-1. まずは SELinux が有効か
        2. 7-2. AVC が出ているか(原因の一次情報)
        3. 7-3. 対象のラベルを確認
        4. 7-4. “正しいラベル” に戻す/定義する
  9. 8. よく使う type(意味が分かると運用が楽になる)
        1. Apache(httpd)関連
  10. 9. まとめ:設定の意味が分かると、SELinux は「運用を助ける」

結論:SELinux は「追加のルール」であり、設定の本体は2つだけ

SELinux の運用で本質的にやることは、実は次の2つです。

  1. SELinux をどのモードで動かすかを決める(Enforcing/Permissive/Disabled)
  2. ファイルやサービスに “意味のあるラベル(type)” を正しく付ける(コンテキスト管理)

これに加えて、必要に応じて:

  • Boolean(機能スイッチ)
  • ポート type(非標準ポートを許可する)
  • カスタムポリシー(最終手段)

を使います。



1. SELinux モード設定の意味(getenforce / setenforce / 「/etc/selinux/config」)

1-1. getenforce(今どう動いているかを確認)

コマンド

getenforce

出力例

  • Enforcing:強制(違反は拒否)
  • Permissive:許可するがログは出す(検証向き)
  • Disabled:SELinux が動いていない

意味

  • Enforcing:本番運用の基本。拒否が発生してもログで追える
  • Permissive:切り分け・移行の段階で有用。動くが問題点が可視化される
  • DisabledSELinux の価値が消える(推奨しない)
1-1. getenforce(今どう動いているかを確認)



1-2. setenforce(実行中に一時的に切り替える)

コマンド

setenforce 0   # Permissive
setenforce 1   # Enforcing

意味

  • これは 一時変更です(再起動で元に戻る場合があります)
  • 本番では「一時的に Permissive にして挙動を観察」などで使います
1-2. setenforce(実行中に一時的に切り替える)



1-3. /etc/selinux/config(永続的なモード設定)

ファイル

cat /etc/selinux/config

典型例

SELINUX=enforcing
SELINUXTYPE=targeted

項目の意味

  • SELINUX=
    • enforcing:永続的に強制
    • permissive:永続的に許可+ログ
    • disabled:無効(推奨しない)
  • SELINUXTYPE=
    • targeted:一般的(主にネットワークサービスを保護)
    • mls:特殊用途(多層セキュリティ)

運用の推奨

  • 通常は SELINUX=enforcingSELINUXTYPE=targeted
1-3. /etc/selinux/config(永続的なモード設定)




2. 「コンテキスト(ラベル)」設定の意味(ls -Z / ps -eZ)

SELinux は「プロセス」と「ファイル」に付くラベル(コンテキスト)を見て、アクセス可否を判断します。

2-1. ファイルのコンテキスト確認:ls -Z

コマンド

ls -Z /var/www/html/index.html

出力例

unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html

各フィールドの意味(重要なのは type)

  • user:SELinux ユーザ(通常は深追いしない)例:unconfined_u
  • role:ロール(通常は深追いしない)例:object_r
  • type最重要 例:httpd_sys_content_t
  • level:MLS/カテゴリ(通常は深追いしない)例:s0

運用で最重要なのは type です。
“どの用途のファイルか” を表します。

2-1. ファイルのコンテキスト確認:ls -Z



2-2. プロセスのコンテキスト確認:ps -eZ

コマンド

ps -eZ | grep httpd

出力例

system_u:system_r:httpd_t:s0       5299 ?        00:00:00 httpd

意味

  • httpd_t:Apache プロセスの type
    → Apache は httpd_t として動くと理解する
2-2. プロセスのコンテキスト確認:ps -eZ




3. 「設定の正解」= restorecon と semanage fcontext の意味

3-1. restorecon(あるべきラベルに戻す)

コマンド

restorecon -Rv /var/www/html

意味

  • ファイルパスに対して定義されている “標準ラベル” に戻す
  • 例:/var/www/html は httpd_sys_content_t が標準

いつ使うか

  • 誤って chcon した
  • コピー/移動でラベルが崩れた
  • “とりあえず正しい状態に戻す” とき
3-1. restorecon(あるべきラベルに戻す)



3-2. semanage fcontext(そのパスはこういう用途だ、と永続定義する)

コマンド(例:独自パスを Web 公開)

semanage fcontext -a -t httpd_sys_content_t "/opt/webapps(/.*)?"
restorecon -Rv /opt/webapps

意味

  • /opt/webapps というパスは “Web コンテンツ用途” として扱う、と登録
  • restorecon で実ファイルへ反映

なぜ semanage が必要か

  • restorecon は「定義に戻す」だけ
  • 定義(ルール)がなければ戻しようがない
    → 定義を追加するのが semanage fcontext
3-2. semanage fcontext(そのパスはこういう用途だ、と永続定義する)



3-3. chcon(危険:一時変更)

コマンド例

chcon -t tmp_t /var/www/index.html

意味

  • その場では直るが、永続定義ではない
  • restorecon を実行すると戻る(意図しない巻き戻りが起きる)

運用の原則:
永続化は semanage fcontext、反映は restorecon

3-3. chcon(危険:一時変更)




4. Boolean の意味(setsebool / getsebool)

Boolean は「機能スイッチ」です。
ポリシーを改変せずに、許可範囲を切り替えるために使います。

4-1. 例:Apache から DB へ TCP 接続したい(httpd_can_network_connect)

設定

getsebool -a
setsebool -P httpd_can_network_connect on

確認

getsebool httpd_can_network_connect

想定出力

httpd_can_network_connect --> on

意味

  • httpd_t(Apache)がネットワーク接続してよい、という既存ルール群を有効化

効果(運用上の重要点)

  • “DB に接続できるようにする” というより
    “Apache の外向き通信を許可する” ため、適用範囲を理解して使う
4-1. 例:Apache から DB へ TCP 接続したい(httpd_can_network_connect)




5. ポート設定の意味(semanage port)

DB や Web が「非標準ポート」で動くと、SELinux が拒否することがあります。
その場合は “ポートに type を割り当てる” 必要があります。

5-1. 例:MySQL を 13306 で待ち受けする

確認

semanage port -l | grep mysqld_port_t

追加(例)

semanage port -a -t mysqld_port_t -p tcp 13306

削除(例)

semanage port -d -t mysqld_port_t -p tcp 13306

意味

  • 13306/tcp を “MySQL のポート用途” として許可する

重要:
firewalld の許可とは別物です。
Firewall は通っても SELinux で拒否されることがあります。

5-1. 例:MySQL を 13306 で待ち受けする




6. DAC(rwx)と SELinux の関係を “設定として” 理解する

6-1. DAC が OK でも SELinux が NG なら動かない

例:権限は読めるがラベルが default_t の場合

ls -lZ /opt/webapps/index.html
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 index.html

Apache から読むと拒否 → AVC が出る、という典型

AVCとは
アクセスを許可する/許可しないといった SELinux の決定は、キャッシュされます。このキャッシュは、AVC (アクセスベクターキャッシュ) と呼ばれます。SELinux がアクセスを拒否すると、拒否メッセージはログに記録されます。

<例>
rsyslogd、auditd が稼働していると
 /var/log/messages
 /var/log/audit/audit.log
に拒否メッセージのログが記録されます。

6-1. DAC が OK でも SELinux が NG なら動かない



6-2. SELinux が OK でも DAC が NG なら動かない

例:ラベルは正しいが other に read がない

-rw------- root root index.html
httpd_sys_content_t

Apache は apache ユーザーで動くため、DAC で拒否されます。
この場合、AVC は出ないことが多いです(DAC の時点で落ちるため)。

DAC(Discretionary Access Control:任意アクセス制御)は、Linuxの伝統的な権限管理方式です。ファイルやディレクトリの所有者(オーナー)が、ユーザーやグループに対して「読み取り・書き込み・実行」権限を自由に設定できる仕組みです。
ls -l コマンドで表示される rwxrwxrwx などのパーミッション管理のこと。

6-2. SELinux が OK でも DAC が NG なら動かない




7. トラブルシュート(“どの設定”を見ればよいか)

7-1. まずは SELinux が有効か
getenforce
7-1. まずは SELinux が有効か



7-2. AVC が出ているか(原因の一次情報)
ausearch -m AVC -ts recent
7-2. AVC が出ているか(原因の一次情報)



7-3. 対象のラベルを確認
ls -Z <ファイル>
ps -eZ | grep <プロセス>
7-3. 対象のラベルを確認



7-4. “正しいラベル” に戻す/定義する

既存の標準パスなら:

restorecon -Rv <パス>
7-4. “正しいラベル” に戻す/定義する1
既存の標準パスなら:



独自パスなら:

semanage fcontext -a -t <適切なtype> "<パス正規表現>"
restorecon -Rv <パス>
7-4. “正しいラベル” に戻す/定義する2
独自パスなら:




8. よく使う type(意味が分かると運用が楽になる)

typeの一覧

seinfo -t
8. よく使う type(意味が分かると運用が楽になる)


Apache(httpd)関連
type意味
httpd_tApache プロセス
httpd_sys_content_t静的コンテンツ(読むだけ)
httpd_sys_rw_content_t書き込みが必要な領域(アップロードなど)
httpd_log_tログ領域
httpd_config_t設定ファイル領域

読ませたい” のか “書かせたい” のかで type が変わります。
同じ Web 配下でも用途で分けるのが正解です




9. まとめ:設定の意味が分かると、SELinux は「運用を助ける」

  • モード:enforcing/permissive/disabled は “運用方針”
  • コンテキスト:type は “用途ラベル”
  • semanage fcontext:用途定義(永続)
  • restorecon:定義へ復元(反映)
  • Boolean:機能スイッチ(最小の変更)
  • port:非標準ポートの正当化
  • DAC:従来権限(SELinux の前段)

SELinux の運用は allow を書くことではありません。
正しい意味(type)に合わせることです。

コメント

タイトルとURLをコピーしました