PHPセキュリティ対策:ディレクトリやファイルのアクセス権限

(1/1)
機密性を確保するためには、業務プログラムのソースコードは見られないようにすべきである。ソースコードにパスワードなどの機密情報が含まれている場合もあるだろうし、セキュリティホールが残っていないとも言えないからだ。
今回は、Apacheの設定を中心に、PHPソースコードを漏らさないようにする方法を紹介する。

.htaccessの設定に注意

PHPを動かしているApacheサーバでは、httpd.conf に下記のような設定が記述されているはずである。

AddType   application/x-httpd-php   .php


この設定が有効であり、http通信でアクセスしてくるクライアントに対して、PHPソースコードが見られることはない。

ところが、ディレクトリ毎に設定している .htaccess ファイルの中に、

AddType   application/octet-stream   .php


のように記述されていると、httpd.conf の設定がオーバーライド(上書き)され、.htaccessの設定が優先される。しかも、この設定は、拡張子 php のファイルをダウンロードできるようにするものだ。
うっかりミスがないよう、.htaccess の設定には十分注意してほしい。

拡張子PHPを偽装する

URLの最後の拡張子が "php" だと、その画面でPHPを実行しているということを告白しているようなものだ。そこで、拡張子を "html" に偽装することがある。中身はPHPソースコードだが、拡張子はhtmlにしておくのである。

やり方は簡単だ。httpd.conf に下記のような設定を加えればよい。

AddType   application/x-httpd-php   .php .html


ただし、この設定を行うと、通常のhtmlファイルもPHPとして解釈されるので、応答速度が若干低下する(サーバーの負荷が増大する)。
現実解としては、PHPスクリプトがあるディレクトリのみ、.htaccess で上記の設定をしてやるといいだろう。

Basic認証をかける

Apacheでは、特定のディレクトリへアクセスする際にユーザー認証を求める方法として、Basic認証とDigest認証の2種類の方式を備えている。
重要なPHPファイルはBasic認証がかかったディレクトリに配置し、一般的なPHPスクリプトから関数  include  や  require  で呼び出すようにすれば、漏洩リスクは減少する。
ここでは、多くのブラウザで対応しているBasic認証を用いることにする。

たとえば、"/var/public_html/cgi/" というディレクトリにBasic認証をかけたければ、そのディレクトリに .htaccess というテキストファイルを配置する。.htaccessの内容は下記の通りだ。

AuthType Basic
AuthName "ログインIDとパスワードを入力してください。"
AuthUserFile /var/public_html/cgi/.htpasswd
require valid-user


AuthNameは、認証画面の領域というところに表示される内容で、日本語も利用できる。

次に、AuthUserFileで指定するパスワードファイル .htaccess を用意する。
pahooというユーザー名でパスワードファイル .htaccess を作る場合は、htpasswd コマンド(apacheインストールディレクトリの配下にある)を使って、以下のように操作する。"********" はパスワードである。

# /usr/local/apache2/bin/htpasswd  -mc  /var/public_html/cgi/.htpasswd  pahoo
New password: ********
Re-type password: ********
Adding password for user pahoo


パスワードファイル .htaccess はテキストファイルだが、見てもらうと分かるように、パスワードは暗号化されており、.htaccessが盗み見されたとしても元のパスワードを知ることはできない。

参考サイト

(この項おわり)
header