WAF導入とリバースプロキシ

posted in: 備忘録 | 0

自作でWEBアプリとかを作ってるとSQLインジェクション対策とかXSS対策とかセキュリティ対策がかなり面倒.

というわけで今回はうちのサーバ(さくらVPS)にWAF(Web Application Firewall)を導入したお話.

WAFって色んな所で「入れるべきだ!」みたいなこと聞くけど,実際導入しようとしても有償(けっこう高額)だったり,
日本語の資料が散らばっているので書いてみました.

今回導入したのはオープンソースWAFの”ModSecurity“.IPAでもWAFとして導入しているとかしてないとか・・・

 

現状&完成予想図

そんで現在のうちのネットワーク環境はこんな感じ.

  • nginxをリバースプロキシ&メインのWWWサーバ
  • www2. などの一部サブドメインはApacheへ転送

nginx+Apache構成という,くにおくんで言うところのダブルドラゴン状態.

しかしnginxにModSecurityを組み込もうとするとnginxをソースからビルドする必要があるらしく,面倒なので却下.
(nginxは元々軽量動作に焦点を当てているため,モジュールとか組み込むのは一工夫必要)

Apacheの方はインストールだけすればモジュールとして勝手にいい感じに組み込んでくれるみたいなので,Apacheの方に入れます.

 

完成予想図はこんな感じ.

完成後ネットワーク予想図

 

インストール

インストールは至って簡単.

  1. yumで”mod_security”と”mod_security_crs”をインストール
    (EPELレポジトリを追加しておく必要あり)
  2. httpdを再起動

以上.

なんて簡単なのでしょう!

ちなみに”mod_security_crs”というのはCRS(Core Rule Set)という攻撃を検知するためのルールらしい.

インストールした時点で勝手にhttpdのconfが書き込まれるので,勝手にWAFが有効になってます.

 

検証(動作確認)

本当にWAFが有効になってるかどうか検証してみました.

まずはXSS

GETにテキトーにスクリプトを埋め込んでみました.その時のログがこんな感じ.

Message: Access denied with code 403 (phase 2). Pattern match "\\< ?script\\b" at ARGS_NAMES:<script>. [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_xss_attacks.conf"] [line "191"] [id "958051"] [rev "2"] [msg "Cross-site Scripting (XSS) Attack"] [data "Matched Data: <script found within ARGS_NAMES:<script>: <script>"] [severity "CRITICAL"] [ver "OWASP_CRS/2.2.6"] [maturity "8"] [accuracy "8"] [tag "OWASP_CRS/WEB_ATTACK/XSS"] [tag "WASCTC/WASC-8"] [tag "WASCTC/WASC-22"] [tag "OWASP_TOP_10/A2"] [tag "OWASP_AppSensor/IE1"] [tag "PCI/6.5.1"]
Action: Intercepted (phase 2)
Apache-Handler: application/x-httpd-php
Stopwatch: 1476722347822966 12231 (- - -)
Stopwatch2: 1476722347822966 12231; combined=6120, p1=1219, p2=4859, p3=0, p4=0, p5=42, sr=256, sw=0, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.7.3 (http://www.modsecurity.org/); OWASP_CRS/2.2.6.
Server: Apache
Engine-Mode: "ENABLED"

検出ログの中に

[msg "Cross-site Scripting (XSS) Attack"]

というのが書いてあるので,XSSを検出して遮断したっぽいです.

実際にブラウザでも403エラーを返されました.

 

次はSQLインジェクション

よくあるインジェクションの文を入れてみました.その時のログはこんな感じ.

Message: Access denied with code 403 (phase 2). Pattern match "(^[\"'`\xc2\xb4\xe2\x80\x99\xe2\x80\x98;]+|[\"'`\xc2\xb4\xe2\x80\x99\xe2\x80\x98;]+$)" at ARGS:q. [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "64"] [id "981318"] [rev "2"] [msg "SQL Injection Attack: Common Injection Testing Detected"] [data "Matched Data: ' found within ARGS:q: ' OR 'A' = 'A"] [severity "CRITICAL"] [ver "OWASP_CRS/2.2.6"] [maturity "9"] [accuracy "8"] [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"]
Action: Intercepted (phase 2)
Apache-Handler: application/x-httpd-php
Stopwatch: 1476722525119840 5216 (- - -)
Stopwatch2: 1476722525119840 5216; combined=1622, p1=643, p2=946, p3=0, p4=0, p5=32, sr=137, sw=1, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.7.3 (http://www.modsecurity.org/); OWASP_CRS/2.2.6.
Server: Apache
Engine-Mode: "ENABLED"

こっちにもログの中に

[msg "SQL Injection Attack: Common Injection Testing Detected"]

とあるので,SQLインジェクションを検出したのが分かります.

 

次回予告

とりあえず今回は導入までを行ったので,細かい設定は次回以降.

あとサブドメインごとにWAFをON・OFFしたいので,そこら辺を.

一言残す!