SREチーム  エンジニアの阿久津です。
今回はNginxの403 Forbiddenが表示された時のチェックポイントについて記事にしたいと思います。

環境

  • Vagrant 1.9.5
  • CentOS Linux release 7.1.1503 (Core)
  • Nginx 1.14.0

前提

  • 設定ファイル
     /etc/nginx/default.conf

  • DocumentRoot
     /var/hoge

  • テストページ
     /var/hoge/index.html

事象

テストページを表示しようとすると403 Forbiddenが表示される。

Nginx403

チェックポイント

①Nginxの再起動をしていない

設定ファイルを変更した場合、Nginxを再起動しないと変更が反映されません。
そのため再起動していない場合は実施します。

■再起動
$ sudo systemctl restart nginx.service
■リロード

Nginxを終了せずに、変更した設定の反映を行います。

$ sudo systemctl reload nginx.service

②ファイルに読み取り権限がない

権限には「所有者」「所有グループ」「その他のユーザ」がありますが、「その他のユーザ」に読み取り権(r)が付与されているか確認してください。
※今回の場合だと、/var/hoge/index.html の権限になります。

■その他のユーザに読み取り権がない場合
$ ls -l /var/hoge/index.html
-rw-r----- 1 root root 9 Jun  1 08:14 index.html
■対応

ファイルに読み取り権を付与します。

$ sudo chmod o+r /var/hoge/index.html
$ ls -l /var/hoge/index.html
-rw-r--r--. 1 root root 9 Jun  1 08:14 /var/hoge/index.html

③ディレクトリの権限に実行権がない

DocumentRootまでの各ディレクトリで、「その他のユーザ」に実行権(x)が付与されているか確認してください。
今回だと「/」, 「/var」, 「/var/hoge」の3つの内のいずれかにディレクトリに実行権(x)がないと、テストページが表示されません。

■ /var/hoge/ に実行権がない場合
$ ls -ld /var/hoge/
drwxr-xr--. 2 root root 23 Jun  1 08:14 /var/hoge/
■対応

ディレクトリに実行権を付与する。

$ sudo chmod o+x /var/hoge
$ ls -ld /var/hoge
drwxr-xr-x. 2 root root 23 Jun  1 08:14 /var/hoge/

④特定のURLへのアクセス制限してしまっている

Nginxで特定のURLへのアクセス制限をする場合、confファイルのlocation内に記述します。
location内でアクセスを拒否していないか確認してみてください。

■すべてのアクセスを拒否する場合
$ cat /etc/nginx/conf.d/default.conf
...
location / {
    root   /var/hoge;
    index  index.html index.htm;

    deny all;    # 全てのアクセスを拒否
}
...

上記のように「deny all;」と記述すると、どこからでもアクセス不可となってしまいテストページが表示されません。
そのため以下のような方法でテストページへのアクセスを許可することができます。

■すべてのアクセスを許可する場合
...
location / {
    root   /var/hoge;
    index  index.html index.htm;

    allow all;    # 全てのアクセスを許可
}
...
■特定のIPのみアクセスを許可する場合
...
location / {
    root   /var/hoge;
    index  index.html index.htm;

    allow 192.168.33.1;    # 特定のIPのみアクセスを許可
    deny all;
}
...

上記の書き方だと 192.168.33.1 からのアクセスのみ許可しています。

⑤SELinuxが有効になっている

SELinuxが有効になっている場合、DocumentRootへのアクセスが拒否されている可能性があります。
SELinuxを利用する予定がない場合は無効に設定しましょう。

⑤-1. 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は無効に変更されています。

⑤-2. SELinuxを有効のまま運用する場合

新しいDocumentRootにはSELinuxのラベルを付ける必要があります。

■元DocumentRootのラベルを確認
$ ls -ld --context /usr/share/nginx/html
drwxr-xr-x. root root system_u:object_r:usr_t:s0       /usr/share/nginx/html
■ラベルの付与

新DocumentRootに元DocumentRootと同じラベルを付与します。

$ sudo chcon system_u:object_r:usr_t:s0 /var/hoge -R
■ラベルの確認

以下のように表示されていれば、元DocumentRootと同じラベルが付与されています。

$ ls -ld --context /var/hoge
drwxr-xr-x. root root system_u:object_r:usr_t:s0       /var/hoge

まとめ

今回はNginxで403 Forbiddenが表示された時のチェックポイントを記事にさせていただきました。
以前Apacheでも403エラーの壁にぶち当たったことがあるのですが、Nginxでも403エラーの壁に阻まれてしまいました…NginxもApacheと似ていて、ファイルやディレクトリの権限周りやSELinuxを見直せば403エラーは解消できることがわかりました。
ぜひ参考にしていただけると幸いです。

Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。

ブライダル業界のデジタルシフトを加速させるリードエンジニア候補募集!

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る