今回は、Webサーバのセキュリティ設定について見ていきます。
ホームページなどは全世界に公開しますので、HTTPアクセスには制限をかけることは少ないと思います。
しかし、その分、全世界から様々な攻撃を受けることになるので、その為の対応はしないといけません。
今回は、簡単な設定でセキュリティを高めることができる内容をご紹介します。
設定を修正するのは、以下の4点です。
[Apache]
1.ServerTokens
2.ServerSignature
→Apacheやモジュールのバージョン情報などの出力を抑えます。
3.TraceEnable
→Cross-Site Tracing(XST)攻撃で利用される情報の出力を抑えます。
[PHP]
4.expose_php
→PHPの各種情報の出力を抑えます。
上記の1,2,4は、ApacheとPHPのバージョン情報などの出力を抑止し、攻撃者にサーバ情報を出さないようにします。
バージョン情報が分かると、そのバージョンが持つ脆弱性が特定でき、格好の的になってしまう為です。
3番については、主要なブラウザ側でXST攻撃の対策ができている為、クリティカルな脆弱性というものではありませんが、XST攻撃を100%受けることは無い、とも言い切れないので、設定します。
これらの項目は、セキュリティ診断などを行った際、未対応であれば、ほぼ確実に指摘事項として挙げられますが、簡単な設定変更で対応が可能なので、是非とも変更をオススメします。
それでは、それぞれの設定変更について見ていきます。
1.ServerTokens
「httpd.conf」で、下記のServerTokens の設定を変更します。
ServerTokensの設定には、以下の通りいくつかの設定ができ、それぞれの設定によるヘッダ情報の出力は以下のとおりです。
設定項目 | ヘッダ情報 |
ServerTokens OS | Server: Apache/2.2.15 (CentOS) |
ServerTokens ProductOnly | Server: Apache |
ServerTokens Major | Server: Apache/2 |
ServerTokens Minor | Server: Apache/2.2 |
ServerTokens Minimal | Server: Apache/2.2.15 |
ServerTokens Full(もしくは未指定) | Server: Apache/2.2.15 (CentOS) DAV/2 PHP/5.3.3 |
私の環境では、デフォルトで「OS」が設定されており、ApacheのバージョンとOSの情報も出てしまいました。
これを抑えるには、設定を「ProductOnly」に変更します。
これで、情報の出力が最低限に抑えることができます。
(※設定を反映するには、Apacheを再起動します)
2.ServerSignature
その名の通り、署名情報を出力するかどうかの設定になります。
この設定が有効になっていると、例えば、存在しないページにアクセスした際、404エラーページにサーバ情報を出力してしまいます。
ServerTokensの設定を「ProductOnly」に変更するだけで、ServerSignatureで出力される情報も同様に変わりますが、ホスト名などは表示されてしまう為、この表示を完全に出ないようにします。
ServerTokensの設定とServerSignatureの設定を変えることで、出力内容が以下のように変わります。
「ServerTokens OS」で「ServerSignature On」の場合
Apacheのバージョン情報まで表示されています。
「ServerTokens ProductOnly」で「ServerSignature On」の場合
この場合は、ホスト名までの表示に変わりました。
「ServerTokens ProductOnly」で「ServerSignature Off」の場合
完全に情報が表示されなくなりました。
このように、設定を修正することで、余計な情報の出力を抑えることが可能です。
3.TraceEnable
この機能は、HTTPリクエストをトレースして、その内容をそのまま返すというもので、古いブラウザで入力したBasic認証のユーザ名やパスワードなどが分かってしまうというものです。
しかし、繰り返しになりますが、現在の主なブラウザは、この脆弱性対策が施されているので、あまり気にする必要はないと思います。
では、簡単にその動作を見てみます。
host1から、host2へTRACEメソッドを使ってみます。
上記の通り、リクエスト内容が、そのまま返されているのが分かります。
では、この出力を無効にします。
デフォルトでは明記されていないので、httpd.confのどこでもいいので、下記の設定を入れて、Apacheの再起動を行います。
再度、確認してみます。
上記の通り、TRACEメソッドが許可されていないと返されました。
(※403または405のステータスコードが返されます)
4.expose_php
最後は、PHPの設定です。
PHPにはイースターエッグと呼ばれる設定が入っており、これにより、特定のコードを付けてアクセスすると、PHPロゴやクレジット情報などを見ることができます。
(※クレジット情報とは作成者の情報という意味ですので、ここでは、PHPに関する作成者情報のことです。)
例えば、phpinfoなら「?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000」というコードを付けて
http://host2/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 というURLにアクセスすると、
このようにクレジット情報を出力することができます。
PHPロゴなら、「?=PHPE9568F34-D428-11d2-A769-00AA001ACF42」というコードを付けて、
http://host2/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 にアクセスすると、
と、PHPロゴが表示されます。
また、ZEND ロゴなら、「?=PHPE9568F35-D428-11d2-A769-00AA001ACF42」というコードを付けて
http://host2/?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 にアクセスすると、
ZENDロゴが表示されます。
このように、
「http://XXXXX/」 + 「特定のコード」という形で表示することができてしまいます。
また、任意のPHPの直後にこのコードを付けても表示することが出来ます。
(例:http://host2/sample.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 )
(sample.phpに、上記のコードを付けたURLの形です)
このイースターエッグは、ユーモアの1つであり、公式にはセキュリティホールではないと言われていますが、mod_phpなどで使っている場合、レスポンスヘッダにPHPのバージョンが表示されてしまいます。
バージョン情報は隠したいので、やはり、この設定は修正します。
変更方法は簡単で、php.iniファイルの下記の設定を修正するだけです。
上記の通り、expose_php = Offに設定するだけでOKです。
(変更後、Apacheの再起動を行います。)
長くなりましたが、実際に手を動かす作業量は少ないので、一度お試し頂ければと思います。
▼次回予定
次回も引き続き、サーバセキュリティについて、認証とその脆さについて紹介しようと思います。
更新予定は、9月中旬頃です。