先日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.inimysql.soのパスを追加
    php.iniにてエラー表示を有効

  • httpd
    インデックスファイルの種類にindex.phpを追加
    自動起動設定
    /var/www/http/の所有者を作業ユーザに変更

  • iptables
    80ポートを開放

この時点でssh、httpd、mysqlなどは正常でhttpdによるphpファイルの実行も確認しています。


wordpressのインストール

仮想マシンの最低限の設定が終わったので、wordpressをインストールする作業をはじめました。

  • 作業ユーザのディレクトリ(/home/作業ユーザ/)にてwordpressファイルをダウンロード

    $ wget http://ja.wordpress.org/wordpress-4.2.4-ja.tar.gz

  • そのまま解凍

    $ 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 インストールからやり直してみましたがこちらも問題は再現されませんでした。

一応それからは不具合と思われる現象は発現していませんが、なぜこのようなことが起こったのか、疑問が全く晴れずもんもんとしています。

おそらくは私の作業手順に何らかの原因があるのだと思いますが、上記のようなパーミッションや所有者権限の挙動に対して、情報をお持ちの方にお答えいただけると幸いです。