Webセキュリティの小部屋

Twitter のフォローはこちらから Facebook ページはこちら RSSフィードのご登録はこちらから
公開日:2013年11月17日
最終更新日:2020年8月8日

オープンソースの 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 は動作しても何も防御しません。

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

これで、ModSecurity が有効になりました。以下のアドレスにアクセスすると拒否されれば、問題なく ModSecurity が動作しています。
http://hostname/index.php?union+select

ですが、この状態ですと、たくさんのルールが適用されているため、これをクロスサイト・スクリプティングと SQL インジェクションに限定します。

下記コマンドで設定ファイルを編集します。

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

以下の3行目をコメントアウトして、その下に2行追加します。これで、2種類のルールのみが適用されるようになります。
# 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 サーバーを再起動します。
# service httpd restart

偽陽性のテスト

まず、ModSecurity を攻撃を検知のみにしてログを取るように設定し、Web アプリケーションに全体に対して一通りの操作をします。

ModSecurity をログの取得のみにするには、以下のファイルを編集します。

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

そして、SecRuleEngine を DetectionOnly に変更して設定を保存します。

#SecRuleEngine On
SecRuleEngine DetectionOnly

Web サーバーを再起動します。

# service httpd restart

通常の操作が偽陽性として検知されたログは、/var/log/httpd/modsec_audit.log に保存されます。ログの内容を確認して、例外処理を httpd.conf に記述していきます。

modsec_audit.log には、以下のような情報が出力されます。

--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 に記述します。
# vi /etc/httpd/conf/httpd.conf

以下を httpd.conf に追記します。
  SecRuleRemoveById 960024

Web サーバーを再起動します。
# service httpd restart

一通り偽陽性をなくしたら、SecRuleEngine を On に戻して、Web サーバーを再起動して導入終了です。

運用

WAF は導入すれば問題が全て解決する訳ではありません。定期的にログの確認し、偽陽性が起きている場合は対応が必要です。また、ModSecurity または CRS の定義がアップデートされたら分かるように継続的にチェックし、適用可否を判断することになります。

CRS のアップデートは以下のページでチェックできます。
OWASP ModSecurity Core Rule Set (CRS) CHANGES

WAF の導入によって Web アプリケーションはより安全になりますが、それ相応のコストがかかります。導入にあたっては、リスクとコストを含め総合的に判断することが必要です。

おわりに

ModSecurity はオープンソースで無償で使用することができますが、バージョンによって挙動が変わるという話もありますし、日本語情報はあまりない状態です。英語情報も決して多いとは言えません。

サポートには、Web の情報だけでなく、メーリングリストを活用していくとよいと思います(もちろん英語)。

WAF は多層防御として有用なので、環境が許せば導入してみるとよいでしょうね。このサイトにも、ModSecurity を導入したので、様子を見ていきたいと思います。

WAF設定まとめ

WAFの設定については以下のページにまとめていますので、こちらもどうぞ。

参考文献・サイト


スポンサーリンク





カテゴリー:ツール

“オープンソースの WAF である ModSecurity を CentOS にインストールする” への2件のフィードバック

  1. Maruo より:

    参考になります。たしかに、インストールは簡単だけど、ログチェックって大事だけど面倒くさそうですなぁ。
    いつか、手元のCentOSで試してみます。

    • fnya より:

      >>Maruo さん

      ModSecurity のログは、1つ1つが大きなデータになっているので、チェックするのは目チェックだと確かに厳しいかもしれませんね。

      簡単なプログラムを書いて、id を抽出するとよいかもしれません。

      あと、ModSecurity は運用段階になっても偽陽性の問題がちょくちょく起きるので、その度にログをチェックする必要があります。

      この辺が ModSecurity は大変だと言われる理由でしょうね。

      でも、無料で利用できる WAF ですので、一度試してみるのもいいですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA