SELinuxの設定

投稿者: | 2016年11月2日

SELinuxとはSecurity-Enhanced Linuxの略で、Linux用のセキュリティ拡張機能です。
セキュリティを高めるために、Linuxカーネル2.6からSELinuxが組み込まれました。

SELinuxの最大の特徴は、管理者idの特権を無くし、アクセスに対して厳格に対処するようになっていることです。
また、セキュリティを確保するために初期状態では必要最低限のアクセス権しか提供されません。
それにより、(開発者が)必要だと判断するアクセスでも拒否されてしまうことがあります。
そのため、SELinuxをOFFにして使用している現場もあります。

(外部に公開していない開発環境や本番環境でもWAFIPSなどでセキュリティを確保している場合は、また違うと思いますが)基本的にSELinuxは有効にして運用したほうが良いと思います。

今日は、SELinuxの設定について簡単にまとめたいと思います。
なお、SELinuxの設定は結構手間なので、初めから予定に組み込んで作業することをお勧めします。

audit.logを元に許可ルールを作成する

手動で設定すると大変なので、拒否されたログを元に許可ルールを作成します。
なお、audit2allowが無い場合は導入します。

yum install policycoreutils-python (CentOSの場合)

audit.logから該当部分を別ファイルに書き出す

例)下記内容で「/tmp/audit.txt」を作成
type=AVC msg=audit(1477008150.053:419): avc: denied { write } for pid=2291 comm=”httpd” name=”templates_c” dev=”sda3″ ino=134827621 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_sys_content_t:s0 tclass=dir

許可ルールを作成する

audit2allow -M smarty < /tmp/audit.txt

(定義名「smarty」で作成)

******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i smarty.pp

カレントにsmarty.te(モジュール)、smaty.pp(パッケージ)が作成される

メッセージ通りにポリシーパッケージを適用する

semodule -i smarty.pp

動作を確認する

だめだった場合、「.te」ファイルを修正し、コンパイル・再適用する

ダメだったら、audit.logで拒否された動作を確認する

例)ちなみに一つずつチェック(エラーになる)されるため、地道な作業になります

type=AVC msg=audit(1477010021.780:456): avc: denied { setattr } for pid=2292 comm=”httpd” name=”bcffff1e95fc3fad8581b3f9d7cbdd6732667cca_0.file.hp.tpl.php” dev=”sda3″ ino=135018166 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=file
※斜体の部分がチェックする場所です

ポリシーモジュールの確認

cat smarty.te

module smarty 1.0;

require {
type httpd_t;
type httpd_sys_content_t;
class dir write;
}

#============= httpd_t ==============

#!!!! This avc can be allowed using the boolean “httpd_unified”
allow httpd_t httpd_sys_content_t:dir write;

許可したい動作を追記する

例)下記は設定例ですので上記以外の拒否動作も追記しています

cat smarty.te

module smarty 1.0;

require {
type httpd_t;
type httpd_sys_content_t;
class dir { write add_name create remove_name };
class file { create write rename setattr };
}

#============= httpd_t ==============

#!!!! This avc can be allowed using the boolean “httpd_unified”
allow httpd_t httpd_sys_content_t:dir { write add_name create remove_name };
allow httpd_t httpd_sys_content_t:file { create write rename setattr };

追加したモジュールのソースをコンパイルする

checkmodule -M -m -o smarty.mod smarty.te

checkmodule: loading policy configuration from smarty.te
checkmodule: policy configuration loaded
checkmodule: writing binary representation (version 17) to smarty.mod

ポリシーパッケージを作成する

semodule_package -o smarty.pp -m smarty.mod

適用する

semodule -i smarty.pp

※再適用は、削除(semodule -r smarty)した後に適用(semodule -i smarty)するか、適用(semodule -i smarty)した後にリロード(semodule -R)する

最後に

SELinuxはあくまでファイルなどのリソースへのアクセス権限を管理する仕組みなのでDDoS攻撃などシステムに付加を与えるようなものには効果がありません。
別途mod_dosdefectorなどの機能を追加して、対策する必要があります。