funini.com 自由研究 SELinux

SELinux

いつかは避けて通れない道…

CentOS 4.6

CentOS 4.6でXoops2.0にモジュール(piCalとかsysutil)を入れようとしたら、こんなエラーが出て、モジュールが表示されない。 こんな
Warning [PHP]: is_dir(): Stat failed for /var/www/html/xoops_new/modules/sysutil (errno=13 - Permission denied) in file modules/system/admin/modulesadmin/modulesadmin.php line 116
あれ? パーミッションの設定なんていらないはずだけど? と思って、一応ソースを調べてみる。
if ( ... && is_dir($modules_dir.'/'.$file)) {
このis_dir()が失敗しているのだが、パーミッション・オーナーとも問題があるようには見えない。 それに、ユーザー権限でis_dir()を実行してもちゃんとtrueが返る。
ふと思ってdmesgを見てみると、こんなエラーが出てる。
audit(...): avc: denied  { read } for  pid=... comm="httpd" name="xoops_version.php" dev=dm-0 ino=1836129 scontext=root:system_r:httpd_t tcontext=root:object_r:user_home_t tclass=file
これはひょっとしてSELinux...? と思ったら正解でした。
ITmediaの記事とか、 YANO's digital garageさんあたりを参考にして設定しました。

まずはSELinuxのポリシーを設定するためのファイル群をインストールする必要があります。 ( /etc/selinux/targeted/src がある場合は不要です) これはyumで簡単に入れることが出来ます。
# yum install selinux-policy-targeted-sources
こうして、設定を行う準備ができました。
次に、実際に拒否られたログを解析して、ポリシーを追加してみます。
# audit2allow -d -l
とすると、ログを見て追加すべきポリシーを表示してくれます。 例えば今回はこんな感じになりました。
allow httpd_t user_home_t:dir { getattr search };
これを、 addRules.teとして保存して、make reloadで反映させます。
# cd /etc/selinux/targeted/src/policy
# audit2allow -d -o ./domains/addRules.te
# make reload
エラーが起こるたびにこの作業を繰り返しましょう。
(実際にアタックされたログは追加しないように注意しましょう)