現在位置: ホーム / セキュリティ ブログ / nginxでWAF(Web Application Firewall) を作る(第四回:最終回)

nginxでWAF(Web Application Firewall) を作る(第四回:最終回)

前回と同様に、引き続きnginx+ModSecurityによるWAFの作成を行います。

こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面です。

数回に分けて、nginxでWAFをつくる方法を紹介しています。

前回、nginxとmod_securityのインストールしと設定を行いました。

今回は、実際にWebサイトに攻撃テストを行い、どのくらいnginxのWAFによって攻撃が防げているかを見ていきます。


ImpervaのWAF Testing Frameworkについて

WAFのテストツールは色々なものがありますが、今回はImpervaの「Waf Testing Framework」を使用します。

(※)このツールはダウンロード時に情報登録が必要です。

このツールですが、開発者の「Amichai Shulman」による説明のVideoがこちらから見ることが出来ます。こちらの@ITの記事にわかりやすく紹介されていますが、このツールのコンセプトは、WAFの防御性能を測るために攻撃リクエストの他に、紛らわしい正常なリクエストを出し

  • False Positive(問題のない正常なリクエストを間違ってブロック)

  • False Negative(異常なリクエストを検知できずに通過させる)

の二つの割合を測定することで、より正確な防御性能を測定するというものです。

このツールは、ざっくり言うと

  • 攻撃対象Webサーバ(WebGoat)

  • スキャンツール(Windows上で動作します)

から構成されています。

そのため、前回の「ネットワーク構成」での

  • 192.168.56.101(Target): WebGoat

  • 192.168.56.103(外部): Windowsマシン

がそれぞれ対応します。


Imperva WAF Testing Frameworkのインストール

Imperva WAF Testing Frameworkのサイトに情報を入力すると、ダウンロード先がメールで送られてきます。このダウンロード先から

waf-testing-framework-software.zip

が入手できます。このzipファイルの中に、必要な攻撃対象Webサーバ(WebGoat)とWindows用スキャナのインストーラが同梱されています。

また、この中に「WAF Testing Framework - Instructions.pdf」がありますので、基本的なインストール方法はそちらに記載されています。

1. Targetのインストール

JAVA 1.6以上が動作する環境のLinuxであれば問題ありません。今回、テストではdebianを使用しており、openjdk-8-jreを使用しています。

一般ユーザの.bashrc等で、JAVA_HOMEを

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

として設定します。また、下記のようにWebGoat-5.2/webgoat.shの中のJAVAバージョン確認部分をごっそり削ります。

--- webgoat.sh.org	2016-06-05 00:55:09.743777003 +0900
+++ webgoat.sh	2016-03-04 09:38:20.996000000 +0900
@@ -15,13 +15,6 @@
 is_java_1dot5() {
         if [ "X$JAVA_HOME" != "X" -a -d $JAVA_HOME ]; then
                 $JAVA_HOME/bin/java -version 2>&1 | grep 'version \"1.5' >/dev/null
-                if [ $? -ne 0 ]; then
-                        echo "The JVM in \$JAVA_HOME isn't version 1.5."
-                        exit 1
-                fi
-        else
-                echo "Please set JAVA_HOME to a Java 1.5 JDK install"
-                exit 1
         fi
 }

その後、一般ユーザで、展開されたディレクトリ中のWebGoat-5.2に移動して

user@target:~/waf/WebGoat-5.2$ ./webgoat.sh start8080

とPort 8080(1024以上のポート)を指定して引数として与えてあげれば、Webサーバが起動します。

Virtualboxを使って検証環境を作成しているためにこのようなネットワークになっていますが、実運用環境では負荷分散のための複数NICなど、別途環境に合わせて下さい。

今回の検証環境では、nginx+WAFにPort80で接続すると、適切にフィルタリングを行い、tomcatがPort8080で動作しているマシンにフォワードします。

2. Windows用スキャナのインストール

展開したzipファイルの中に、「WAFTesting.exe」がありますので、これをWindows上で実行すればOKです。


スキャンテスト

それでは、実際にWAFのテストをしてみましょう。

  1. Windows上でWAFTesting.exeを実行します。

  2. ここで、必要な情報を入力します。まず、攻撃対象Webサーバ(192.168.56.101)をHOSTに、Portを8080に指定し、結果のレポート(PDF)のファイル名を指定し、「Run」を押して実行します。

  3. 図のようなPDFファイルが表示されます。False Positive:誤検知が100%失敗(0%成功)、False Negative:見逃しが0%失敗(100%成功)ということで、フィルタリングが全然かかっていない状態だとわかります。

    (※)results_no_waf.pdfはここからダウンロードできます。

  4. 次に、nginxで作ったWAF(nginx.localdomain)をHOSTに、Portを80に指定し、結果のレポート(PDF)のファイル名を指定し、「Run」を押して実行します。

  5. 図のようなPDFファイルが表示されます。nginxのWAFにより、False Positive:誤検知が25%失敗(75%成功)、False Negative:見逃しが74%失敗(26%成功)ということで、攻撃がWAFにより、ある程度防がれていることがわかります。

    (※)results_waf.pdfはここからダウンロードできます。


