ドキュメントルートに mvコマンドでファイルを持ってくると、ブラウザからそのファイルにアクセスできない問題(SELinuxが原因の場合)

Laravel

忘れがちなのでメモしておきます。

環境

  • OS: CentOS 7
  • /var/www/ 以下にディレクトリが作ってあり、そこをドキュメントルートにしている。
  • SELinuxを有効にしている。

問題となる現象

  • ドキュメントルートに mvコマンドでファイルを持ってくると、そのファイルにブラウザからアクセスできない。

原因

  • mvしたファイルのセキュリティコンテキストが適切でないために、HTTPサーバのプロセスがこのファイルへアクセスしようとしても SELinuxが止めてしまう。

解決方法

問題となっているファイルに対して、以下のコマンドを実行するだけです。

$ sudo restorecon path/to/file
  • これにより、ファイルのセキュリティコンテキストを、HTTPサーバのプロセスがアクセスできるセキュリティコンテキストに変更してくれます。
  • restoreconコマンドは、対象となるパスに設定されている(ファイルそのものではなく、あくまでパスに対して設定されている)セキュリティコンテキストを適用してくれるコマンドです。

メモ

  • CentOS 7 ではデフォルトの状態で、/var/www/ 以下に HTTPサーバープロセス用のタイプ(httpd_sys_content_t)がマッピングされているため、上記のように restoreconコマンドを実行すれば、セキュリティコンテキストを修正することができます。
    • この設定は、/etc/selinux/targeted/contexts/files/file_contexts に記述されていますし、semanage fcontext --listコマンドでも確認することができます。
    • 具体的には、以下のようにマッピングされています。
    /var/www(/.*)?       system_u:object_r:httpd_sys_content_t:s0
  • もしこのようなマッピングがされていないパスであれば、chconコマンドで 明示的にファイルのセキュリティコンテキストを変更する必要があります。

(1) mvコマンドで foo.phpファイルを移動してきたところ

  • lsコマンドに -Z オプションを指定すると、各ファイルのセキュリティコンテキストが表示できます。
  • セキュリティコンテキストのフォーマットは、「ユーザー:ロール:タイプ:レベル」となっています。


scontext_001

  • foo.phpファイルのセキュリティコンテキストを見ると、「unconfined_u:object_r:user_home_t:s0」となっています。

(2) restoreconコマンドでセキュリティコンテキストを復元したところ


scontext_002

  • foo.phpファイルのセキュリティコンテキストが、「unconfined_u:object_r:httpd_sys_content_t:s0」となりました。
  • user_home_thttpd_sys_content_t に変わっています。

最終更新日: 2016-07-15

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*