WAF2の導入

WAF2の導入

HTTP/2環境へのWAFの導入手順

※WAF2と勝手に名前を付けましたが、HTTP/2対応のWAFの事をここではWAF2としました。
WAF(Web Application Firewall)のModSecurityを導入します。

導入する環境

ModSecurity2.9.2はHTTP/2に対応しているWAFです。
最新バージョンは公式HPで確認が必要です。

導入するマシンのサーバーソフトのバージョンです
OS:CentOS 7.6.1810(Core)
OpenSSL1.1.1
Apache 2.4.39
MySQL8.0.16
PHP7.3.5
WordPress5.2.0

インストール

事前準備

# yum install libxml2-devel lua-devel libcurl-devel expat-devel
ダウンロード
# cd /usr/local/src/
# wget https://www.modsecurity.org/tarball/2.9.2/modsecurity-2.9.2.tar.gz
展開
# tar zxvf modsecurity-2.9.2.tar.gz
Configure
# cd modsecurity-2.9.2
# ./configure \
> --with-apxs=/usr/local/apache2/bin/apxs \
> --with-apr=/usr/local/apache2/bin/apr-1-config \
> --with-apu=/usr/local/apache2/bin/apu-1-config

インストール
# make
# make CFLAGS=-DMSC_TEST test
============================================================================
Testsuite summary for modsecurity 2.9
============================================================================
# TOTAL: 1
# PASS: 1
# SKIP: 0
# XFAIL: 0
# FAIL: 0
# XPASS: 0
# ERROR: 0
============================================================================

# make install

Apacheの設定

mod_securityを使用するにはApacheモジュールのmod_uniq_idが必要

# ls -l /usr/local/apache2/modules/ | grep mod_unique_id.so
-rwxr-xr-x. 1 root root   34112  4月 18 16:57 mod_unique_id.so

有効化
# vi /usr/local/apache2/conf/httpd.conf

#LoadModule unique_id_module modules/mod_unique_id.so
↓
LoadModule unique_id_module modules/mod_unique_id.so    ーーー先頭の#を削除します

インストールされたライブラリのパーミッション変更

# cd /usr/local/apache2/modules/
# chmod 755 /usr/local/apache2/modules/mod_security2.so

httpd.confにインストールしたモジュールを追加する
LoadModule security2_module modules/mod_security2.so

CRS(ModSecurity Core Rule Set)の適用

ディレクトリ作成

# cd /usr/local/apache2/
# mkdir modsecurity.d
# cd modsecurity.d/

CRSのダウンロード
# git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
# ls -l | grep crs
drwxr-xr-x 7 root root 291 Feb 2 17:35 owasp-modsecurity-crs

設定ファイルをリネーム(.exampleを外す)

# cd owasp-modsecurity-crs/
# mv crs-setup.conf.example crs-setup.conf

以下のファイルをリネームする(.exampleを外す)
# mv rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

Apacheの設定ファイルに以下を追加
# vi /usr/local/apache2/conf/httpd.conf

LoadModule security2_module modules/mod_security2.so
<IfModule security2_module>
<IfModule unique_id_module>
    SecRuleEngine On
    SecRequestBodyAccess On
    SecDebugLog logs/modsec_debug.log
    SecDebugLogLevel 3
    SecTmpDir /tmp/
    SecUploadDir /tmp/
    SecDataDir /tmp/
    SecAuditEngine On
    SecAuditEngine RelevantOnly
    SecAuditLogType concurrent
    SecAuditLogParts ABIDEFGHZ
    SecAuditLogStorageDir /var/log/mod_security/data
    SecAuditLog logs/audit_log
    Include modsecurity.d/owasp-modsecurity-crs/crs-setup.conf
    Include modsecurity.d/owasp-modsecurity-crs/rules/*.conf
</IfModule>
</IfModule>

Apache再起動

# systemctl reload httpd

modsecurity.conf

# cd /usr/local/src/modsecurity-2.9.2/
# cp modsecurity.conf-recommended /usr/local/apache2/conf/modsecurity.conf
modsecurityソースからunicode.mappingファイルをコピー
# cp /usr/local/src/modsecurity-2.9.2/unicode.mapping /usr/local/apache2/conf/

Syntax確認

# httpd -t
Syntax OK

Apache再起動

# systemctl restart httpd

modsecurity.confの設定変更

# -- Rule engine initialization ----------------------------------------------

#SecRuleEngine DetectionOnly # 監査は実行するが、block, deny,drop,allow,proxy,redirecのアクションは実行しない
SecRuleEngine On # ルールを処理するようにmod_secureityを実行する


# -- Request body handling ---------------------------------------------------
SecRequestBodyAccess On # クライアントからサーバへのリクエストデータに対して監査する

# -- Response body handling --------------------------------------------------
#SecResponseBodyAccess On # サーバからクライアントへのレスポンスデータに対して監査する
SecResponseBodyAccess Off # サーバからクライアントへのレスポンスデータに対して監査しない

# -- Debug log configuration -------------------------------------------------
#SecDebugLog /opt/modsecurity/var/log/debug.log
#SecDebugLog /var/log/modsec_debug.log # デバッグログ出力先(変更)
SecDebugLog /usr/local/apache2/logs/modsec_debug.log

# 容量が多いため、通常は止めておく
#SecDebugLogLevel 3 #デバッグログレベル0でなにも出力しない、9で全ての情報を出力

# -- Audit log configuration -------------------------------------------------
SecAuditEngine RelevantOnly # 監査に引っ掛かったものだけを記録
#SecAuditLog /var/log/modsec_audit.log # 監査ログの出力先
SecAuditLog "|/usr/local/apache2/bin/rotatelogs logs/modsec_audit.log.%Y%m%d 86400 540"

ホワイトリストの登録

編集するPCだけをホワイトリストに登録し、適用除外にする

# cd /usr/local/apaache2/modsecurity.d/owasp-modsecurity-crs/rules/
# vi white-list.conf
SecRule REMOTE_ADDR "@ipMatch 192.168.1.101,192.168.21.2,192.168.21.3" id:2000,phase:1,t:none,log,allow
Apacheを再起動します
# systemctl restart httpd

動作テスト

クロスサイト・スクリプティング(XSS)でテストしてみます

ホワイトリストを有効にしてテスト

Modsecurityのruleに設定したホワイトリストを有効な状態で、対象PCから以下のURLでブラウザを開いてみます

ブラウザの表示です。

結果は、該当のページが無いと表示されており、セキュリティではねられていません。対象PCからは拒否していない状態です。

ホワイトリストを無効にしてテスト

ホワイトリスト無しでのテストの結果です(全てのPCにルールを適用する状態)

上図の結果はForbiddenではねられています!Modsecurityが動作している事になります。

上部へスクロール