はじめに
SELinux には主に 3 つの状態があります。
- Enforcing: ポリシーを強制適用する
- Permissive: アクセス拒否はせず、ログだけ記録する
- Disabled: SELinux 自体を無効化する
まずは現在の状態を確認します。
getenforce
sestatus
SELinux を Disabled にする方法
SELinux を完全に無効化する方法です。
方法は 設定ファイル変更 と カーネルパラメータ変更 の 2 つがあります。
1. 設定ファイル変更で Disabled にする
grep SELINUX /etc/selinux/config
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
grep SELINUX /etc/selinux/config
reboot
getenforce
期待値
Disabled
2. カーネルパラメータで Disabled にする
getenforce
grubby --update-kernel ALL --args selinux=0
reboot
getenforce
期待値
Disabled
SELinux を Permissive にする方法
SELinux を無効化せず、拒否せずにログだけ記録するモードにする方法です。
切り分けやデバッグでは、Disabled より Permissive のほうが使いやすいことが多いです。
1. 一時的に Permissive にする
再起動すると元に戻ります。
setenforce 0
getenforce
期待値
Permissive
Enforcing に戻す場合:
setenforce 1
getenforce
2. 設定ファイル変更で Permissive にする
永続的に Permissive にしたい場合です。
grep SELINUX /etc/selinux/config
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
grep SELINUX /etc/selinux/config
reboot
getenforce
期待値
Permissive
3. カーネルパラメータで Permissive にする
起動時から Permissive にしたい場合です。
grubby --update-kernel ALL --args enforcing=0
reboot
getenforce
期待値
Permissive
元に戻す場合:
grubby --update-kernel ALL --remove-args enforcing=0
reboot
SELinux コンテキストの確認方法
ファイルやディレクトリには SELinux コンテキストが付いています。
確認には ls -Z を使います。
ファイル・ディレクトリの確認
ls -lZ /var/www/html/
ls -ldZ /var/www/html/
例:
-rw-r--r--. 1 root root system_u:object_r:httpd_sys_content_t:s0 index.html
このうち、特に重要なのは type です。
上の例では httpd_sys_content_t が type です。
拡張属性としての確認
attr -l /var/www/html/
Attribute "selinux" has a 41 byte value for /var/www/html/
getfattr -d -m - /var/www/html/
security.selinux="system_u:object_r:httpd_sys_content_t:s0"
SELinux コンテキストの編集方法
コンテキストの編集には、主に次の 3 つを使います。
- chcon: 一時的に変更する
- semanage fcontext: 永続的なルールを定義する
- restorecon: 正しい既定値に戻す
1. 一時的に変更する: chcon
chcon -t httpd_sys_content_t /web/index.html
chcon -R -t httpd_sys_content_t /web
これは一時変更です。
restorecon を実行すると元に戻ることがあります。
2. 永続的に変更する: semanage fcontext
semanage fcontext -a -t httpd_sys_content_t '/web(/.*)?'
restorecon -R -v /web
確認:
semanage fcontext -C -l
削除:
semanage fcontext -d '/web(/.*)?'
restorecon -R -v /web
3. 正しいラベルに戻す: restorecon
restorecon -v /path/to/file
restorecon -R -v /path/to/directory
コピーや手動変更でラベルが崩れたときに使います。
SELinux コンテキストの削除
SELinux を Disabled にしたあと、ラベル自体を削除したい場合の手順です。
1. コンテキスト確認
ls -lZ /var/www/html/
attr -l /var/www/html/
2. 特定ファイル・ディレクトリのコンテキスト削除
setfattr -x security.selinux /var/www/html/
3. 再帰的に削除
find /path/to/directory -exec setfattr -x security.selinux {} \;
ただし、実運用では 削除より restorecon や semanage fcontext で正しく直すほうが一般的です。
コンテナで使う SELinux コンテキスト
コンテナでは通常の httpd_sys_content_t とは別に、コンテナ向けの type が使われます。
代表例:
container_file_tcontainer_ro_file_t
1. Podman の :z / :Z
ホストのディレクトリをコンテナにマウントするとき、ラベルを調整できます。
podman run -v /srv/data:/data:z IMAGE
podman run -v /srv/private:/data:Z IMAGE
-
:z→ 複数コンテナで共有しやすいラベル -
:Z→ そのコンテナ専用ラベル
2. 読み取り専用でマウントする
「コンテナから読み込みだけできればよい」場合は、SELinux ラベルだけでなく ro マウントも併用します。
podman run -v /srv/config:/config:ro,Z IMAGE
-
ro→ 読み取り専用マウント -
Z→ コンテナ用ラベルに調整
3. 手動でコンテナ向けラベルを付ける
chcon -Rt container_file_t /srv/container-data
永続化するなら:
semanage fcontext -a -t container_file_t '/srv/container-data(/.*)?'
restorecon -R -v /srv/container-data
読み取り専用コンテンツ向け:
semanage fcontext -a -t container_ro_file_t '/srv/container-ro(/.*)?'
restorecon -R -v /srv/container-ro
補足
SELinux モード一覧
- Enforcing: SELinux ポリシーを強制適用
- Permissive: 違反をログ記録するが許可
- Disabled: SELinux 無効
よく使う一時変更
setenforce 0 # Permissive
setenforce 1 # Enforcing
カーネルパラメータの意味
-
selinux=0→ Disabled -
enforcing=0→ Permissive