こんにちは、鯨井貴博@opensourcetechです。
今回はCentOS6.6(64ビット)上のApache(httpd)を使用して、
SELinuxのトラブルシュートを行おうと思います。
OS情報は、/etc/redhat-releaseやunameコマンドで確認出来ます。

SELinuxのポリシーにわざと引っかかるように、
/etc/httpd/conf/httpd.confにて
Apacheのドキュメントルートをデフォルトの「/var/www/html」から
「/home/apache/html」に変更します。

そして、そのドキュメントルートとなるディレクトリや
コンテンツファイル(index.html)を作成します。

その後、Apache(httpd)を起動。
service httpd start
ServerNameディレクティブが設定されていない事を示すメッセージが出ますが、
気にせずいきます。

iptables(FW)についても「iptables -F」で無効化しておきます。

さて、この状態でクライアントよりApacheにアクセスします。
すると以下のようにパーミッションの問題でアクセス出来ず、
「Forbidden」となりHTTPステータスコード403が返されます。

tail -f /var/log/httpd/access.logでアクセスログを確認すると、
以下のように403が出力されております。

tail -f /var/log/httpd/error.logを見ると、「Permission denied」、

tail -f /var/log/audit/audit.logを見ると、以下のようにSELinuxのメッセージが出力されております。

「ls -dZ」で確認出来るSELinuxの設定などがどうも関連しているようですね。

では本題。
setroubleshootによる問題解決を行いましょう。
まずはインストールです。
yum install setroubleshoot

setroubleshootをインストール後にクライアントからアクセスをすると、
/var/log/messageにどうすればSELinuxでの対応が出来るかというヒント(sealert)が出力されるようになります。

続いて上記メッセージにあるsealertコマンドを実行すると、
具体的に実行するべきコマンドが示されます。
sealert -l ID

日本語がおかしい場合は、
LANG=C sealert -l IDとすれば英語表記に変更出来ます。

そのメッセージに従ってコマンドを実行します。
以下の例では、/var/log/audit/audit/logの内容から、
audit2allowを使用してアクセスを許可する為のモジュールパッケージ(mypol.pp)を生成し、semoduleコマンドでそれを適用します。

再びクライアントからアクセスしてみても、まだアクセスはできませんので、
またsetroubleshootによるトラブルシュートを繰り返します。


その後、クライアントからアクセスすると無事にコンテンツファイル(index.html)の内容が表示されました。

ちなみに、今回行った操作ではモジュールパッケージ(mypol.pp)は
カレントディレクトリひ出力されます。

また、sestatusコマンドでSELinuxのステータス、
sestatus -bでブーリアン(ブール)を含めたステータスが確認出来ます。








これで、
「setenforce 0」や
/etc/sysconfig/selinuxにてSELINUX=disabled/permissiveにせず、
より安全なサーバ構築が出来そうですね。