modsecurityのルール調整

modsecurityのルールとしては、/etc/nginx/mod_security.confファイルを見てわかる通り

# Load all Rule
Include modsecurity.d/*.conf
Include modsecurity.d/activated_rules/*.conf
Include modsecurity.d/local_rules/*.conf

と、/etc/nginx/modsecurity.d以下の.confファイルをロードしています。

この中で、modsecurity.d/activated_rulesは、/usr/lib/modsecurity.d/base_rules/以下のルールのシンボリックリンクとなっています。

例えば、modsecurity_crs_41_sql_injection_attacks.confを見てみると

SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|!REQUEST_COOKIES:/_pk_ref/|REQUEST_COOKIES_NAMES|ARGS_NAMES|ARGS|XML:/* "(^[\"'`´’‘;]+|[\"'`´’‘;]+$)" "phase:2,rev:'2',ver:'OWASP_CRS/2.2.9',maturity:'9',accuracy:'8',capture,t:none,t:urlDecodeUni,block,msg:'SQL Injection Attack: Common Injection Testing Detected',id:'981318',logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',severity:'2',tag:'OWASP_CRS/WEB_ATTACK/SQL_INJECTION',tag:'WASCTC/WASC-19',tag:'OWASP_TOP_10/A1',tag:'OWASP_AppSensor/CIE1',tag:'PCI/6.5.2',setvar:'tx.msg=%{rule.msg}',setvar:tx.sql_injection_score=+%{tx.critical_anomaly_score},setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},setvar:tx.%{rule.id}-OWASP_CRS/WEB_ATTACK/SQL_INJECTION-%{matched_var_name}=%{tx.0}"

となっていて、正規表現でマッチングデータが記載されていることがわかります。

ModSecurityのマニュアル:https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual

に詳しい内容が載っていますので、正規表現の調整や、新しくルールを作成する場合にはマニュアルを見ながら行って下さい。

#長くなってしまうので、ここではマニュアルへのリンクだけにとどめておきます。

例えば、先ほどのmodsecurity_crs_41_sql_injection_attacks.confファイルを、/etc/nginx/modsecurity.d/activated.rules以下のリンクを消すことで、nginxで読み込まないようにすると、以下のようにWAF Testing Frameworkのスキャン結果が変化します。

・変更前

・変更後

(※)results_disabled_sqlinjection.pdfはここからダウンロードできます。


まとめ

今回までで、nginx+WAFの導入方法とテスト方法を一通り紹介しました。実際には、組織でインストールした後に細かな調整が必要になると思いますが、こちらで紹介した記事が参考になれば幸いです。

今後はまたnginxのセキュリティの新機能などを紹介していく予定です。


[セミナー告知]

6/15に「OSSセキュリティナイター vol.1」と題して、セキュリティのセミナーを行います。この回では「急増するランサムウェア その脅威とOSSの対策」として、ランサムウェアのリスクとOSSでの対策方法などをお話します。

また、LinuxFoundationでのセキュリティに対する取り組みや、Rapid7(株)による脆弱性リスク管理も併せてご紹介します。

http://mkt-i.actonservice.com/acton/fs/blocks/showLandingPage/a/15078/p/p-0035/t/page/fm/0がプログラム内容と申し込みの詳細になりますので、是非お申し込み下さい。

OSSよろず相談室

サイオスOSSよろず相談室(2)

問い合わせボタン

最新の記事
Sambaに共有以外のファイルにアクセスされる脆弱性(CVE-2017-2619) 2017年03月24日
Subscription-managerの脆弱性( CVE-2017-2663 ) 2017年03月22日
binutilsに複数の脆弱性( CVE-2017-6965, CVE-2017-6966, CVE-2017-6969, CVE-2017-7209 , CVE-2017-7210 , CVE-2017-7223, CVE-2017-7224, CVE-2017-7225, CVE-2017-7226, CVE-2017-7227 ) 2017年03月22日
linux kernelの脆弱性( CVE-2017-7187 ) 2017年03月21日
linux kernelの脆弱性( CVE-2017-6353 , CVE-2017-5986 ) 2017年03月21日
Ubuntu 16.10のkernelの脆弱性( CVE-2017-7184 ) 2017年03月20日
pcreの脆弱性( CVE-2017-7186 ) 2017年03月20日
binutilsの脆弱性( CVE-2017-6965 , CVE-2017-6966 , CVE-2017-6969 ) 2017年03月19日
MySQL(MariaDB) 5.5/5.6のmysql clientの脆弱性( Riddle : CVE-2017-3305 ) 2017年03月18日
linux kernelの脆弱性( CVE-2017-6951 ) 2017年03月17日
Apache Struts2の脆弱性 ( CVE-2017-5638 ) 2017年03月15日
linux kernelの脆弱性( CVE-2017-6874 ) 2017年03月15日
tomcatに情報漏えいの脆弱性( CVE-2016-8747 ) 2017年03月14日
QEMUの脆弱性( CVE-2016-9603 ) (Xen: XSA-211) 2017年03月14日
lxcの脆弱性(CVE-2017-5985) 2017年03月10日
wgetの脆弱性(CVE-2017-6508) 2017年03月08日
linux kernelに特権昇格の脆弱性( CVE-2017-2636 ) 2017年03月08日
( PoC ) linux kernel特権昇格脆弱性( CVE-2017-6074 ) の暫定回避策の確認 2017年03月06日
linux kernelの脆弱性( CVE-2016-9083 , CVE-2016-9084 ) 2017年03月03日
linux kernelに複数の脆弱性( CVE-2017-6345 , CVE-2017-6346 , CVE-2017-6347 , CVE-2017-6348 ) 2017年03月01日
Katello/Foremanによる運用管理 (Part4) 2017年02月28日
util-linux / coreutils の脆弱性(CVE-2017-2616) 2017年02月24日
linux kernelの脆弱性( CVE-2017-6214 ) 2017年02月24日
linux kernelに特権昇格の脆弱性( CVE-2017-6074 ) 2017年02月23日
curlの脆弱性 ( CVE-2017-2629 ) 2017年02月22日
QEMUの脆弱性( CVE-2017-2620 ) (Xen: XSA-209) 2017年02月22日
Tomcatの脆弱性 ( CVE-2017-6056 ) 2017年02月21日
Katello/Foremanによる運用管理 (Part3) 2017年02月21日
OpenSSLの脆弱性 ( CVE-2017-3733 ) 2017年02月16日
linux kernelの脆弱性( CVE-2017-6001 , (was CVE-2016-6786) ) 2017年02月16日
QEMUの脆弱性( CVE-2017-2630 ) 2017年02月15日
glibcの脆弱性(CVE-2015-8982, CVE-2015-8983, CVE-2015-8984) 2017年02月15日
vimの脆弱性 ( CVE-2017-5953 ) 2017年02月14日
Oracle Javaの脆弱性(Oracle Critical Patch Update Advisory - January 2017) 2017年02月14日
libxml2の脆弱性(CVE-2017-5969) 2017年02月13日
「linux kernel-4.9」でのLSMモジュールについて 2017年02月13日
linux kernelの脆弱性( CVE-2017-5970 ) 2017年02月13日
linux kernelの脆弱性( CVE-2016-8636 ) 2017年02月12日
bind 9 に設定依存の脆弱性 ( CVE-2017-3135 ) 2017年02月09日
bashの自動補完機能の脆弱性( CVE-2017-5932 ) 2017年02月08日
spiceの脆弱性( CVE-2016-9577 , CVE-2016-9578 ) 2017年02月08日
QEMUの脆弱性( CVE-2017-5898 ) 2017年02月08日
linux kernelの脆弱性( CVE-2017-5897 ) 2017年02月08日
linux kernelの脆弱性( CVE-2016-10208 ) 2017年02月06日
ntfs-3gの脆弱性(CVE-2017-0358) 2017年02月02日
QEMUの脆弱性( CVE-2017-2615 ) 2017年02月02日
tcpdumpに複数の脆弱性(CVE-2016-7922 等) 2017年01月30日
libgdに複数の脆弱性情報 (CVE-2016-9317, CVE-2016-6912, CVE-2016-10167, CVE-2016-10168, CVE-2016-10169) 2017年01月29日
OpenSSLに複数の脆弱性 ( CVE-2017-3730 , CVE-2017-3731 , CVE-2017-3732 ) 2017年01月27日
RunCに関しての脆弱性( CVE-2016-9962 )のPoCとSELinuxによるリスクの軽減 2017年01月26日
systemdの重要な脆弱性( CVE-2016-10156 ) 2017年01月25日
linux kernelの複数の脆弱性( CVE-2016-10153, CVE-2016-10154, CVE-2017-5547, CVE-2017-5548, CVE-2017-5549, CVE-2017-5550, CVE-2017-5551) 2017年01月25日
Katello/Foremanによる運用管理 (Part2) 2017年01月24日
linux kernel(KVMを有効にしている場合)で複数の脆弱性( CVE-2016-10150, CVE-2017-2583 ) 2017年01月21日
OpenSCAP 1.2.13のリリース情報 2017年01月16日
Oracle Javaの脆弱性(CVE-2016-5542, CVE-2016-5554, CVE-2016-5582, CVE-2016-5597, CVE-2016-5573) 2017年01月13日
bind に複数の脆弱性 ( CVE-2016-9131 , CVE-2016-9147 , CVE-2016-9444 , CVE-2016-9778 ) 2017年01月12日
Dockerに特権昇格の脆弱性 ( CVE-2016-9962 ) 2017年01月11日
GnuTLS の 脆弱性 (GNUTLS-SA-2017-1 : CVE-2017-5334 , GNUTLS-SA-2017-2 : CVE-2017-5335 , CVE-2017-5336 , CVE-2017-5337 ) 2017年01月11日
OpenSSLの脆弱性(CVE-2016-7056 ) 2017年01月11日
最新の記事 - もっと...