原因
SELinuxが有効になっていて、かつ、表示されないファイルのコンテキスト(SELinuxにおけるアクセス権)が適切な値になっていない。
原因詳細
SELinux は、通常の xfs/ext4 等で使われるアクセス権(パーミッション)ではカバーしきれないセキュリティを提供する機能です。バッファオーバーフロー攻撃等でプロセスが乗っ取られた際に、被害の範囲を限定することができるのが、SELinux の主なメリットです。
例えば httpd というプロセスは[httpd_sys_content_t]等の特定のコンテキストが無いとアクセスができません。なので、postfix ユーザが乗っ取られただけでは、この[httpd_sys_content_t] というラベルのつけられたファイルにアクセスすることはできません。
この SELinux のコンテキストは、NSA および Linux のディストリビュータが「こういった設定が望ましい」というポリシーを記載したファイルを同梱しており、それに基づいて自動的に付与されます。
ただし、SELinux を有効化する前に作ったファイルや、どこかで作成したファイルを移動(cp ではなく mv) してきた場合、はたまた、プロセスユーザが想定していないディレクトリにファイルを作った場合(例えば Apache で DocumentRoot を /temporary/ 等に指定した場合)などは、このコンテキストが正しく付与されない場合があります。
解決方法
解決方法1. SELinux を無効化する
まずSELinuxが有効化になっているかを確認します。
このコマンドの結果、 "Enforcing" が返ってきた場合はSELinuxが有効になっていますので、以下コマンドで無効化します。
再起動時もSELinuxを無効化し続けたい場合は、以下ファイルを変更します。
/etc/selinux/config において、
と書かれている箇所を
に修正します。
解決方法2. 該当ディレクトリに適切なコンテキストを設定する
例えば /temporary/ を DocumentRoot にした場合、以下コマンドでこのディレクトリおよび配下のディレクトリ・ファイルに httpd_sys_content_t を付与します。
現状どのコンテキストが割り当たっているかを確認するには、lsコマンドに-Zオプションを使います。
付与する方法も一時的に付与する方法と、永続的(再起動後も有効)に付与する方法があります。
一時的に付与する場合は、chcon コマンドを使います。
-Rは再帰的に/temporary配下のディレクトリ・ファイルにも適用するオプション、-t は付与したいコンテキストのタイプを指定するためのオプションです。
永続的に付与する場合は、semanage コマンドで定義ファイルを書き換えた後、restorecon コマンドで定義ファイルの適用を行います。
# restorecon -RF /temporary
restorecon コマンドを使うと、chcon で適用した内容は破棄されます。
コメント