サイトを公開する際に最低限抑えておきたい Apache の設定 | バシャログ。

さてさて今回は意外と知られてないけど、サイトをインターネットに公開する際には知っておいた方が良い 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 に変えてあげると、、、

01 HTTP/1.1 200 OK
02 Date: Mon, 05 Jul 2010 01:51:00 GMT
03 Server: Apache ← バージョンと OS の名前が消えた!
04 X-Powered-By: PHP/5.1.6
05 Set-Cookie: PHPSESSID=tvmdab5rf4e2k5quhhghnlmit7; path=/; domain=example.com
06 Expires: Thu, 19 Nov 1981 08:52:00 GMT
07 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
08 Pragma: no-cache
09 Connection: close
10 Transfer-Encoding: chunked
11 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 に変えると、、、

01 HTTP/1.1 200 OK
02 Date: Mon, 05 Jul 2010 01:51:00 GMT
03 Server: Apache
04 Set-Cookie: PHPSESSID=tvmdab5rf4e2k5quhhghnlmit7; path=/; domain=example.com
05 Expires: Thu, 19 Nov 1981 08:52:00 GMT
06 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
07 Pragma: no-cache
08 Connection: close
09 Transfer-Encoding: chunked
10 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

01 # 持続的接続を有効化
02 KeepAlive On
03 # IE は除外
04 SetEnvIf User-Agent ".*MSIE.*"
05     nokeepalive ssl-unclean-shutdown
06     downgrade-1.0 force-response-1.0
07 # HTTP ヘッダの表示を抑制
08 ServerTokens Prod
09 # エラーページの表示を抑制
10 ServerSignature Off
11 # TRACE メソッドを無効化
12 TraceEnable Off

php.ini

1 ; HTTP ヘッダの表示を抑制
2 expose_php = Off

終わりに

こういう細かい設定の大切さって実際に被害にあってみないと中々実感できませんが、被害にあってからでは遅いですよ!

 

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中