〜何を設定しているのか/なぜ必要なのか/何が変わるのか〜
今回は、SELinux を 運用で使えるレベルまで理解するために、
「設定している内容」そのものを 1つずつ分解して、意味・目的・影響・確認方法を解説します。
- 結論:SELinux は「追加のルール」であり、設定の本体は2つだけ
- 1. SELinux モード設定の意味(getenforce / setenforce / 「/etc/selinux/config」)
結論:SELinux は「追加のルール」であり、設定の本体は2つだけ
SELinux の運用で本質的にやることは、実は次の2つです。
- SELinux をどのモードで動かすかを決める(Enforcing/Permissive/Disabled)
- ファイルやサービスに “意味のあるラベル(type)” を正しく付ける(コンテキスト管理)
これに加えて、必要に応じて:
- Boolean(機能スイッチ)
- ポート type(非標準ポートを許可する)
- カスタムポリシー(最終手段)
を使います。
1. SELinux モード設定の意味(getenforce / setenforce / 「/etc/selinux/config」)
1-1. getenforce(今どう動いているかを確認)
コマンド
getenforce
出力例
Enforcing:強制(違反は拒否)Permissive:許可するがログは出す(検証向き)Disabled:SELinux が動いていない
意味
Enforcing:本番運用の基本。拒否が発生してもログで追えるPermissive:切り分け・移行の段階で有用。動くが問題点が可視化されるDisabled:SELinux の価値が消える(推奨しない)

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

1-3. /etc/selinux/config(永続的なモード設定)
ファイル
cat /etc/selinux/config
典型例
SELINUX=enforcing
SELINUXTYPE=targeted
項目の意味
SELINUX=enforcing:永続的に強制permissive:永続的に許可+ログdisabled:無効(推奨しない)
SELINUXTYPE=targeted:一般的(主にネットワークサービスを保護)mls:特殊用途(多層セキュリティ)
運用の推奨
- 通常は
SELINUX=enforcing,SELINUXTYPE=targeted

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_urole:ロール(通常は深追いしない)例:object_rtype:最重要 例:httpd_sys_content_tlevel:MLS/カテゴリ(通常は深追いしない)例:s0
運用で最重要なのは type です。
“どの用途のファイルか” を表します。

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 として動くと理解する

3. 「設定の正解」= restorecon と semanage fcontext の意味
3-1. restorecon(あるべきラベルに戻す)
コマンド
restorecon -Rv /var/www/html
意味
- ファイルパスに対して定義されている “標準ラベル” に戻す
- 例:
/var/www/htmlはhttpd_sys_content_tが標準
いつ使うか
- 誤って
chconした - コピー/移動でラベルが崩れた
- “とりあえず正しい状態に戻す” とき

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-3. chcon(危険:一時変更)
コマンド例
chcon -t tmp_t /var/www/index.html
意味
- その場では直るが、永続定義ではない
restoreconを実行すると戻る(意図しない巻き戻りが起きる)
運用の原則:
永続化は semanage fcontext、反映は restorecon

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 の外向き通信を許可する” ため、適用範囲を理解して使う

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 で拒否されることがあります。

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-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 などのパーミッション管理のこと。

7. トラブルシュート(“どの設定”を見ればよいか)
7-1. まずは SELinux が有効か
getenforce

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

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

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

独自パスなら:
semanage fcontext -a -t <適切なtype> "<パス正規表現>"
restorecon -Rv <パス>

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

Apache(httpd)関連
| type | 意味 |
|---|---|
| httpd_t | Apache プロセス |
| 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)に合わせることです。

コメント