403 Forbidden or No Permission to Accessについて
先日webサイト開発環境を構築しているときに不思議な現象が起きたので質問させていただきます。
不思議な現象とは、要約すると
- ファイル・ディレクトリのパーミッションが777でも403 Forbidden or No Permission to Accessになる現象が起きた
ということです。
状況をどのようにお伝えしていいかが難しかったので行った作業をなるべく時系列で書いていきたいと思います。長くなりますがご容赦ください。
以下のような環境で仮想マシンを作りました
環境
■ホストマシンは以下です
- Debian GNU/LINUX 8.0
■VirtualBox 4.3.30 仮想マシンの構成は以下です
- ゲストOS
- CentOS6.6(i386)minimal
- メモリ
- 512Mbyte
- ストレージ
- 8.0Gbyte
- ネットワークアダプタ
- ホストオンリーアダプタ(ホストとの通信用)->eth1 192.168.57.11
- NAT(インターネットに出る用)
開発環境の構築
■開発環境としてはWordPressが必要なので仮想マシンに以下を追加インストールしました
- 追加インストール
mysql-server
PHP5.3
php-mysql
php-mbstring
httpd
wget
■また以下のような設定を行いました
一般
作業ユーザの追加
作業ユーザのパスワード設定
作業ユーザをwheelグループに追加 (sudoの実行が可能に)sshd
rootログイン禁止
パスワード認証無効
RSA有効
公開錠認証有効
rhost認証無効
公開鍵・秘密鍵の生成および使用できるように配置mysql
mysql_secure_installationでの初期設定
wordpress用のデータベース作成
wordpress用データベースのユーザ作成
ユーザの権限設定
自動起動設定PHP
mysql.iniにmysql.soのパスを追加
php.iniにてエラー表示を有効httpd
インデックスファイルの種類にindex.phpを追加
自動起動設定
/var/www/http/の所有者を作業ユーザに変更iptables
80ポートを開放
この時点でssh、httpd、mysqlなどは正常でhttpdによるphpファイルの実行も確認しています。
wordpressのインストール
仮想マシンの最低限の設定が終わったので、wordpressをインストールする作業をはじめました。
作業ユーザのディレクトリ(/home/作業ユーザ/)にてwordpressファイルをダウンロード
そのまま解凍
$ tar zxvf wordpress-4.2.4-ja.tar.gz
解凍後ドキュメントルート
/var/www/html/にwordpressのファイルをコピー$ cp -R ~/wordpress/* /var/www/html/
コピー後、
/var/www/html/にcdして、wp-sample-config.phpを編集。wp-config.phpとして保存
wordpressではこのあとwp-adminディレクトリ(/var/www/html/wp-admin/)にあるinstall.phpにブラウザからアクセスすることによって、最終的な設定を行います。
403の発現
しかし**install.phpへのアクセスは403**になりました。
この時点ではパーミッション、所有者:所有グループは以下のようになっていました。
初期状態
/var/www/html/
755 作業ユーザ:作業ユーザ/var/www/html/wp-admin/
755 作業ユーザ:作業ユーザ/var/www/html/wp-admin/install.php
755 作業ユーザ:作業ユーザ
この状態であれば少なくとも、弾かれる(403になる)ことはないという認識でしたが、現実に弾かれているので、以下の作業を行いました。
対応1
一旦上記のディレクトリ・ファイルのパーミッションを777に設定してみました。(また念のためパーミッションを変更した場合、OS再起動を行っています。以下の作業でも同様です)
- 403になる
777にしても403になるため、何らかの設定がおかしいものとして、まずPHPが/var/www/html/の中で実行できるかを確認しました。
コマンドラインで
install.phpを実行してみる- エラーなく実行できる
/var/www/http/にphpinfo()を表示させるファイルを作ってブラウザからアクセス- 正常に表示される
/var/www/html/wp-admin/にphpinfo()を表示させるファイルを作ってブラウザからアクセス- 403になる
この確認でどうやらwp-adminディレクトリに何らかの不具合があるとみて、以下の確認を行ってみました。
対応2
/
var/www/html/wp-admin/を一旦リネームして(.wp-adminにして)退避させ、新しくwp-adminディレクトリを作成。phpinfo()を表示させるファイルを作ってブラウザからアクセス- 正常に表示される
新しく作ったwp-adminディレクトリに退避させておいた.wp-adminディレクトリの中身を
cpして、install.phpにブラウザからアクセス- 403になる
この時点で、もともと作業ユーザのディレクトリから/var/www/html/にcpした時に何らかの不具合があったのかと思い、以下の作業を行いました。
対応3
/var/www/html/の中身をrm。新たにダウンロード解凍したファイルを配置し直し、install.phpにブラウザからアクセス- 403になる
対応4
だんだん手がなくなってきましたが、ファイルの所有者:所有グループが原因かと思い以下の作業を行いました。
/var/www/html/とそれ以下のディレクトリ・ファイルの所有者:所有グループをroot:rootにした- 403になる
/var/www/html/とそれ以下のディレクトリ・ファイルの所有者:所有グループをapache:apacheにした- 403になる
所有者の問題でもなさそうでなので一旦所有者:所有グループを作業ユーザ:作業ユーザにもどしました。
偶然の問題解決
この時点で万策尽きて、やけくそに/var/www/html内をrmして、/var/www/html/
のパーミッションを777にして、再度ファイルを配置してみました。するとinstall.phpに正常にアクセスできるようになりました。
問題が起きていた際/var/www/htmlのパーミッションは755なので、解決した後と比較すると変わったところは結局、
/var/www/html/の所有グループ・その他の書き込み権限があるかないか
ということになるかと思います。
私の理解ではPHPの実行に関しては実行権限があれば実行できるものと思っていました。
rwxr-xr-xであればその他、つまりブラウザからのアクセスはパーミッションで弾かれないのではないでしょうか?
変わったところといえば、実行権限ではなく、書き込み権限であり、それで解決したのも全く解せません。
さらに確認のため作ったphpinfo()を表示させるファイルは実行できたということです。
もし/var/www/html/に何らかの不具合があれば、そもそもphpinfo()を表示させるファイルは実行できないのではないかと思います。
ちなみに/var/www/html/を777にしてinstall.phpにアクセスできたことを確認したあとに、/var/www/html/を755に戻しても、install.phpにはアクセスが出来ました。
問題解決したあとにもう一度不具合再現しようと思い最初から作業をやり直しましたが、再現はできませんでした。
また仮想マシンを新しく作り、OS インストールからやり直してみましたがこちらも問題は再現されませんでした。
一応それからは不具合と思われる現象は発現していませんが、なぜこのようなことが起こったのか、疑問が全く晴れずもんもんとしています。
おそらくは私の作業手順に何らかの原因があるのだと思いますが、上記のようなパーミッションや所有者権限の挙動に対して、情報をお持ちの方にお答えいただけると幸いです。