Apache で見えるファイル見えないファイルがあってハマった

CentOSApache で web サーバをたててある。

元々いくつかの文書を公開していたが、新たにユーザ user01 が作ったファイルを追加で公開することになった。

user01 のホームディレクトリから mv コマンドで公開用ディレクトリにファイルを移動した。

apache のプロセスから見えるようにと全てのユーザ対してに read の権限を付けた。 chmod a+r コマンドで。権限を揃えたから大丈夫できあがり。

と思ってたら全然ダメだった。

# LANG=C ls -l
total 48
-rw-r--r--. 1 user01 user01 10240 Jan  2  2013 data01.txt
-rw-r--r--. 1 user01 user01 10240 Jan  2  2013 data02.txt
-rw-r--r--. 1 user01 user01 10240 Jan  2  2013 data03.txt
-rw-r--r--. 1 user01 user01 10240 Oct 10 05:06 data04.txt

ls の結果。data04.txt が今回追加したファイル。他のファイルと権限は同じ。なのに。なのに。ブラウザから参照すると Permission denied と表示される。data01.txt ~ data03.txt は全て表示されているのに。

なにがおかしいのだろう。

そうだ! SELinux だ。この機械は SELinux が有効になってる。もしや!とおもってファイルのフラグを見てみたら。

# ls -lZ
-rw-r--r--. user01 user01 unconfined_u:object_r:httpd_sys_content_t:s0 data01.txt
-rw-r--r--. user01 user01 unconfined_u:object_r:httpd_sys_content_t:s0 data02.txt
-rw-r--r--. user01 user01 unconfined_u:object_r:httpd_sys_content_t:s0 data03.txt
-rw-r--r--. user01 user01 unconfined_u:object_r:user_home_t:s0 data04.txt

今回持ってきたファイルだけ属性が違います。なるほどコレで引っかかっているのか。

ユーザー、ロール、タイプ、レベル とコロン区切りで並んでいる。今回の場合だと、ユーザー[unconfined_u]、ロール[object_r]、タイプ[httpd_sys_content_t]、レベル[s0] ということになる。

だけど今回移動してきたファイル data04.txt はタイプが user_home_t なので apache のプロセスからアクセスすることができない。Permission の不備で勝手に公開されて大騒ぎにならないような仕組みではあるわけだ。

今回このファイルを公開したいので、ではタイプを変えてしまいましょう。Apache (httpd) がアクセスできるタイプにしましょう。

# chcon -t httpd_sys_content_t data04.txt
  
# ls -lZ
-rw-r--r--. user01 user01 unconfined_u:object_r:httpd_sys_content_t:s0 data01.txt
-rw-r--r--. user01 user01 unconfined_u:object_r:httpd_sys_content_t:s0 data02.txt
-rw-r--r--. user01 user01 unconfined_u:object_r:httpd_sys_content_t:s0 data03.txt
-rw-r--r--. user01 user01 unconfined_u:object_r:httpd_sys_content_t:s0 data04.txt

他のファイルと揃いました。

ブラウザで表示したらなんの問題も無く他のファイルと同様にアクセスできるようになりました。

SELinux 忘れがちですけどこうやってアクセス制御をしてくれているのですね。