こんにちは、鯨井貴博@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にせず、
より安全なサーバ構築が出来そうですね。