サイトを公開する際に最低限抑えておきたい Apache の設定
こんにちは nakamura です。最近トルシエさんテレビ出すぎじゃありません?ウィイレヤロウヨ。オフサイドダヨ!
さてさて今回は意外と知られてないけど、サイトをインターネットに公開する際には知っておいた方が良い Apache の設定をいくつかご紹介します(一部 PHP の設定もありますが)。この設定をしていないからといって即危険にさらされるという訳でもありませんが、リスクの芽は摘んでおくに越した事はありませんよね。
無駄な HTTP ヘッダを返さない
ディストリビューションにより異なるかもしれませんが、CentOS デフォルトの設定の場合 Apache が返してくる HTTP ヘッダは以下のようなものです。
HTTP/1.1 200 OK
Date: Mon, 05 Jul 2010 01:01:14 GMT
Server: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=tvmdab5rf4e2k5quhhghnlmit7; path=/; domain=example.com
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
お気付きでしょうか?OS の名前から Apache, PHP のバージョンまでズバっとお見通しなんです!セキュリティホールというのはアプリケーションのバージョンに依存するものがほとんどなので、バージョンが分かる → どんなセキュリティホールがあるのか分かる、という事になってしまいます。こんなヘッダは消してしまいましょう。
ServerTokens
OS や Apache の情報をどの程度 HTTP ヘッダに含めるのか設定するディレクティブです。/etc/httpd/conf/httpd.conf を編集しましょう。 CentOS デフォルトでは ServerTokens OS になっていますが、これを ServerTokens Prod に変えてあげると、、、
HTTP/1.1 200 OK
Date: Mon, 05 Jul 2010 01:51:00 GMT
Server: Apache ← バージョンと OS の名前が消えた!
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=tvmdab5rf4e2k5quhhghnlmit7; path=/; domain=example.com
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
ServerSignature
Apache のバージョンが 2.0.44 よりも新しければ ServerTokens の変更だけで充分ですが、そうでなければこちらのディレクティブも併せて変更しておきましょう。403, 404, 503 等のエラードキュメント表示の際にフッター部分にどの情報を載せるのか設定できます。
expose_php
こちらは Apache ではなく PHP の設定なので /etc/php.ini を編集します。サイトで PHP が使用されているか、使用されているならどのバージョンか、という情報を HTTP ヘッダ内に表示します。デフォルトで On になっているのを expose_php = Off に変えると、、、
HTTP/1.1 200 OK
Date: Mon, 05 Jul 2010 01:51:00 GMT
Server: Apache
Set-Cookie: PHPSESSID=tvmdab5rf4e2k5quhhghnlmit7; path=/; domain=example.com
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
X-Powered-By: PHP/5.1.6 という情報が消えました!これでだいぶヘッダはすっきりしましたね。
持続的接続を有効に
KeepAlive
ひとつのページを表示する際にブラウザは HTML ファイルだけでなく付随する CSS や画像など、場合によっては何十回ものリクエストをサーバに対して送信しています。KeepAlive が無効になっているとこういったリクエストの度に接続と切断を繰り返す事になり、ヒジョーーーに効率が悪い訳です。ただしこの KeepAlive 、古いバージョンの IE で不具合を起こす事があるらしいので導入する際は慎重に設定しましょう。
IE6 以降は問題ないというような情報もちらほら見ますが、ちょっと怖いので僕は IE であれば KeepAlive は無効化するようにしています。
使わない HTTP メソッドを無効にする
TraceEnable
TRACE メソッドという普段使う事はないけど、中々危険なメソッドを無効化します。TRACE メソッドについては以下の URL を参照してください。
まとめると、、、
最低限この辺りの設定はしておいた方が良いと思われます。
httpd.conf
# 持続的接続を有効化
KeepAlive On
# IE は除外
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
# HTTP ヘッダの表示を抑制
ServerTokens Prod
# エラーページの表示を抑制
ServerSignature Off
# TRACE メソッドを無効化
TraceEnable Off
php.ini
; HTTP ヘッダの表示を抑制
expose_php = Off
終わりに
こういう細かい設定の大切さって実際に被害にあってみないと中々実感できませんが、被害にあってからでは遅いですよ!