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が動作している事になります。