ApacheとSELinuxでいろいろ詰まった話
背景
Apache + PHP環境を検証環境からステージング環境に移行したら、ページが表示できなくなった。
現象
- index.phpにアクセスしようとすると505が帰ってくる。
- error_logを確認すると以下のエラーが
PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'The stream or file "[ホニャララ]" could not be opened: failed to open stream: Permission denied'
対処
PHPモジュール周りを確認した
検証環境に入っていたPHPモジュールを一通りインストールしてみたがダメだった。
パーミッション周りを確認した
確認したが問題なさそう。念のため、パーミッションを777に変更したり所有者をapacheにしてみたりしたがだめ。
SELinux周りを確認した
一旦SELinuxをPermissiveにしてみると、正常に表示されたのでこれが原因と判明。
ずっとPermissiveにしておくのもまずいので、SELinuxのことをいろいろ調べた。
audit.logを確認したところ、PHPからログを書き込もうとしたところで蹴られていることがわかった。
CGIでファイルを変更できるようにするにはsystem_u:object_r:httpd_sys_script_exec_t:s0
というラベルが必要らしい。
$ sudo chcon -R system_u:object_r:httpd_sys_script_exec_t:s0 [対象ディレクトリ]
SELinuxをEnforcingに戻しても正常に表示できることを確認した。
まとめ
数年前に同じ原因でつまった覚えがかすかにあったので解決することが出来た。検証環境について全く知らなかったのも原因を特定するのに時間がかかってしまった原因かもしれない。