問題点
ScientificLinux6(RedHat系Linux)で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/enforceechoで/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://www.atmarkit.co.jp/fsecurity/special/97rhel/rhel01.html