SELinux ドキュメント(4章5章)をざっと読んで気になる点をまとめました。
ドキュメントの所在
[Security Enhanced Linux]
(https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/index.html)
SELinuxって?
- Linuxのセキュリティを強化する仕組みで、カーネルに追加される
- 米国国家安全保障局 (National Security Agency) が開発した
SELinuxのセキュリティの仕組み
- プロセスとファイルの全てに、タイプでラベル付けを行う。
- タイプはプロセスのドメインを定義しており、プロセスはドメイン毎に互いに分離している。
- SELinuxポリシールールは、タイプに基づきプロセスがファイルと対話する方法とプロセス同士が対話する方法を定義する。
- プロセスは、アクセスを許可するポリシールールが定義されている場合のみ、当該ファイル又はプロセスへアクセスできる。
セキュリティチェックのフロー
- Linuxの既存のアクセス管理(DAC:任意アクセス制御)(chownやchmodで管理しているアレ)がチェックする.
- SELinuxのルールをチェックする
SELinuxの動作例
ls -Z /var/www/html
system_u:system_r:httpd_sys_conten_t:s0
httpd_sys_content_tラベルが、httpdプロセスがこのファイルにアクセスできることを表す.
rootユーザーでtouch /var/www/html/testfileとすると
親ディレクトリのラベルを引き継ぐ
ls -Z /var/www/html/testfile
unconfined_u:object_r:httpd_sys_content_t:s0
wget http://localhost/testfile # sucess
testfileのラベルを変更するとリード権限があっても、アクセスできなくなる。
chcon -t samba_share_t /var/www/html/testfile
wget http://localhost/test/file # forbidden
この場合/var/log/audit/autit.logにエラーログが記録される。
関連ファイル
ログファイル
/var/log/audit/autdit.log
拒否されたさいのログなどが記録される。
設定ファイル
SELinuxの有効無効を設定する
/etc/selinux/config
以下の設定でSELinuxの有効、無効を設定できる。
SELINUX=稼働モード
- enforcing ・・・SELinuxポリシー適用
- permissive ・・・SELinuxポリシーは適用するがアクセス拒否等はせず、ログは記録する。
- disable ・・・ 無効。ファイルへのラベル付けが無効になったり、後々色々弊害でるようなので避けたい方が良い。
ツールのインストール
自分の環境(CentOS6.5)には入っていなかったため、yumでインストールしました。
yum -y install policycoreutils-python
SELinuxの状態設定
状態確認
getenforce
enforcing, permissive, disableのいずれかがかえる
状態表示
sestatus
SELinuxのステータスを表示する
一時的にenforingとpermissiveを切り替える
setenforce 1 # enforingにする
setenforce 0 # permissiveにする
設定項目の一覧表示
semanage boolean -l
各設定項目のon/offを確認でき、設定項目の説明も表示される。
getsebool -a
ブール値の一覧表示。(ただし説明は表示されない)
項目の設定
setsebool boolean-name x
指定した項目のブール値を変更する。
ラベルの確認の仕方
プロセスの場合
ps -Z
プロセスは実行されると、シェルのドメインからプロセスのドメインに移行します。(例ではpasswdならpasswd_tドメインへ)
ファイルの場合
ls -Z
ラベル付けのルール
※ 重要
ファイルやディレクトリーは移動よりコピーした方が、正しいラベリング付けが確保される。
ファイルを新規作成した場合
- ディレクトリを新規作成すると、その親ディレクトリのラベルを引き継ぐ
ファイルをコピーした場合
- ファイルをcpでオプション指定なしでコピーすると、コピー先のデフォルトのラベリングルールに従って、ラベリングされる。(デフォルトでは、コピー先のラベルが設定される) ただし既存のファイルがある場合は、そのラベリングを引き継ぐ
- ラベルを保持してコピーする場合は、cp --preserve=contextオプションを利用する
ファイルを移動した場合
- 移動すると、移動元のファイル・ディレクトリは現在のラベルを維持する。
ラベルの変更の仕方
一時的な変更
chcon -t type file-name # -Rを付与で再帰的に適用可能
ファイルシステムの再ラベル付けやrestoreconにより元に戻る。
永続的な変更
semanage fcontext -a options file-name|dir-name # file_contextのラベルを変更する
restorecon -v file-name | dir-name # 変更を適用する
ファイルのラベルを変更をすると、/etc/selinux/targeted/contexts/files/file_context、またはfile_context.localに記録される。ファイルシステムの再ラベリングに利用するsefilesとSELinuxコンテキストを復元するrestoreconはこれらのファイルを読み込む。
おまけ(注意する点)
- SELinuxをdisableにしてしまうと、ラベル付けすら行われなくなるので、利用しない場合permissiveにした方がよい。
- ファイルにアクセスできない場合は、一時的にpermissiveにしてDAC(chownやchmodで管理しているアクセス権)に問題無いことを確認する。
- ログファイルにて、SELinuxにより問題があるかを確認する。
- SELinuxで管理されているファイルはmvよりもcpした方が良い(コピー先のルールに自動的に変更されるため)。(とあるが・・・mvしたい場合も多々あるんですが)