Linux の使い方: apache の標準と異なるパスへエラーログを記録できない (CentOS 5.4)


標準と異なるパスへエラーログを出力できない

CentOS 5.4 上で稼働している Apache 2.2.3 で、例えば "/home/log/error.log" などの標準とは異なる場所をエラーログの記録先にした場合、次のエラーが発生して Apache を起動できなくなる場合がありました。

(13)Permission denied: httpd: could not open error log file /home/log/error.log.

Unable to open logs

これは SELinux というセキュリティーポリシーによってアクセス制御がされているために発生するもののようでした。

 

SELinux を設定するためには、"setenforce 0" を実行して SELinux を Permissive モードで起動した上で、httpd を起動させます。

すると、SELinux の影響で起動できなくなっている場合には正しく動作するようになるので、まずは次のようにして httpd がどの SELinux ドメインで実行されているかを確認します。

ps -eZ | grep httpd

これで、出力結果の ":" で区切られた 3 番目の内容から、Apache (httpd) が "httpd_t" ドメイン内で動作していることが分かります。

後はこのドメインに対して適切な許可を追加することになります。

 

試してみた感じでは、以下の許可設定を追加すれば大丈夫なようでした。

もしかすると、新しいパスにログファイルが作成されていないために、それを新規作成しようとして発生したエラーなのかもしれません。

allow httpd_t amanda_port_t:tcp_socket name_bind;
allow httpd_t cert_t:file execute;
allow httpd_t file_t:dir { search getattr };
allow httpd_t file_t:file { create append };
allow httpd_t httpd_config_t:file execute;
allow httpd_t port_t:tcp_socket name_bind;
allow httpd_t reserved_port_t:tcp_socket name_bind;
allow httpd_t soundd_port_t:tcp_socket name_bind;
allow httpd_t transproxy_port_t:tcp_socket name_bind;
allow httpd_t user_home_t:dir getattr;
allow httpd_t user_home_t:file { read getattr };

ただ、それぞれのパスの中での関係ファイルの取り扱いについて、SELinux の許可設定を行う必要があるようですので、設定ファイル内のパスに応じても上記内容は変わってくるかもしれません。

なお、SELinux の設定方法については Linux のセキュリティ設定 (SELinux) の方に記してありますので、そちらを参考にしてください。