Apache2.4のセキュリティ設定 (2.2からの移行)

migrate apache

Apache を 2.2 から 2.4 に移行したので手順を書いておきます。
SSL/TLSセキュリティ設定例 ( 2015年時点 ) としても使えるかと思います。
※2015年9月 タイトル変更

はじめに

5月の Logjam Attack への対策で、Apache 2.2では DHパラメータが 1024ビット固定という問題が発覚しました ( Logjam Attack 対策としては2048ビット以上を推奨 )。
そのうち 2.4 にしようと思いつつ時間がなくて放置状態でしたが、ようやく時間ができたので2.4に移行しました。

以下手順を書いておきます。

Apache 移行ついでに Tomcat と java もバージョンアップしたのでこれについても併せて記しておきます。

環境

環境は以下。
移行前後共にyumでのインストールです。ソースからのビルド等は行いません ( 管理コストが上がるので )。

OS Amazon Linux (64bit)

移行前

Apache 2.2.29-1.5.amzn1
Tomcat 7.0.62-1.10.amzn1
Java 1.7.0.85-2.6.1.3.61.amzn1

移行後

Apache 2.4.12-1.60.amzn1
Tomcat 8.0.23-1.54.amzn1
Java 1.8.0.51-1.b16.6.amzn1

前準備

バックアップ

サーバや必要なデータのバックアップ等適宜行ってください。

弊社の移行対象は AWS EC2 上で動作しているため、適当な手段で移行前サーバから AMI ( コピー) を作成し、このイメージからインスタンスを起動して作業を行っています。

以下このコピーしたインスタンスにおける作業となります。

サービス停止

Apache、及び、Tomcatを停止します。

$ sudo /etc/rc.d/init.d/httpd stop
$ sudo /etc/rc.d/init.d/tomcat7 stop

アプリケーション、及び、設定ファイルのコピー(バックアップ)

現状のアプリ、及び、設定を適当なディレクトリにコピーしておきます。

Apache 関連

  • /etc/httpd/conf 下の設定ファイル
  • /etc/httpd/conf.d 下の設定ファイル

Tomcat 関連

  • /usr/share/tomcat7/webapps 下のWebアプリケーション
  • /usr/share/tomcat7/conf 下の設定ファイル

パッケージのアップグレード

Javaのアップグレード

Java1.8のインストール

先に Java1.7 を削除すると依存関係で問題が出る場合があるので、1.8 をインストールします。

$ sudo yum install java-1.8.0-openjdk

Java1.7のアンインストール

古いjavaを ( 必要に応じて ) アンインストールします。

$ sudo yum erase java-1.7.0-openjdk

Tomcatのアップグレード

Tomcat8のインストール

Tomcat8をインストールします。

$ sudo yum install tomcat8

以下関連パッケージもインストールされる。

  • tomcat8-lib
  • tomcat8-servlet-3.1-api
  • tomcat8-jsp-2.3-api
  • tomcat8-el-3.0-api

Tomcat7のアンインストール

以下パッケージをアンインストールします ( yum erase 等で行ってください )。

  • tomcat7
  • tomcat7-lib
  • tomcat7-servlet-3.0-api
  • tomcat7-jsp-2.2-api
  • tomcat7-el-2.2-api

Apacheのアップグレード

Apache2.2のアンインストール

2.2がインストールされた状態で2.4をインストールしようとしてもコンフリクトしてインストールできないため、2.2を先にアンインストールします。
以下パッケージをアンインストールします。モジュール類もアンインストールされます。

  • httpd
  • httpd-tools

Apache2.4のインストール

以下パッケージをインストールします ( httpd24-toolsも併せてインストールされる )。

  • httpd24

Apache2.4モジュールのインストール

以下パッケージ ( mod_ssl、及び、mos_security ) をインストールします。

※以下は弊社で利用しているもの。環境に併せて適宜変更して下さい。

※mod_security に関しては WAF(Web Application Firewall)でWebサイトを脆弱性から守る を参照

  • mod24_ssl
  • mod24_security
  • mod_security_crs
  • mod_security_crs-extras

Apache2.4設定

