はじめに
SELinux稼働中のサーバにてApacheでパパっとファイルの公開をしようとしたらちょっと躓いた。
SELinuxはこれまで思考停止で無効化(Disabled)にしていたのでメモ。
環境
- Red Hat Enterprise Linux6.8(RHEL6)
- Apache 2.2.15
- SELinuxはOn(Enforcing)
事象
Apacheの設定はほぼほぼ初期設定のままだったので、DocmentRootも/var/www/htmlのまま。
ここに1つディレクトリ(/var/www/html/test)を掘って「http://hoge.co.jp/test 」で以下のように配置したファイル公開をしようとした。
# ll
total 28
-rw-r--r--. 1 root root 6949 Apr 2 15:21 file1.txt
-rw-r--r--. 1 root root 7127 Apr 2 15:21 file2.txt
-rw-r--r--. 1 root root 7123 Apr 2 15:19 file3.txt
普通だったら、あのよくある画面でファイルが見えるようになるはずなのだが、何も表示されない…
あのよくある画面にはなるのだが、肝心のファイルが全く見えない…
そこで、URLでファイルに直アクセスしたらどうなるのだろうと試した。
ブラウザで「http://hoge.co.jp/test/file1.txt 」としてアクセス。
403 Forbidden が表示される。。
原因
結論から言うと/var/www/html以下に置いたファイルには適切なラベル付けが必要なのだが(SELinuxのセキュリティポリシー)、それが今回不足していた。
Apacheのerror_logには「Permission Denied」が記録されており、確かに権限不足関連のトラブルっぽい。
説明を端折ってしまっていたが、今回配置した3つのファイルは別サーバからscpコマンドで別ディレクトリへ一旦持ってきてmvで/var/www/html/testディレクトリへ持ってきていた。
それがまずかったらしく(特にmv?)、各ファイルには適切なラベル(httpd_sys_content_t)が付与されていなかった。
例えば/tmpで作ったファイルを/var/www/html/testへ配置し、SELinuxが付与するラベルを表示するとこんな感じになる。
# ll -Z
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 hogehoge
lsコマンドに-Zオプションをつけることでファイルに付与されたラベルを確認できる。
今回は「user_tmp_t」が付与されている。(←これが今回の原因)
正しくはしれっと記載してあるが「httpd_sys_content_t」というラベルが付与されている必要があるらしい。
対処法
大きく2つある。
- SELinuxを無効化する
- 正しいラベルに付け替える
1についてはそりゃそうだろという感じなのでここでは2について説明する。
結論としてはrestoreconコマンドを使用して各ファイルのラベルを適切なものに付け替える事が可能なので以下のようにするとよい。
もう1度現在のラベルを確認しておくと
# ll -Z
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 hogehoge
ここで以下のようにする。
# restorecon hogehoge
再度ラベルを確かめてみる。
# ll -Z
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 hogehoge
ラベルが「httpd_sys_content_t」に書き換わっていることが分かる。
この状態であれば、403 Forbiddenを食らうことなく正しくファイルを閲覧することができる。
最後に
Apacheに限らずPermission Denied系のエラーとなりファイルのオーナやパーミッションの設定をどう見直しても改善しない場合はSELinuxによるセキュリティを疑ってみる。
あと、どうやらmvコマンドは元々のラベルを引き継いでしまうのでcpコマンドの方がいいらしい。
「もう思考停止でDisabledにするあの時間は終わって、君もSELinuxと向き合う時なんだ」(今更過ぎる)