Edited at

設定もファイルのパーミッションも所有者も問題ないのに 403 Forbidden になってしまうときの対処法

More than 1 year has passed since last update.


前置き

今までVagrantで使用する仮想サーバを4つほど用途によって使い分けていたんですが、さすがに面倒になったので1つにまとめることにしました。

そして、今までは非公式のCentOSのboxを使っていたんですが、今回は公式のboxを使うことにしました。

今まで通りNginxをインストールして設定をしたんですが、なぜか 403 Forbidden になってしまいます。設定も間違っていないし、ファイルのパーミッションも所有者も問題はなかったです。

さらに不思議なことに、全く同じファイルなのに、あるディレクトリで見ると普通に見れるのに、別のディレクトリで見るとForbiddenになってしまう現象も起きました(もちろんディレクトリも名前以外は全く同じ条件です)。

さすがに何かおかしいと思い調べたらとんでもないところに問題がありました。


SELinuxが有効になっていた

SELinuxとは、Wikipediaによると、カーネルに強制アクセス制御を付与するモジュールらしいです。要するにセキュリティ対策のためのモジュールです。

ところがSELinuxはあまりの強度のために、普通にWebサーバでファイル配信しようとしただけでも作用してしまいます。どのように動作しているかはわからないのですが、まったく同じ条件のファイル・ディレクトリでも配信できたりできなかったりするので開発者的には正直言って邪魔です。しかも自分の場合は仮想サーバなので、ただ邪魔をされるだけの存在です。

ディレクトリによってOKだったりNGだったりするのでファイルのパーミッションとかファイルシステムに問題があるんじゃないかと思って、全く見当外れのところにかなりの時間を費やしてしまったので、今後こういうことが起こらないように記事に残しておきます。


解決法

まずはSELinuxが起動しているかどうかを確認してください。

$ getenforce

Enforcingと出てきたらSELinuxが起動していて悪さをしている可能性があります。PermissiveまたはDisabledと出てきた場合は他のところに問題があると思われます。

それぞれの状態は以下の通りです。

状態
説明

Enforcing
SELinux機能、アクセス制御が有効

Permissive
SELinuxは警告を出力するが、アクセス制限は無効

Disabled
SELinux機能、アクセス制御が無効

参考: SELinuxを無効化する


一時的に停止する

とりあえず停止したい場合は以下のコマンドを実行します。

$ sudo setenforce Permissive

参考: nginxで権限を設定した後も403 Forbiddenが出た話

これでアクセス制限は無効化できます。が、サーバを再起動すると再び元の状態に戻ってしまいます。またPermissiveでもForbiddenになる問題は解決できますが、SELinuxが停止しているわけではありません。setenforceコマンドではDisabledに設定することができません。


恒久的に停止する

個人的にはこちらをおすすめします。/etc/selinux/configファイルを開き、設定を変更します。


/etc/selinux/config

- SELINUX=enforcing

+ SELINUX=disabled

SELINUXの箇所がenforcingになっていたらdisabledに変更しましょう。

本当にSELinuxが恒久的に無効になっているかを確認するには、いったんサーバを再起動して、getenforceを実行してください。Disabledになっていれば成功です!


さいごに

今まで使っていたCentOSのboxではこんな問題は起こりませんでした。というかそもそもSELinuxなんてものが入っていることすら知りませんでした。やはりboxをによって若干初期設定が異なるので、新しい環境にすると思わぬところで問題が発生します。

今回は調べれば簡単に見つかる内容だったものの、今までは問題なかった&ファイルのパーミッションや所有者、権限等がおかしいと思いこんでしまったがために原因に気づくのが遅くなりました。つまづいたらとりあえず調べてみるのも大事ですね。


参考サイト