NETWORK ENGINEER BLOG

Tips and Reviews for Engineers

オープンソースの WAF(ModSecurity)について

WAF とは

WAF は、ウェブアプリケーションの脆弱性を悪用した攻撃などからウェブアプリケーションを保護するソフトウェア、またはハードウェアです。
WAF を使用することで以下の効果を期待できます。

  • 脆弱性を悪用した攻撃からウェブアプリケーションを防御する
  • 脆弱性を悪用した攻撃を検出する
  • 複数のウェブアプリケーションへの攻撃をまとめて防御する

また WAF は、検出パターンに基づき通信の中身を機械的に検査するため、実際に人の目で見る場合と異なる判定が生じる場合があります。この判定結果により、ウェブアプリケーションの脆弱性を悪用した攻撃などの悪意ある通信を遮断できない場合や、利用者がウェブサイトを閲覧する正常な通信を遮断してしまう場合があります。WAF の導入を検討する場合、このことを考慮する必要があります。
出典:Web Application Firewall (WAF) 読本 改訂第2版

ModSecurity とは

TrustWave 社が GPLv2 ライセンスのもと提供しているオープンソースの WAF です。
IPA で導入・運用を継続している実績があります。
出典: オープンソース WAF「ModSecurity」導入事例 ~ IPA はこう考えた ~

ModSecurity 構築例

本例では、以下の環境でテストします。

f:id:FriendsNow:20200329180205p:plain

また、本環境で対応する脆弱性は以下の 2 つのみとします。

  • XSS(クロスサイト・スクリプティング)
  • SQL インジェクション

Apache リバースプロキシ設定

以下をコメントアウト

# vi /etc/httpd/conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

以下を最終行に追加

# vi /etc/httpd/conf/httpd.conf
ProxyRequests Off
ProxyPass /WebGoat http://10.1.23.253/WebGoat
ProxyPassReverse /WebGoat http://10.1.23.253/WebGoat
# 上記のように設定すると、例えば、 10.1.12.252/WebGoat のリクエストを http://10.1.23.253/WebGoat へ転送します。

ModSecurity インストール事前準備

EPEL リポジトリ追加

yum install epel-release

リポジトリ設定

# vi /etc/yum.repos.d/epel.repo

# 3 行目コメントイン
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
# 4 行目コメントアウト
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch

# 12 行目コメントイン
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch/debug
# 13 行目コメントアウト
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-6&arch=$basearch

# 21 行目コメントイン
baseurl=http://download.fedoraproject.org/pub/epel/6/SRPMS
# 22 行目コメントアウト
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-6&arch=$basearch

ModSecurity インストール

ModSecurity と CRS をインストール

# yum --enablerepo=epel install -y mod_security mod_security_crs
# service httpd restart

XSS と SQL インジェクションのルールのみ適用

# vi /etc/httpd/conf.d/mod_security.conf

# 9 行目コメントアウト
# Include modsecurity.d/activated_rules/*.conf
# 10~11 行目追加
Include modsecurity.d/activated_rules/modsecurity_crs_41_xss_attacks.conf
Include modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf

Apache 再起動

# /etc/rc.d/init.d/httpd restart

WAF のテスト

ModSecurity 無効時

OWASP ZAP の動的スキャンを行うと、SQL インジェクションの脆弱性が見つかります。
※OWSAP ZAP については、こちらをご参照ください。
f:id:FriendsNow:20200329182250p:plain

ModSecurity 有効時

SQL インジェクションの脆弱性が検出されなくなりました。
f:id:FriendsNow:20200329181520p:plain

リアルタイムで診断状況を確認すると、ステータスコードが「Forbidden」となっていることが確認できます。
f:id:FriendsNow:20200329181052p:plain

参考: ModSecurity 無効化

一時的に無効化した場合は、以下の設定をします。

# vi /etc/httpd/conf.d/mod_security.conf

# 13 行目コメントアウト
#SecRuleEngine On
# 14 行目追加
SecRuleEngine Off

Apache 再起動

# /etc/rc.d/init.d/httpd restart

以上