Apacheで403 Forbiddenが表示されたら
- 環境
- 前提
- 事象
- チェックポイント
- Apacheの再起動をしていない
- 再起動
- リロード
- ファイルに読み取り権限がない
- その他のユーザに読み取り権がない場合
- 対応
- ディレクトリの権限に実行権がない
- /var/hoge/ に実行権がない場合
- 対応
- httpd.confのDirectoryセクションの設定を見直す
- すべてのアクセスを拒否する場合
- すべてのアクセスを許可する場合
- 特定のIPのみアクセスを許可する場合
- SELinuxが有効になっている
- SELinuxを無効にする場合
- SELinuxの状態確認
- SELinuxを無効にする
- サーバ再起動
- SELinuxの状態を再度確認
- SELinuxを有効のまま運用する場合
- 元DocumentRootのラベルを確認
- ラベルの付与
- ラベルの確認
環境
・CentOS Linux release 7.1.1503 (Core)
・Apache 2.4.6
前提
・設定ファイル
/etc/httpd/conf/httpd.conf
・DocumentRoot
/var/www/html
・テストページ
/var/www/html/index.html
事象
テストページを表示しようとすると403 Forbiddenが表示される。
チェックポイント
Apacheの再起動をしていない
設定ファイルを変更した場合、Apacheを再起動しないと変更が反映されません。
そのため再起動していない場合は、実施します。
再起動
$ sudo systemctl restart httpd.service
リロード
Apacheを終了したくない場合は、以下を実行して下さい。
$ sudo systemctl reload httpd.service
ファイルに読み取り権限がない
権限には「所有者」「所有グループ」「その他のユーザ」がありますが、「その他のユーザ」に読み取り権(r)が付与されているか確認してください。
※今回の場合だと、/var/hoge/index.html の権限になります。
その他のユーザに読み取り権がない場合
$ ls -l /var/hoge/index.html
-rw-r----- 1 root root 19 11月 26 11:21 /var/hoge/index.html
対応
ファイルに読み取り権を付与します。
$ sudo chmod +r /var/hoge/index.html
$ ls -l /var/hoge/index.html
-rw-r--r-- 1 root root 19 11月 26 11:21 /var/hoge/index.html
ディレクトリの権限に実行権がない
DocumentRootまでの各ディレクトリで、「その他のユーザ」に実行権(x)が付与されているか確認してください。
今回だと「/」, 「/var」, 「/var/hoge」の3つの内のいずれかにディレクトリに実行権(x)がないと、テストページが表示されません。
/var/hoge/ に実行権がない場合
$ ls -ld /var/hoge/ drwxr-xr-- 2 root root 23 11月 26 20:22 /var/hoge/
対応
ディレクトリに実行権を付与する。
$ sudo chmod o+x /var/hoge $ ls -ld /var/hoge drwxr-xr-x 2 root root 23 11月 26 20:22 /var/hoge/
httpd.confのDirectoryセクションの設定を見直す
Directoryセクション内のRequireの設定を確認しましょう。
すべてのアクセスを拒否する場合
$ cat /etc/httpd/conf/httpd.conf <Directory"/var/hoge"> Options Indexes FollowSymLinks AllowOverride None Require all denied ←全てのアクセスを拒否
上記のようにRequireで「all denied」と記述すると、どこからでもアクセス不可となってしまいテストページが表示されません。
そのため以下のような方法でテストページへのアクセスを許可することができます。
すべてのアクセスを許可する場合
... <Directory"/var/hoge"> Options Indexes FollowSymLinks AllowOverride None Require all granted ←全てのアクセスを許可 ...
特定のIPのみアクセスを許可する場合
... <Directory"/var/hoge"> Options Indexes FollowSymLinks AllowOverride None Require192.168.1.0/24 ←指定したIPからのみアクセスを許可 ...
SELinuxが有効になっている
SELinuxが有効になっている場合、DocumentRootへのアクセスが拒否されている可能性があります。
SELinuxを利用する予定がない場合は無効に設定しましょう。
SELinuxを無効にする場合
SELinuxの状態確認
$ getenforce Enforcing
Enforcingと表示される場合、SELinuxは有効になっている状態です。
SELinuxを無効にする
SELinuxの設定ファイルは /etc/selinux/config になるため、こちらを編集します。
$ sudo vi/etc/selinux/config ... SELINUX=disabled ←enforcingからdisabledに変更 ...
サーバ再起動
SELinuxの設定を反映するためにサーバの再起動を行います。
$ sudo shutdown -r now
SELinuxの状態を再度確認
$ getenforce Disabled
Disabledと表示されれば、SELinuxは無効に変更されています。
SELinuxを有効のまま運用する場合
新しいDocumentRootにはSELinuxのラベルを付ける必要があります。
元DocumentRootのラベルを確認
$ ls -ld --context /var/www/html drwxr-xr-x. root root system_u:object_r:httpd_sys_rw_content_t:s0 /var/www/html
ラベルの付与
新DocumentRootに元DocumentRootと同じラベルを付与します。
$ sudo chcon system_u:object_r:httpd_sys_rw_content_t:s0 /var/hoge -R
ラベルの確認
以下のように表示されていれば、元DocumentRootと同じラベルが付与されています。
$ ls -ld --context /var/hoge drwxr-xr-x. root root system_u:object_r:httpd_sys_rw_content_t:s0 /var/hoge
参考サイト:https://engineers.weddingpark.co.jp/?p=1031