Apacheで作ったwebサーバへhttpアクセスすると403 forbiddenが表示される

原因

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が有効化になっているかを確認します。

# getenforce

このコマンドの結果、 "Enforcing" が返ってきた場合はSELinuxが有効になっていますので、以下コマンドで無効化します。

# setenforce 0

再起動時もSELinuxを無効化し続けたい場合は、以下ファイルを変更します。

/etc/selinux/config において、

SELINUX=enforcing

と書かれている箇所を

SELINUX=disabled

に修正します。

解決方法2. 該当ディレクトリに適切なコンテキストを設定する

例えば /temporary/ を DocumentRoot にした場合、以下コマンドでこのディレクトリおよび配下のディレクトリ・ファイルに httpd_sys_content_t を付与します。

現状どのコンテキストが割り当たっているかを確認するには、lsコマンドに-Zオプションを使います。

ls -dZ /temporary

付与する方法も一時的に付与する方法と、永続的(再起動後も有効)に付与する方法があります。

一時的に付与する場合は、chcon コマンドを使います。

# chcon -R -t httpd_sys_content_t /temporary

-Rは再帰的に/temporary配下のディレクトリ・ファイルにも適用するオプション、-t は付与したいコンテキストのタイプを指定するためのオプションです。

永続的に付与する場合は、semanage コマンドで定義ファイルを書き換えた後、restorecon コマンドで定義ファイルの適用を行います。

# semanage fcontext -a -t httpd_sys_content_t /temporary
# restorecon -RF /temporary

restorecon コマンドを使うと、chcon で適用した内容は破棄されます。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする