設定もファイルのパーミッションも所有者も問題ないのに 403 Forbidden になってしまうときの対処法
前置き
今まで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
ファイルを開き、設定を変更します。
- SELINUX=enforcing
+ SELINUX=disabled
SELINUX
の箇所がenforcing
になっていたらdisabled
に変更しましょう。
本当にSELinuxが恒久的に無効になっているかを確認するには、いったんサーバを再起動して、getenforce
を実行してください。Disabled
になっていれば成功です!
さいごに
今まで使っていたCentOSのboxではこんな問題は起こりませんでした。というかそもそもSELinuxなんてものが入っていることすら知りませんでした。やはりboxをによって若干初期設定が異なるので、新しい環境にすると思わぬところで問題が発生します。
今回は調べれば簡単に見つかる内容だったものの、今までは問題なかった&ファイルのパーミッションや所有者、権限等がおかしいと思いこんでしまったがために原因に気づくのが遅くなりました。つまづいたらとりあえず調べてみるのも大事ですね。
Discussion