こんにちは、ITエンジニアのKomuraです。
ウェブサーバーにApache HTTPDを採用している環境、まだまだ多いですよね。このApache HTTPDですが、インストールはRPM等のパッケージからコマンド一発で完了しますので、導入の敷居は低くなっています。ただ、インストールして簡単に動作してしまうことから本来、インストール後に必要なセキュリティ設定がなおざりになっているウェブサーバーを良く見受けます。
セキュリティホールやウェブサイトへの攻撃を考えると、Apache HTTPDの基本的なセキュリティ設定は必須になっています。今回の記事では、Apache HTTPDを利用したウェブサーバー環境をもう一度見直して、基本的なセキュリティ設定を確認する手順について説明します。
メモ
2016年1月追記:phpのセキュリティ対策を追記
2018年3月追記:Apache 2.4系の設定手順を追記
本内容は、監査法人などが実施するセキュリティ脆弱性チェックの対策としても有効な情報ですので、セキュリティチェックを予定されている場合にはこに記載した点を再度、確認しておくのもお勧めです。
[st_af name="linuxserver-job-top"]
1. Apacheをデフォルトで利用することの危険性
ウェブサーバは通常、インターネット上に配置され不特定多数からのアクセスが発生するため、デフォルトの状態で運用していることは「あまり良い」状態とは言えません。
今回はデフォルト状態のApacheに確認が必要な10点の脆弱性について、対応方法とチェック手順を紹介します。
環境によっては対策を行うことでウェブサイトに影響がある内容も含まれていますので、設定前に検証環境でテストを行っておき、どの設定が必要かの確認すること、及び現状の設定ファイルについてのバックアップをお勧めします。
全ての手順はサーバーへSSHなどのリモートログインソフトウェアでログイン後、コマンドベースでの操作を想定して記載しています。
2. Apache単体での脆弱性について
Apacheは他のアプリケーション(PHPやtomcatなどのアプリケーションサーバ)やモジュール(mod_sslなど機能を追加するモジュール)と組み合わせて利用することが多いプログラムですが、この項目はApacheのみを対象として記載していきます。
Redhat系でサポートされているApacheのバージョンである2.2系(本記事ではバージョン2. 2.15を利用)と2.4系(バージョン2. 4.6)を対象としています。2.2系と2.4系では設定ファイルの場所や記載内容が異なるため、事前に設定を行うバージョンを確認してください。
Apacheのバージョンは以下のコマンドで確認ができます。
command
# httpd -v
バージョンについては2系を利用する前提で、1.3系はサポート切れということで対象外としています。
2-1. Apacheデフォルトコンテンツの存在(2.2系/2.4系)
Apacheではインストール時にwelcomeページやデフォルトのエラーページで利用するデフォルトコンテンツが存在します。このデフォルトコンテンツはサービス提供上、通常は公開不要なページです。
特にWebサーバやミドルウェアをインストールした際に自動的にインストールされるコンテンツがそのまま公開されているケースが多く見られます。このデフォルトコンテンツにより即座に不正侵入や情報漏えいが発生するわけではありません。
ただし、サービス運用上必要最低限のコンテンツのみ公開し、不要なコンテンツは公開領域に配置しないようにすることがセキュリティ対策の基本です。
2-1-1. デフォルトコンテンツ存在への対策
不要なコンテンツを公開領域から移動または削除します。
例えばApacheインストール後に表示されるwelcomeページが不要な場合、以下の設定を行います。
welcomeページは以下のようなページです。
welcomeページは/etc/httpd/conf.d/フォルダに含まれるファイル welcome.confによって表示されていますので、このファイルを移動、または削除することで対応できます。
ここでは、ファイル名を変更する手順を紹介します。
command
# cd /etc/httpd/conf.d/
# mv welcome.conf welcome.conf.org
これでファイル名が変更され、welcomeページが表示されなくなります。
2-1-2. iconsフォルダへの対策Version 2.2
次にiconsフォルダが不要な場合、以下の設定を行います。
※本設定は2.2系、2.4系で設定方法が異なります。
iconsフォルダはデフォルトコンテンツが利用する画像が配置されているフォルダで、通常は利用しません。iconsフォルダが有効になっている場合、同フォルダに含まれるREADMEなどのファイルも以下のように表示されてしまいます。
2.2系の設定
このiconsフォルダを無効にするには、Apacheの設定ファイルである「httpd.conf」から以下の部分をコメントアウト(先頭に#を付けて設定を無効化する)します。
code
Alias /icons/ "/var/www/icons/"
Directory "/var/www/icons"
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
上記の部分について行頭に「#」を付けて無効化します。変更後の設定は以下のようになります。
code
#Alias /icons/ "/var/www/icons/"
#Directory "/var/www/icons"
# Options Indexes MultiViews FollowSymLinks
# AllowOverride None
# Order allow,deny
# Allow from all
設定ファイルの変更後に、間違いがないかを確認します。httpd.confファイルの確認には専用のコマンドが用意されています。以下のように実行します。
command
# /etc/init.d/httpd configtest
Syntax OK
Syntax OKと表示されれば、設定ファイルの変更は問題ありません。Apacheの再起動を実行するコマンドで、設定を有効化します。
command
# /etc/init.d/httpd restart
上記の確認と再起動のコマンドはOSとしてCentOS 6を利用している場合になります。CentOSの7系を利用している場合の手順は項目2-1-3.に記載しています。
「OK」と表示されれば、apacheは正常に再起動できています。
2-1-3. iconsフォルダへの対策Version 2.4
2.4系のiconsフォルダ無効化設定は、/etc/httpd/conf.dにあるautoindex.confフォルダをリネーム、もしくは削除することで変更が可能です。以下のコマンドでautoindex.confのファイル名を変更する手順を紹介します。
command
# cd /etc/httpd/conf.d/
# mv autoindex.conf autoindex.conf.org
2.4系は主にCentOS7などのメインストリームバージョンで利用されていますので、CentOS7でのサービス再起動の方法を記載します。
設定の変更後、設定ファイルに間違いがないか確認するため「httpd」コマンドに"-t"オプションを付けて実行します。
command
# httpd -t
Syntax OK
「Syntax OK」と表示されれば、設定ファイルの変更は問題ありません。Apacheの再起動を実行するコマンドで、設定を有効化します。
command
# systemctl restart httpd
エラーが表示されなければ、Apacheは正常に再起動できています。
(以下、Apacheの再起動と記載されている場合、手順は同様。)
2-1-4. デフォルトコンテンツ対策の確認
以下のURLをブラウザへ入力し、welcomeページが表示されないことを確認します。
http://サイトのURL
iconsフォルダを無効化している場合は、以下のURLの表示が「Not Found」になることを確認します。
http://サイトのURL/icons/README
注意
ブラウザのキャッシュが表示されることがあります。正しく設定しているにもかかわらずページが表示される場合は、ブラウザのキャッシュをクリアして試して下さい。
2-2. ディレクトリ内容一覧表示(2.2系/2.4系)
apacheには公開しているディレクトリ内容を一覧表示するディレクトリリスティング機能が実装されています。本機能が有効になっているディレクトリを表示すると、以下のようなインデックス画面が表示されます。
デフォルトでは、ドキュメントルートで本機能が有効になっています。この場合、Webサーバの公開ディレクトリに直接アクセスを行うと、ディレクトリ内に存在するファイルの一覧が表示され、ディレクトリ内のファイルの一覧を取得することが可能です。
このリスクが原因となる被害の大きさは、ファイルの重要度によって異なりますが、個人情報が格納されたデータファイル等の存在が知られてしまった場合などには、深刻な問題となる恐れがあります。ディレクトリでファイルの一覧が表示されることにより、外部に流出する情報として、例えば、以下のような内容が考えられます。
ファイル一覧機能により、外部に流出する可能性がある情報
- 公開を意図しないファイル
- バックアップファイル
- 一時ファイル
- 隠しファイル(ドットで始まるファイル名のファイル)
- ファイルの命名規則
- 設定ファイルによるサーバ設定情報
- スクリプトファイルによるサーバ内部処理情報
上記のようなリスクがありますので、一覧表示機能は無効にしておきます。
2-2-1. ディレクトリ内容一覧表示への対応
Webサーバの設定を変更してディレクトリ内の一覧を表示させないようにします。ただし、ディレクトリ内の一覧を表示しない(ディレクトリリスティングの無効化)設定としていてもファイル名を直接指定することによりファイルを閲覧することが可能です。
サーバの公開ディレクトリには重要な機密情報を含むファイルやサービス提供上不要なファイルを置かないよう注意が必要です。
2-2-2. 設定変更の内容
apacheの設定ファイルである httpd.confを編集し、該当するディレクトリの「Indexes」オプションを無効にしてください。
例えば、ドキュメントルートのインデックスを無効にする場合、設定ファイルの以下を変更します。
code
Directory "/var/www/html"
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
上記部分に含まれる
code
Options Indexes FollowSymLinks
のIndexesを削除して以下のように変更します。
code
Options FollowSymLinks
変更の完了後、ファイルを保存します。ファイルを保存出来たら、設定ファイルの確認とApacheを再起動して設定を有効化します。
Apacheの再起動後、ブラウザの画面から確認します。
以前にディレクトリリスティング機能で表示されていた一覧を表示して「Forbiddon」に変更されれば、ディレクトリ一覧表示の無効化は完了です。
2-3. HTTP TRACEメソッドのサポート(2.2系/2.4系)
ApacheでHTTP TRACEメソッドがサポートされており、Webアプリケーション上にクロスサイトスクリプティングの脆弱性が存在する場合、HTTPリクエストヘッダに含まれる認証情報等が取得される可能性があります。
Webアプリケーションにクロスサイトスクリプティングの脆弱性がある場合に、TRACEメソッドを利用してHTTPリクエストヘッダの認証情報等を盗み出す攻撃手法(XST:Cross-Site Tracing)が報告されているため、TRACEメソッドを無効にすることでセキュリティを確保できます。
2-3-1. HTTP TRACEメソッドへの対応
Apache では以下の点を設定変更することでHTTP TRACEメソッドを無効化できます。
Apache HTTP Serverのバージョンが1.3.34以上または2.0.55以上の場合
設定ファイル(httpd.conf)の「TraceEnable」ディレクティブを「off」に設定し、Apache を再起動します。
httpd.confの一番最後に以下を追記し、ファイルを保存します。
code
## HTTP TRACE off
TraceEnable off
ファイルの保存後、ファイルの確認とApacheの再起動を行います。
2-3-2. HTTP TRACEメソッド無効化の確認
HTTP TRACEメソッドが無効化されているかの確認はtelnetコマンドで行います。
telnet コマンドでlocalhostの80番へアクセスを行い、出力されるヘッダを確認できます。
telnetの利用方法は
$ telnet ホスト名(localhost) アクセスポート(80)
という形でホストのポートへアクセスが可能です。殆どのポートへアクセスできますので、覚えておくと便利なコマンドです。
telnetがインストールされていない環境では、telnetのインストールが必要です。
以下の手順でインストールできます。(Redhat/CentOSの場合)
command
# yum -y install telnet
以下はHTTP TRACEが有効時の結果です。
command $ telnet localhost 80 Trying ::1... Connected to localhost. Escape character is '^]'. OPTIONS / HTTP/1.1 入力 host: localhost 入力 [enterキー] HTTP/1.1 200 OK Date: Thu, 11 Jun 2015 06:58:08 GMT Server: Apache Allow: GET,HEAD,POST,OPTIONS,TRACE Content-Length: 0 Connection: close Content-Type: httpd/unix-directory Connection closed by foreign host.
Allow にTRACEが表示され、HTTP TRACEが有効になっていることが確認できます。
以下はHTTP TRACEを無効にした場合の結果(レスポンス)になります。
command $ telnet localhost 80 Trying ::1... Connected to localhost. Escape character is '^]'. OPTIONS / HTTP/1.1 入力 host: localhost 入力 [enterキー]HTTP/1.1 200 OK Date: Thu, 11 Jun 2015 07:00:08 GMT Server: Apache Allow: GET,HEAD,POST,OPTIONS Content-Length: 0 Connection: close Content-Type: httpd/unix-directoryConnection closed by foreign host.
Allow にTRACEが削除され、HTTP TRACEが無効になっていることが確認できます。
2-4. X-Frame-Optionsヘッダを設定する(2.2系/2.4系)
クリックジャッキング攻撃の対策となるX-Frame-Optionsヘッダを設定します。
クリックジャッキングとは、ユーザが意図しない操作(ボタンやリンクのクリック)を実行させられる攻撃です。
(ここではクリックジャッキングの詳細は割愛します。)
例えば、情報の公開・非公開設定がユーザの意図に反して気づかないうちに変更された結果
情報漏えい事故につながる等の被害が想定されます。
その為、X-Frame-Optionsヘッダを設定します。
2-4-1. X-Frame-Optionsヘッダの設定手順
X-Frame-Optionsヘッダを付与するには、apacheのモジュールである、[mod_headers]モジュールを利用します。apacheをソースからインストールしている場合、mod_headers機能自体が含まれていない可能性があります。その場合、ソースをリコンパイルして、mod_headersを有効にします。
配布されているパッケージの場合、殆どの環境でmod_headersはapacheの機能として含まれています。
mod_headersを有効にするには、httpd.conf内にある、以下のコメントアウトを外します。
(コメントされていない場合は本手順は不要です。)
code
LoadModule headers_module modules/mod_headers.so
その後、httpd.confへ以下のheaderディレクティブを追加します。
オプションに関しては、"DENY"、"SAMEORIGIN"が選択できますが、DENYにした場合、ウェブサイトの表示に影響がある可能性を考える
"SAMEORIGIN"を設定します。
httpd.confの適当な場所(例えば最後)に以下の記載を追記します。
code
Header append X-FRAME-OPTIONS "SAMEORIGIN"
ファイルの保存後、設定ファイルの確認とApacheの再起動を行います。
2-4-2. X-Frame-Optionsヘッダ設定の確認
X-Frame-Optionsヘッダ設定の確認は、HTTP TRACEの場合と同様にtelnetコマンドを利用して行います。
以下は設定前のレスポンスです。
command $ telnet localhost 80 Trying ::1... Connected to localhost. Escape character is '^]'. OPTIONS / HTTP/1.1 入力 host: localhost 入力 [enterキー]HTTP/1.1 200 OK Date: Thu, 11 Jun 2015 07:00:08 GMT Server: Apache Allow: GET,HEAD,POST,OPTIONS Content-Length: 0 Connection: close Content-Type: httpd/unix-directoryConnection closed by foreign host.
X-Frame-Optionsは含まれていません。
設定後のHTTPレスポンスは以下のようになります。
command $ telnet localhost 80 Trying ::1... Connected to localhost. Escape character is '^]'. OPTIONS / HTTP/1.1 入力 host: localhost 入力 [enterキー]HTTP/1.1 200 OK Date: Thu, 11 Jun 2015 07:00:08 GMT Server: Apache X-FRAME-OPTIONS: SAMEORIGIN Allow: GET,HEAD,POST,OPTIONS Content-Length: 0 Connection: close Content-Type: httpd/unix-directoryConnection closed by foreign host.
レスポンスに「X-FRAME-OPTIONS: SAMEORIGIN」が含まれていることから、設定が有効になっていることがわかります。
2-5. apache バージョンの表示(2.2系/2.4系)
apacheのバージョン情報を取得することができる設定がデフォルトでは有効になっています。バージョン情報の表示は直接の脆弱性とは関係ありませんが、利用しているapacheに脆弱性が存在する場合に脆弱性を突いた攻撃等を実施する手がかりとして利用される恐れがあります。
サービスへのアクセス時に表示されるこれらの情報はバナー情報と呼ばれ、バナー情報の隠蔽は攻撃者に攻撃の手がかりを与えないために有用な対策となります。その為、バナー情報はできる限り、少ない表示へと変更することでセキュリティを向上できます。
2-5-1. apacheバージョン表示への対策Version 2.2
※本設定は2.2系と2.4系で設定が異なります。
apacheバージョン表示の無効化は、httpd.confへの設定で対応できます。
httpd.confの「ServerTokens」を「ProductOnly(もしくはProd)」
「ServerSignature」ディレクティブを「off」に設定し、Apacheを再起動します。
以下のディレクティブを探して、該当パラメーターを変更します。
code
ServerTokens ProductOnly
ServerSignature off
設定変更後にApacheの再起動を実行して、設定を有効にします。
2-5-2. Apacheバージョン表示への対策Version 2.4
※本設定は2.2系と2.4系で設定が異なります。
Apacheバージョン表示の無効化は、httpd.confへの設定で対応できます。
2.4系ではhttpd.confにデフォルトでServerTokensとServerSignatureディレクティブが記載されていません。
本設定を2.4系で有効にするには、httpd.confにServerTokensとServerSignatureディレクティブを追記します。
例えばhttpd.confの一番最後に以下の記載を追記します。
code
ServerTokens ProductOnly
ServerSignature off
設定変更後にApacheの再起動を実行して、設定を有効にします。
2-5-3. Apacheバージョン表示、無効化の確認
バージョン表示が無効化にされているかは、これ以前の項目と同様にtelnetコマンドで行います。
以下はデフォルトの設定で確認した結果になります。
command $ telnet localhost 80 Trying ::1... Connected to localhost. Escape character is '^]'. OPTIONS * HTTP/1.1 入力 host:localhost 入力 [enterキー]HTTP/1.1 200 OK Date: Fri, 05 Jun 2015 23:34:46 GMT Server: Apache/2.2.15 (CentOS) Content-Length: 0 Connection: close Content-Type: text/plain; charset=UTF-8Connection closed by foreign host.
設定変更後には以下のようにApacheのバージョンが隠匿されます。
command $ telnet localhost 80 Trying ::1... Connected to localhost. Escape character is '^]'. OPTIONS * HTTP/1.1 入力 host:localhost 入力 [enterキー]HTTP/1.1 200 OK Date: Fri, 05 Jun 2015 23:34:46 GMT Server: Apache Content-Length: 0 Connection: close Content-Type: text/plain; charset=UTF-8Connection closed by foreign host.
3. Apache + mod_ssl利用時の脆弱性
Apache上でhttpsを利用している場合、SSLのもつ脆弱性への対応が必要となります。
本内容はhttps通信を設定している場合のみ、確認・設定する形です。
大きく二つの脆弱性と対応について記載していきます。
なお、mod_sslの利用するOpenSSLというアプリケーションについて、以下のバージョンは致命的な脆弱性である「heartbleed」が存在するため、できるだけ早いバージョンアップをお勧めします。
heartbleedが存在するOpenSSLのバージョン
- OpenSSL 1.0.1 から 1.0.1f
- OpenSSL 1.0.2-beta から 1.0.2-beta1
heartbleedについての詳細は本記事では割愛します。以下のページに詳細が記載されていますので、参考にして下さい。
OpenSSLのバージョン確認とバージョンアップはCentOS/Redhat系ディストリビューションの場合、以下のように行います。
バージョン確認
command
# yum info openssl
バージョンアップ
command
# yum install openssl
3-1. SSL/TLSにおける安全性の低い暗号スイートのサポート(2.2系/2.4系)
サーバ側のSSL/TLS設定において安全性の低い暗号スイート(プロトコル・暗号アルゴリズム、鍵長、ハッシュ関数)をサポートしている場合、安全性の低い暗号スイートが利用されることで、通信内容の盗聴につながる可能性が高まります。
安全性の低いプロトコル・暗号化アルゴリズム、鍵長、ハッシュ関数を無効化し、安全性の高いプロトコル・暗号化アルゴリズム、鍵長、ハッシュ関数のみをサポートすることでセキュリティを確保できます。
3-1-1. 安全性の低い暗号スイートのサポートの無効化Version 2.2
Apache+mod_ssl環境で利用するSSL設定ファイルssl.confのおよびディレクティブ
に安全性の高いプロトコルおよび暗号スイートのみ許可するように設定します。
ssl.confのパスはApacheをパッケージからインストールしている場合、/etc/httpd/conf.d/ssl.confです。
ssl.confの以下を変更します。
code
SSLCipherSuite ALL:!aNULL:!eNULL:!EXP:!RC2:!DES:!IDEA:!SEED:!MD5
3-1-2. 安全性の低い暗号スイートのサポートの無効化Version 2.4
2.4系でも設定部分は同じくssl.confになります。ssl.confのパスはApacheをパッケージからインストールしている場合、/etc/httpd/conf.d/ssl.confです。
ssl.confの以下を変更します。デフォルトでは
code
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
となっている部分を
code
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!3DES:!RC4:!DH
に変更して拒否する暗号化方式を追加します。
次に
code
#SSLHonorCipherOrder on
のコメントアウトを
code
SSLHonorCipherOrder on
として外します。(行頭の「#」を削除します)
3-1-3. RC4を含む暗号スイートをすべて無効化した場合の注意事項
スマートフォンを除く多くの携帯電話等の端末においてはAESや3DESがサポートされておらず、RC4を含む暗号スイートをすべて無効化した場合、携帯電話等の端末からのHTTPSによるアクセスができなくなる可能性があります。(主にガラケーと呼ばれる携帯端末が対象)
そのため、RC4すべての無効化は携帯電話等のモバイル向けサイトにおいてサービス提供範囲の減少につながるため注意が必要です。
3-2. ssl.confの設定変更SSLv2 および SSLv3 を無効にする
SSLv2、SSLv3には大きな脆弱性が存在しますので、v2、v3を無効化します。
ssl.confに以下の記載を追加します。
code
SSLProtocol all -SSLv2 -SSLv3
追加後、ssl.confファイルを保存して、Apacheの再起動を行います。
3-2-1. sslv2,v3無効化の確認
opensslコマンドを利用してsslv2、sslv3で接続できないことを確認します。
コマンドで指定する「ssl_site_ip_or_url」については、テストする環境に合わせて下さい。
command
$ openssl s_client -connect ssl_site_ip_or_url:443 -ssl2
以下はsslv2を利用して、接続ができない場合の結果になります。
command
$ openssl s_client -connect ssl_site_ip_or_url:443 -ssl2
CONNECTED(00000003)
140093515282248:error:1407F0E5:SSL routines:SSL2_WRITE:ssl handshake failure:s2_pkt.c:429:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 48 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : SSLv2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1433547666
Timeout : 300 (sec)
Verify return code: 0 (ok)
---"
同様にopensslコマンドを利用してsslv3で接続ができないことを確認します。
コマンドで指定する「ssl_site_ip_or_url」については、テストする環境に合わせて下さい。
command
$ openssl s_client -connect ssl_site_ip_or_url:443 -ssl3
以下はsslv3を利用して、接続ができない場合の結果になります。
code
CONNECTED(00000003)
140622255990600:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1259:SSL alert number 40
140622255990600:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:598:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : SSLv3
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1433548591
Timeout : 7200 (sec)
Verify return code: 0 (ok)
---
3-3. SSL/TLSプロトコルのデータ圧縮機能における情報漏えいの脆弱性(TLS CRIME)
SSL/TLSプロトコルのデータ暗号化時の圧縮機能が有効になっている場合、SSL/TLSによって暗号化された通信内容の一部が漏えいする可能性があります。
暗号化前のデータ長(サイズ)の情報からデータ内容の総当たりによる推測が行われた場合、Cookie等のHTTPヘッダの一部が取得される脆弱性が存在します。
3-3-1. SSL/TLSプロトコルのデータ圧縮機能への対応
SSL/TLSにおけるデータ圧縮処理(Compression)機能を無効化します。本設定はApacheのバージョンにより対応方法が異なります。
運用している環境でApacheのバージョンを確認の上、バージョンに合わせた設定を行います。
Apache 2.2またはApache 2.4およびOpenSSLを利用する場合
本対策は、Apache2.4.3以降およびOpenSSL 0.9.8以降の組み合わせと、Apache 2.2.24以降およびOpenSSL 1.0.0以降の組み合わせにおいて有効な設定です。
RedHat等のベンダーから提供されているhttpdパッケージによっては、設定が有効とならない場合があります。
Apache設定ファイル(ssl.conf)のSSLCompressionディレクティブを「Off」に設定してください。
[設定例]ssl.confに以下を追加します。
code
SSLCompression off
Red Hat Enterprise Linux 5.3以降のApacheのパッケージの場合
本対策はRed Hat Enterprise Linux 5.3以降に含まれるhttpdパッケージを使用している場合において有効な設定です。
Apache環境変数設定ファイル(/etc/sysconfig/httpd)に以下の設定を追加して、Apacheサービスを再起動してください。
code
export OPENSSL_NO_DEFAULT_ZLIB=1
3-3-2. SSL/TLSプロトコルのデータ圧縮無効を確認
opensslコマンドを利用して、レスポンスから、無効になっていることを確認します。
[ssl_site_ip_or_url]部分については、テストする環境に合わせて下さい。
command
$ openssl s_client -connect ssl_site_ip_or_url:443 -crlf -tls1
以下が無効になっている場合のレスポンス(該当部分のみ抜粋)
CompressionがNONEになっていることが確認できます。
code
SSL handshake has read 3076 bytes and written 353 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
4. phpでの対応
phpでのセキュリティ設定もいくつかありますが、ここでは比較的簡単に設定できる内容(だけども意外と設定されていない)を記載します。
phpにはHTTPヘッダーにバージョン情報が含まれる設定がデフォルトとなります。試しにウェブサイト上にあるphpファイルにリクエストを送信してみます。
バージョン表示が有効になっている場合、以下のようにphpのバージョンが表示されます。
command $ telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /index.php HTTP/1.0 入力 [enterキー]HTTP/1.1 200 OK Server: apache Date: Sat, 23 Jan 2016 02:30:05 GMT Content-Type: text/html; charset=UTF-8 Connection: close Vary: Accept-Encoding Vary: Accept-Encoding X-Powered-By: PHP/5.4.41
バージョン情報は通常、伏せるべき情報であり、これが公開されることは好ましい状況ではありませんので、表示されないように変更します。
また、このバージョンが表示される設定が有効になっている場合、イースターエッグというphpのちょっとした画面が表示されてしまいます。(PHP 5.5.0からはイースターエッグは無効になっています。)
この画面自体は脆弱性になることはありませんが、第三者の脆弱性チェックなどを実施した際に、ここをチェックしている場合がありますので、表示できないようにしておいたほうが無難です。イースターエッグは以下のように確認できます。
ブラウザからサーバー上のphpファイルにアクセスする際に、以下の文字列をURLの末尾に追加します。
code
?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
この文字列が追記されていると、以下のようなクレジットの画面が表示されます。
この2つを表示しないように設定を変更していきます。
4-1. phpバージョン表示の無効化
phpのバージョン表示無効化はphp.iniというphpの設定ファイルから行います。本設定はphp5系を前提にしていますが、7.2でも同様に設定が可能です。php.iniは通常、RPMなどのパッケージがからインストールした場合/etcディレクトリ
ソースからコンパイル、インストールした場合は、/usr/local/etcディレクトリにあることが殆どです。(ソースの場合、インストール後に任意の場所に設置します。)
php.iniの場所が分からない場合は
command
# locate php.ini
とコマンドを実行することで、配置先のパスが表示されます。
php.iniファイルの場所が分かったら、viなどのエディタで、以下を適当な場所へ追記します。
code
expose_php = Off
もし既に expose_php = On という記載がある場合は、OnをOffに変更します。
追記(もしくは変更)後、php.iniファイルを保存して、Apacheを再起動します。
エラーが出力されなければ、phpのバージョン表示は無効化されています。
4-2. php設定変更後の動作確認
4-1. で設定変更したphpの動作確認をしてみます。
ウェブサイト上にあるphpファイルにリクエストを送信してみます。
バージョン表示が無効になっている場合、以下のようにphpのバージョン部分が表示されなくなります。
command $ telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /index.php HTTP/1.0 入力 [enterキー]HTTP/1.1 200 OK Server: Apache Date: Sat, 23 Jan 2016 02:34:03 GMT Content-Type: text/html; charset=UTF-8 Connection: close Vary: Accept-Encoding Vary: Accept-Encoding
同様にイースターエッグについても、確認してみます。ブラウザに文字列を追加したURLを入力しても、イースターエッグが表示されないことが確認できます。
上記でPHPの設定変更は完了です。かんたんな設定変更ですが、意外と盲点になっています。再度、確認することをお勧めします。
5. まとめ
上記がApacheと一部SSLの機能を利用している場合に設定したほうが良いセキュリティ面での設定10点になります。本記事に記載した内容については、見落としが多い部分を見直す良い機会にもなるかと思います。意外と設定漏れが多くてびっくりするかもしれませんね。
本記事の設定変更の内容をまとめると以下になります。
Apacheセキュリティ設定まとめ
- Apacheデフォルトコンテンツの非表示
- ディレクトリ内容一覧表示の無効化
- http TRACEメソッドのサポート
- X-Frame-Optionsヘッダを設定する
- Apache バージョンの表示の無効化
- SSL/TLSにおける安全性の低い暗号スイートのサポート
- ssl.confの設定変更SSLv2 および SSLv3 を無効にする
- SSL/TLSプロトコルのデータ圧縮機能における情報漏えいの脆弱性(TLS CRIME)
- PHPのバージョン表示無効化
- PHPイースターエッグの無効化
是非、もう一度、Apacheの設定を見直してみて下さい。
[st_af name="linuxserver-job-bottom"]