最終更新日:2014年5月19日
オープンソースの WAF である ModSecurity を CentOS にインストールする
はじめに
ModSecurity はオープンソースで開発されている WAF(Web Application Firewall)で、無償で利用することができます。
WAF とは、Web アプリケーションにリクエストが送信される手前でリクエストを取得して、内容を精査し、問題があればリクエストを拒否します。これにより仮に Web アプリケーションに脆弱性があったとしても WAF が守ってくれます。
WAF にも偽陽性や偽陰性の問題があるので、過信することはよくないですが、改修不能な Web アプリケーションの保護や、多層防御の一手法として有効です。
また、WAF には、ネットワーク型とホスト型がありますが、ModSecurity はホスト型の WAF になります。
構築する WebSecurity 環境
この記事で構築する WebSecurity の環境は以下の通りとします。
- CentOS 6.4(64bit)
- Apache 2.2.15
- ModSecurity 2.7.3-2.el6
- CRS 2.2.6-3.el6
なお、CRS (Core Rule Set)とは、ModSecurity で使用するルール集になります。
また、今回対応する脆弱性は影響の大きい以下の2つのみとします。
- クロスサイト・スクリプティング
- SQL インジェクション
これは、多くのルールを多くすると偽陽性の可能性が高まり、正常に Web アプリケーションが動作しなくなることを防ぐためです。
前準備
ModSecurity をインストールする前準備として、EPEL リポジトリを使用できるようにします。公式サイトだと標準リポジトリから yum でインストールできるように記載されていますが、実際には EPEL リポジトリからでないとインストールできませんでした。
EPEL リポジトリの追加方法は、以下の記事を参考にしてください。
ModSecurity のインストール
ModSecurity と CRS をインストールするには、以下のコマンドを実行するだけです。mod_security_crs を追加するのを忘れないでください。忘れると、ModSecurity は動作しても何も防御しません。
1 2 |
# yum --enablerepo=epel install mod_security mod_security_crs # service httpd restart |
これで、ModSecurity が有効になりました。以下のアドレスにアクセスすると拒否されれば、問題なく ModSecurity が動作しています。
1 |
http://hostname/index.php?union+select |
ですが、この状態ですと、たくさんのルールが適用されているため、これをクロスサイト・スクリプティングと SQL インジェクションに限定します。
下記コマンドで設定ファイルを編集します。
1 |
# vi /etc/httpd/conf.d/mod_security.conf |
以下の3行目をコメントアウトして、その下に2行追加します。これで、2種類のルールのみが適用されるようになります。
1 2 3 4 5 |
# ModSecurity Core Rules Set configuration Include modsecurity.d/*.conf #Include modsecurity.d/activated_rules/*.conf Include modsecurity.d/activated_rules/modsecurity_crs_41_xss_attacks.conf Include modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf |
Web サーバーを再起動します。
1 |
# service httpd restart |
偽陽性のテスト
まず、ModSecurity を攻撃を検知のみにしてログを取るように設定し、Web アプリケーションに全体に対して一通りの操作をします。
ModSecurity をログの取得のみにするには、以下のファイルを編集します。
1 |
# vi /etc/httpd/conf.d/mod_security.conf |
そして、SecRuleEngine を DetectionOnly に変更して設定を保存します。
1 2 |
#SecRuleEngine On SecRuleEngine DetectionOnly |
Web サーバーを再起動します。
1 |
# service httpd restart |
通常の操作が偽陽性として検知されたログは、/var/log/httpd/modsec_audit.log に保存されます。ログの内容を確認して、例外処理を httpd.conf に記述していきます。
modsec_audit.log には、以下のような情報が出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
--89a66a45-A-- [16/Nov/2013:12:56:47 +0900] Uobs-38AAAEAAAlFHgcAAAAD 192.168.11.6 53449 192.168.11.9 443 --89a66a45-B-- POST /wp-login.php HTTP/1.1 Host: 192.168.11.9 Connection: keep-alive Content-Length: 142 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Origin: https://192.168.11.9 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36 Content-Type: application/x-www-form-urlencoded Referer: https://192.168.11.9/wp-login.php?loggedout=true Accept-Encoding: gzip,deflate,sdch Accept-Language: ja,en-US;q=0.8,en;q=0.6 Cookie: xxxxx --89a66a45-C-- log=xxx&pwd=xxx&wp-submit=%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3&redirect_to=https%3A%2F%2F192.168.11.9%2Fwp-admin%2F&testcookie=1 --89a66a45-F-- HTTP/1.1 403 Forbidden Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 184 Connection: close Content-Type: text/html; charset=iso-8859-1 --89a66a45-E-- --89a66a45-H-- Message: Access denied with code 403 (phase 2). Pattern match "\\W{4,}" at ARGS:wp-submit. [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "154"] [id "960024"] [rev "2"] [msg "SQL Character Anomaly Detection Alert - Repetative Non-Word Characters"] [data "Matched Data: \xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3 found within ARGS:wp-submit: \xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3"] [ver "OWASP_CRS/2.2.6"] [maturity "9"] [accuracy "8"] Action: Intercepted (phase 2) Apache-Handler: php5-script Stopwatch: 1384574207202350 5541 (- - -) Stopwatch2: 1384574207202350 5541; combined=4158, p1=122, p2=3917, p3=0, p4=0, p5=95, sr=44, sw=24, 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" --89a66a45-Z-- |
ちょっと面倒ですが、ログから id を見つけ出し、その id を例外処理として httpd.conf に記述します。
1 |
# vi /etc/httpd/conf/httpd.conf |
以下を httpd.conf に追記します。
1 |
SecRuleRemoveById 960024 |
Web サーバーを再起動します。
1 |
# service httpd restart |
一通り偽陽性をなくしたら、SecRuleEngine を On に戻して、Web サーバーを再起動して導入終了です。
運用
WAF は導入すれば問題が全て解決する訳ではありません。定期的にログの確認し、偽陽性が起きている場合は対応が必要です。また、ModSecurity または CRS の定義がアップデートされたら分かるように継続的にチェックし、適用可否を判断することになります。
CRS のアップデートは以下のページでチェックできます。
OWASP ModSecurity Core Rule Set (CRS) CHANGES
WAF の導入によって Web アプリケーションはより安全になりますが、それ相応のコストがかかります。導入にあたっては、リスクとコストを含め総合的に判断することが必要です。
まとめ
ModSecurity はオープンソースで無償で使用することができますが、バージョンによって挙動が変わるという話もありますし、日本語情報はあまりない状態です。英語情報も決して多いとは言えません。
サポートには、Web の情報だけでなく、メーリングリストを活用していくとよいと思います(もちろん英語)。
WAF は多層防御として有用なので、環境が許せば導入してみるとよいでしょうね。このサイトにも、ModSecurity を導入したので、様子を見ていきたいと思います。
参考文献・サイト
- IPA 独立行政法人 情報処理推進機構:Web Application Firewall 読本
- hashdos攻撃をmod_securityで防御する(CentOS+yum編) | 徳丸浩の日記
- mod_security | 彼方此方
スポンサーリンク
カテゴリー:ツール
Twitter でも、いろんな情報を発信しています。@fnyaさんをフォロー
参考になります。たしかに、インストールは簡単だけど、ログチェックって大事だけど面倒くさそうですなぁ。
いつか、手元のCentOSで試してみます。
>>Maruo さん
ModSecurity のログは、1つ1つが大きなデータになっているので、チェックするのは目チェックだと確かに厳しいかもしれませんね。
簡単なプログラムを書いて、id を抽出するとよいかもしれません。
あと、ModSecurity は運用段階になっても偽陽性の問題がちょくちょく起きるので、その度にログをチェックする必要があります。
この辺が ModSecurity は大変だと言われる理由でしょうね。
でも、無料で利用できる WAF ですので、一度試してみるのもいいですね。