Apache2.4の設定を行います。
2.4に移行を行った際に気付いた設定ファイルの変更点として以下のものがあります。

  • LoadModule 設定は conf.modules.d/*.conf で設定する形に変更
    httpd.conf では設定しない形に変更になっています。
  • AddIconByType, AddIcon 等の mod_autoindex 関連のディレクティブはconf.d/autoindex.conf に移動
    ディレクトリインデックス機能は使用しないため、これら設定はコメントアウトしている場合も多いかと思います。2.2時代は頑張ってコメントアウトしていましたが、2.4では autoindex.conf を削除/リネームする事で対応可能になりました。
  • conf.d/userdir.conf が追加
    conf.d ディレクトリ下に userdir.conf が追加されています。mod_userdir は無効にする場合も多いと思いますが、その際は上記 autoindex.conf 同様削除/リネームする等しましょう。

※記事執筆当初は削除/リネームすると書いたが、この場合パッケージアップデートで復元してしまう場合があるため、空ファイルにするか設定をコメントアウトする方法を推奨 (以下同様)。

これら変更を踏まえて設定を行います。

httpd.confの設定

httpd.conf ( /etc/httpd/conf/httpd.conf ) を設定します。
以下項目を設定します ( 抜粋 )

ServerTokens Prod                  # 2.2のときと同様
ServerAdmin aaa@agilegroup.co.jp   # <= 管理者メールアドレス設定
ServerName www.agilegroup.co.jp:80 # サーバ名設定
<Directory "/var/www/html">
    #Options Indexes FollowSymLinks
    Options FollowSymLinks    # <= Indexesは削除し、ディレクトリリスティングは無効に
    ...
</Directory>

※ServerSignature は2.4ではデフォルト off になりました。

DOS攻撃 (slowloris) 対策

Apache 2.2.15 以降で reqtimeout_module が追加になっています。このモジュールを利用してDOS攻撃用 ( slowloris ) の対策が行えます。
必要に応じて設定すればよいでしょう。

RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

上記はデフォルト値
ヘッダ/ボディが20秒で送信完了しない場合エラーとなる。
500バイト/秒以上データが送られている間は最大タイムアウト値まで延長する。

モジュール設定

設定は /etc/httpd/conf.modules.d/ ディレクトリ以下に置かれるようになりました。
以下設定ファイルに分かれています。

※00-ssl.conf, 10-mod_security.conf はそれぞれ mod_ssl, mod_security インストール時

ファイル名概要
00-base.conf基本モジュール
00-dav.confWebDAV 関連モジュール
00-lua.confmod_lua
00-mpm.confMPM 関連
prefork, worker, event を選択可能になっています。
00-optional.conf一般的には使われる事が少ないと思われるモジュール
00-proxy.confプロキシ関連モジュール
01-cgi.confCGI 関連モジュール
00-ssl.confmod_ssl 関連
10-mod_security.confmod_security 関連

不要なモジュールに関しては LoadModule設定をコメントアウトする等編集を行う事になります。

00-base.conf

00-base.conf を編集します。

※以下はほぼ最小限のモジュールに絞った一例です。環境に応じて適宜変更して下さい。

LoadModule access_compat_module modules/mod_access_compat.so
#LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
#LoadModule allowmethods_module modules/mod_allowmethods.so
#LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_core_module modules/mod_authn_core.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_socache_module modules/mod_authn_socache.so
LoadModule authz_core_module modules/mod_authz_core.so
#LoadModule authz_dbd_module modules/mod_authz_dbd.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
#LoadModule authz_host_module modules/mod_authz_host.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule cache_disk_module modules/mod_cache_disk.so
#LoadModule data_module modules/mod_data.so
#LoadModule dbd_module modules/mod_dbd.so
#LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
#LoadModule dumpio_module modules/mod_dumpio.so
#LoadModule echo_module modules/mod_echo.so
#LoadModule env_module modules/mod_env.so
LoadModule expires_module modules/mod_expires.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule filter_module modules/mod_filter.so
LoadModule headers_module modules/mod_headers.so
LoadModule include_module modules/mod_include.so
#LoadModule info_module modules/mod_info.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule logio_module modules/mod_logio.so
#LoadModule macro_module modules/mod_macro.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule mime_module modules/mod_mime.so
#LoadModule negotiation_module modules/mod_negotiation.so
#LoadModule remoteip_module modules/mod_remoteip.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
#LoadModule request_module modules/mod_request.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
#LoadModule socache_dbm_module modules/mod_socache_dbm.so
#LoadModule socache_memcache_module modules/mod_socache_memcache.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule status_module modules/mod_status.so
#LoadModule substitute_module modules/mod_substitute.so
#LoadModule suexec_module modules/mod_suexec.so
# This module will cause Apache to fail to load if there is no DNS
# LoadModule unique_id_module modules/mod_unique_id.so
LoadModule unixd_module modules/mod_unixd.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule version_module modules/mod_version.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so

00-dav.conf

WebDAVを利用しないなら全部コメントアウト

00-lua.conf

mod_lua を利用しないならコメントアウト

参考 : Apache 2.4.1のmod_luaでApacheに介入する(mod_rewriteの終焉?)

00-mpm.conf

MPMは使いたいものを有効にする。

※デフォルトは prefork になってました。

00-optional.conf

デフォルトで全部コメントアウトされている。使いたいものがあれば設定を。

00-proxy.conf

プロキシ使わないなら全部コメントアウト。
弊社環境では Apache, Tomcat を利用して連携しているので、以下を有効に

  • mod_proxy
  • mod_proxy_ajp

00-ssl.conf

ssl/tls を利用する場合有効に

01-cgi.conf

CGIを使っていないなら全部コメントアウト

10-mod_security.conf

mod_seciruty を利用する場合有効に

conf.d 以下の設定

conf.d 以下には以下のファイルがインストールされます。

※mod_security.conf、ssl.conf はそれぞれ mod_security、mod_ssl インストール時

ファイル名概要
autoindex.confmod_autoindex関連設定。上で書いたようにディレクトリリスティングを無効にする場合、ファイルを削除するかIncludeされないようリネームしてしまいましょう。
notrace.confTraceEnable off 設定が記述されています。
クロスサイトトレーシング対策のためにこの設定は有効なままにしておくべきです。
userdir.confmod_userdir 関連設定。利用しない場合、autoindex.confと同様に削除 or リネーム。
welcome.confApache デフォルトのトップページ表示用。
こいつも削除 or リネームして無効にしましょう。
mod_security.confmod_security 関連設定
ssl.confssl/tls 関連設定

mod_security.conf

mod_security に関しては、Apache 2.2 の場合と設定内容は同じで大丈夫です。
バックアップしておいた設定ファイルを戻せばOKでしょう。
LoadModule 設定が記述されている場合、コメントアウトしましょう ( conf.modules.d/10-mod_security.conf で設定されているので )。

参考 : WAF(Web Application Firewall)でWebサイトを脆弱性から守る

ssl.conf

以下設定をおこなえばよいかと思います ( 抜粋 )。

基本
SSLProtocol all -SSLv2 -SSLv3   # SSLv2、SSLv3 は禁止 ( -SSLv3追記 )
# SSLCipherSuiteは一例(IPAの推奨セキュリティ型)、移行前の設定を基に見直し
SSLCipherSuite SSLCipherSuite DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:CAMELLIA128-SHA:AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA:AES256-SHA
SSLHonorCipherOrder     on      # 暗号スイートの優先順位指定

SSLCompression off     # 最新版ならデフォルトで無効
SSLSessionTickets off   # Session Ticket機能を無効化

# 各種証明書関連ファイル設定 - 移行前の設定を記述
SSLCertificateFile ...
SSLCertificateKeyFile ...
SSLCACertificateFile ...

# HTTP Strict Transport Security ( HSTS ) 設定 - 必要に応じて
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains"

実際の SSLCipherSuite は Webサーバの SSL/TLS 設定 (2015/5) あたりも参考にしてください。


OCSP Stapling

Apache 2.3.3 以降で OCSP Stapling 設定が可能になったので、この設定も有効にします。

参考 : Apache - Enable OCSP Stapling

SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/run/ocsp(128000)

OCSP Stapling が有効かどうかは以下コマンドで確認できます ( ホスト名は適宜変更して下さい )。

$ openssl s_client -connect localhost:443 -tls1 -status | head
...
OCSP response:
======================================
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
    Version: 1 (0x0)
...

OCSP Stapling が無効な場合、以下のように出力されます。

OCSP response:  no response sent

DH Parameter

Apache 2.4.8 移行であれば、Logjam Attack 対策 の一つである以下DHパラメータの設定が行えると思ったのですが、

SSLOpenSSLConfCmd DHParameters "{path to dhparams.pem}"

openssl が 1.0.2 以降である必要があり設定できませんでした。

※記事執筆時点では Amazon Linux の openssl は 1.0.1k-10.87


Public Key Pinning

Public Key Pinning も設定しようと思ったのですが、調べてみるとバックアップ用の第2ピンの指定が必須となっている事や、手順/体制をきちんと確定してからでないと運用でドハマリしそうなので今回は設定からは外しました。

参考 : Public Key Pinning


その他設定

Webアプリケーションの設定等、上記以外の設定をバックアップ先から戻します。

設定の確認

設定を編集し終わったら問題ないか確認しておきます。

$ sudo httpd -t
Syntax OK

Tomcat8設定

設定ファイルの編集

必要に応じて編集します。

tomcat8.conf

/usr/share/tomcat8/conf/tomcat8.conf を編集します ( 以下抜粋 )。

※JAVA_OPTSは Magnolia CMS 用に編集

JAVA_OPTS="-server -Dfile.encoding=UTF-8 -Xmx512m -Xminf0.1 -Xmaxf0.3 -Djava.library.path=/usr/lib"

LANG="ja_JP.UTF-8"

※ MaxPermSize オプションのサポートは Java8でなくなったので指定から削除した。

logging.properties

/usr/share/tomcat8/conf/logging.properties を編集します ( 以下抜粋 )。
開発環境でもない限り通常コンソールハンドラは不要なので削除します。

#.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
.handlers = 1catalina.org.apache.juli.AsyncFileHandler

上記以外の設定ファイルもアプリケーションの要件に併せて適宜設定します。

アプリケーションのデプロイ

バックアップしておいたアプリケーションをデプロイします。
/usr/share/tomcat8/webapps ディレクトリ下にバックアップしていたアプリケーションをコピーします。

コピー後は所有権を tomcat:tomcat に変更します。
( 以下は webapps/ROOT アプリケーションの場合 )

$ sudo chown tomcat:tomcat /usr/share/tomcat8/webapps/ROOT -R

サーバの起動

設定が完了したらサーバを起動します。
必要に応じて自動起動設定もしておきましょう。

Tomcat8

$ sudo /etc/rc.d/init.d/tomcat8 start

Apache2.4

$ sudo /etc/rc.d/init.d/httpd start

確認

サーバを起動したら、動作確認を行いましょう。

アプリケーションの動作確認

先ずは Web サイト、Web アプリケーションが正しく動作しているか確認しましょう。

SSL/TSL設定確認

SSL/TLS設定が正しく適応されているかどうか確認しましょう。
サーバの SSL/TLS 設定に関しては以下サイトで確認する事ができます。

上記サイトでも OCSP stapling が有効になっている事を確認できました。

Logjam Attack 対策で行ったチェックも再度実行してみます。
以下サイトで確認できます。

移行前は DHE が Common 1024-bit Prime であるため警告表示となっていましたが、移行後は 2048-bits となり警告表示が消えました。

まとめ

弊社では上記手順で無事にアップグレードできました。
動作確認後は Elastic IP を割り当て直して、サーバ移行は完了。

2.2.x から 2.4.x に移行する事で DHパラメータの1024ビット制限がなくなったり、OCSP Stapling 設定を追加できたりと、セキュリティ面でもより問題の少ない構成となったと言えるのではないかと思います。

セキュリティ面の向上を狙って移行を試してみるのもありではないでしょうか。

 

※ Apache 2.2から2.4への移行やWebサーバ構築等ご相談に応じます。お気軽にお問い合わせください。