ApacheのDocumentRootを変更すると、Apacheが起動しない。

問題点

ScientificLinux6(RedHatLinux)でApacheのDocumentRootを、例えば/home/hoge/www/htmlなどと指定して、/etc/init.d/httpd startとすると。
Syntax error on line 292 of /etc/httpd/conf/httpd.conf:DocumentRoot must be a directory
とエラーを返されてしまう。

すぐに想像される原因はファイルのパーミッションと所有権である。chmod 777,chown hoge:hogeをしてパーミッションの変更、所有権をhttpd.confで指定しているユーザに統一したが、それでも同じエラーがかえってくる。


原因

原因は予想もつかないところで、SELinux(Security-Enhanced Linux)だった。
SELinuxは米NSAが開発したLinuxカーネル拡張機能で、不正侵入の際に被害を極力少なくすることを目的としている。
動作としては、それぞれのプロセスがアクセスできるファイルを制限している。つまりWebサーバーのプロセスは、Webページのファイルのみアクセス可能で、他のファイルにはアクセス出来ない。



乱暴な対策

SELinuxが邪魔をしているのであれば、これを切ってしまえばいい。
echo 0 > /selinux/enforce
echoで/selinux/enforceを"0"にすると、SELinuxを停止できる。この状態でApacheを起動、localhostでアクセスしてみると、見事!DocumentRootで指定したindex.htmlが表示された。
ちなみに同じくechoで"1"を書きこめば、SELinuxを再起動できる。


根本的な対策

不正侵入の被害を減らしてくれる便利な拡張機能なのに、これを切ってしまうのは本末転倒。ということで根本的な対策を行う。
SELinuxは各ディレクトリにタイプラベルというものをつけて管理している。まずは、デフォルトでDocumentRootに割り当てられている/var/wwwのタイプラベルを確認してみる。
ルートディレクトリに移動して、ls -laZしてみる。
# ls -laZ<<<省略>>>
drw-rw-r--. root root system_u:object_r:httpd_sys_content_t:s0 www<<<省略>>>


ちなみにセキュリティコンテキストは以下のとおり

user_u object_r hogehoge_t c0-c0.c255
ユーザ識別子 ロール識別子 タイプ識別子 MLS識別子

/var/wwwに適用されているセキュリティコンテキストを設定する

semanage fcontext -a -t system_u:object_r:httpd_sys_content_t:s0 /home/hoge/www/html

以上で設定は終わり。


参考にしたサイト
http://wiki.nezweb.net/index.php?Apache%A4%CEDocumentRoot%A4%F2%CA%D1%B9%B9%A4%B9%A4%EB%A4%C8%A5%A2%A5%AF%A5%BB%A5%B9%A4%C7%A4%AD%A4%CA%A4%A4#y356ed12

http://www.atmarkit.co.jp/fsecurity/special/97rhel/rhel01.html