hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

「SELinux policy enabled」でApacheが起動しない

CentOSApache+Passenger環境を作って、いつも通りApacheを起動しようとしたら、「SELinux policy enabledd」で起動が失敗するケースがありました。
その時の備忘録として書いておきます。

Apacheの起動が失敗する

いつも通りApacheを起動しようとしたら、何故か失敗しました。

# /etc/init.d/httpd start
httpd を起動中:                                            [失敗]

error_logを確認

「/var/log/httpd/error_log」を確認してみると、「SELinux policy enabled; httpd running as context user_u:system_r:httpd_t:s0」というようなエラーが出ていました。

[Wed Jan 26 23:23:45 2011] [notice] SELinux policy enabled; httpd running as context user_u:system_r:httpd_t:s0
[Wed Jan 26 23:23:45 2011] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)

SELinuxの設定を変更

Phusion Passenger をインストール - ~fumi ChangeLog を見てみると「SElinux が悪いらしい」と書かれているので、SElinuxの設定を変更してみます。

permissiveモードとenforcingモード

SElinux」には「permissiveモード」と「enforcingモード」という2つのモードがあります。

モード 説明
enforcing SELinuxが有効な状態
permissive SELinuxが無効な状態

[セキュアOS SELinux入門]第5回 設定に関する基礎知識をマスターする - オープンソース:ITpro によると、

enforcingは,通常運用時のSELinuxのモード,つまり,「SELinuxによるアクセス制御が有効になった状態」のモードである。
このモードではアクセス制御が働くため,きちんと設定されていないアプリケーションは動作しない。
アプリケーションを起動しようとしても,アクセスが拒否されたことがログに記録されるだけで,何も起こらないわけだ。

一方,permissiveは,(例え設定が不十分であっても)一切アクセス拒否されずに,言い換えれば通常のLinuxと同じようにアプリケーションは動作する。
ただし,本来はアクセスが拒否されるべきであり,その事実はログに記録される。
つまり,アクセスが拒否されたことはログに記録されるが,アプリケーションは普通に動作する。

[セキュアOS SELinux入門]第5回 設定に関する基礎知識をマスターする - オープンソース:ITpro

ということです。

「enforcingモード」になっている場合、SELinuxでのアクセス制御が働いて、今回のようにApacheが起動しないようなケースがあるみたいです。
「enforcingモード」でも正常に動作させるようにするのが良いと思いますが、とりあえず今回は内部で使用するサーバーなので、「permissiveモード」への切り替えで対応してみます。

SELinuxのモードの確認

「permissiveモード」か「enforcingモード」かを確認するのには「getenforce」コマンドを使用します。
「getenforce」は、rootにならないと使用できません。

# getenforce
Enforcing
SELinuxのモード切り替え

「permissiveモード」と「enforcingモード」のモード切り替えには「setenforce」コマンドを使用します。
「setenforce」も、rootにならないと使用できません。

モード別の切り替えのコマンドは以下のとおりになります。

モード コマンド
enforcingへの切り替え setenforce 1
permissiveへの切り替え setenforce 0

今回は「permissiveモード」への切り替えなので、「setenforce 0」を実行します。

「permissiveモード」への切り替え

# setenforce 0
# getenforce
Permissive

Apacheを再度起動してみる

「SELinux」のモード切り替えが完了したので、もう一度Apacheの起動をしてみると、今度はApacheが起動できました。

# /etc/init.d/httpd start
httpd を起動中:                                            [  OK  ]

念の為「/var/log/httpd/error_log」を確認してみると、相変わらず「SELinux policy enabled」は発生していますが、Apacheの起動まで出来ているのが分かります。

[Wed Jan 26 23:41:12 2011] [notice] SELinux policy enabled; httpd running as context user_u:system_r:httpd_t
[Wed Jan 26 23:41:12 2011] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Wed Jan 26 23:41:12 2011] [notice] Digest: generating secret for digest authentication ...
[Wed Jan 26 23:41:12 2011] [notice] Digest: done
[Wed Jan 26 23:41:12 2011] [notice] mod_python: Creating 4 session mutexes based on 256 max processes and 0 max threads.
[Wed Jan 26 23:41:13 2011] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations

これを機に「SELinux」の勉強もしていきたいなーと思います。

今回参考にしたページ

[セキュアOS SELinux入門]第5回 設定に関する基礎知識をマスターする - オープンソース:ITpro
http://itpro.nikkeibp.co.jp/members/LIN/oss/20040624/146318/

Phusion Passenger をインストール - ~fumi ChangeLog
http://www.ftnk.jp/~fumi/cl/2009-05-10-2.html

1.8.6.2. 「init_master_agent Invalid local port (Permission denied) (無効なローカルポートです)(パーミッションが拒否されました)」 (error_log ファイル内)
http://webcache.googleusercontent.com/search?q=cache:2SVWZBSJOV0J:docs.redhat.com/docs/ja-JP/JBoss_Operations_Network/2.2/html/FAQ/sect-FAQs-Apache_SNMP-Invalid_local_port.html+httpd+running+as+context+user_u&cd=1&hl=ja&ct=clnk&gl=jp&lr=lang_ja