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
エラーが起こるたびにこの作業を繰り返しましょう。
(実際にアタックされたログは追加しないように注意しましょう)