質問: 先日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ファイルをダウンロード** $ wget * **そのまま解凍** $ 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 インストールからやり直してみましたがこちらも問題は再現されませんでした。 一応それからは不具合と思われる現象は発現していませんが、なぜこのようなことが起こったのか、疑問が全く晴れずもんもんとしています。 おそらくは私の作業手順に何らかの原因があるのだと思いますが、上記のようなパーミッションや所有者権限の挙動に対して、情報をお持ちの方にお答えいただけると幸いです。
回答: レスポンスコードの403 Forbiddenは、アプリケーション内でユーザ認証できていないか、ないしはWebサーバで認証済みでないから弾かれておりますので、推察するに * MySQLにて初期設定したユーザ情報と、編集したwp-config.phpのMySQL接続情報が異なっている くらいではないかと思います。 違っていたら申し訳ありません。