ヘッダー情報からサーバーで使用しているPHPバージョンを特定されてしまい、そのバージョンのセキュリティーホールを狙った攻撃を受けてしまう可能性があります。今回は、ヘッダー情報からPHP・Apacheのバージョンを特定させない方法を紹介します。

対策がされていないサーバーへHTTPリクエストを送信し、実際にヘッダー情報を取得すると・・・

[root@localhost ~]$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
GET /test.php HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 26 Jan 2007 12:00:00 GMT
Server: Apache/2.0.59 (Unix)
Accept-Ranges: bytes
X-Powered-By: PHP/5.2.0
Connection: close
Content-Type: text/html

Hello!
Connection closed by foreign host.

上記のように、PHPのバージョンが表示されてしまい、もし、上記のバージョンに致命的なバグが見つかると、特定の攻撃を受けてしまう可能性があり、非常に危険な状態です。

そこで上記を表示させない対策を「php.ini」に行います。

expose_php=On

と記述されている箇所を

expose_php=Off

に変更してください。
また、変更後はApacheを再起動します。

再度、ヘッダー情報を取得して確認してみましょう。

[root@localhost ~]# telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
GET /test.php HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 26 Jan 2007 12:00:00 GMT
Server: Apache/2.0.59 (Unix)
Accept-Ranges: bytes
Connection: close
Content-Type: text/html

Hello!
Connection closed by foreign host

上記のように設定変更後はPHPのバージョン情報が表示されないようになります。

※上記の設定だけだと「Server: Apache/2.0.59 (Unix)」のようにApacheのバージョン情報が表示されてしまい、 PHPのバージョン情報と同じことがApacheにも起こるため、こちらについても非表示にする対策を行います。

非表示にするにはhttpd.confの設定を変更します。
今回の場合は、

ServerTokens OS

となっている部分があるはずなので、

ServerTokens ProductOnly

に変更してください。

Apacheを再起動後に確認すると

Server: Apache/2.0.59 (Unix)
   ↓
Server: Apache

となります。

Apacheの2.0.44以降では、ServerTokensディレクティブでApacheのエラーページに表示されるサーバー情報も同様に制御できますが、それ以前のバージョンではすべて表示されてしまうのでこちらも設定で非表示にしてしまいましょう。そのためには、「ServerSignature Off」と設定または変更します。

PHPのバージョン情報とApacheのバージョン情報の隠蔽対策は、2つ共に設定をすることで効果が得られます。細かい設定項目を理解して対策をしっかり取ることがセキュリティへのリスクを減らすことなのです。使用しているアプリケーションの設定できる項目を知ることで、いろいろ知らなかった発見ができるはずです。



(アシアル 笹亀弘)


この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。