インターネット上に公開されたサイトである以上、外部から脆弱性を狙う攻撃の脅威は避けられません。WAF(Web Application Firewall) を導入することで、プログラムを修正することなく透過的に脅威からサーバーを守ることが期待できます。今回は、Apacheモジュールとして動作する「ModSecurity」をServersMan@VPSにインストールします。ModSecurity はオープンソースで開発されている WAFであり、無償で利用することができます。(2015/04/11作成)
www_slon_pics / Pixabay
WAF(Web Application Firewall)とは…
Webサーバー上にアプリケーションを作り込んでデータを更新したり最新の状況を表示したりするタイプのサイトを,不正な攻撃から守るための装置やソフトウエアのこと。 こうしたサイトにはオンライン・バンキング・やショッピング・サイトなどがある。
0.環境
$ cat /etc/redhat-release CentOS release 5.11 (Final) $ /usr/sbin/httpd -v Server version: Apache/2.2.3 Server built: Sep 16 2014 11:29:05
※本インストールには、EPEL(エンタープライズ Linux 用の拡張パッケージ)のリポジトリを有効化にしておく必要があります。
1.導入
$ sudo yum install mod_security mod_security_crs mod_security_crs-extras
2.設定
$ sudo vi /etc/httpd/conf.d/mod_security.conf
ModSecurityで「SQLインジェクション」や「クロスサイトスクリプティング」に関するチェックのみ行う場合。
# Include modsecurity.d/activated_rules/*.conf Include modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf Include modsecurity.d/activated_rules/modsecurity_crs_41_xss_attacks.conf
SecRuleEngine 設定を “DetectionOnly” に設定。攻撃を検知した場合に、リクエストをブロックせずに、検知内容をログ出力します。
# SecRuleEngine On SecRuleEngine DetectionOnly
3.設定反映(試験運用)
$ sudo /etc/init.d/httpd restart
4.偽陽性判定がある場合
auditログを確認しid ( [id “XXXXXX”] ) をチェックします。
$ sudo tail -f /var/log/httpd/modsec_audit.log
※Wordpress固有の対応
WordPressのインストールされた環境に「ModSecurity」 を導入する場合、問題のないリクエストであってもデフォルトでは偽陽性判定がされます。”SecRuleRemoveById” を用いて、偽陽性判定のあるリクエストを除外します。以下の「ModSecurity」用ファイルを作成し「Apache」のコフィグレーション(httpd.conf)に読み込ませます。
Include conf.d/set_wp_modsecurity.inc
<IfModule security2_module> SecRuleRemoveById 960024 SecRuleRemoveById 960015 SecRuleRemoveById 981172 SecRuleRemoveById 950001 SecRuleRemoveById 950005 SecRuleRemoveById 950006 SecRuleRemoveById 950007 SecRuleRemoveById 950901 SecRuleRemoveById 958011 SecRuleRemoveById 958030 SecRuleRemoveById 958976 SecRuleRemoveById 959073 SecRuleRemoveById 959070 SecRuleRemoveById 959071 SecRuleRemoveById 959072 SecRuleRemoveById 959151 SecRuleRemoveById 960015 SecRuleRemoveById 960024 SecRuleRemoveById 973300 SecRuleRemoveById 973302 SecRuleRemoveById 973304 SecRuleRemoveById 973305 SecRuleRemoveById 973306 SecRuleRemoveById 973308 SecRuleRemoveById 973316 SecRuleRemoveById 973332 SecRuleRemoveById 973333 SecRuleRemoveById 973334 SecRuleRemoveById 973335 SecRuleRemoveById 981172 SecRuleRemoveById 981173 SecRuleRemoveById 981231 SecRuleRemoveById 981240 SecRuleRemoveById 981241 SecRuleRemoveById 981242 SecRuleRemoveById 981243 SecRuleRemoveById 981244 SecRuleRemoveById 981245 SecRuleRemoveById 981246 SecRuleRemoveById 981247 SecRuleRemoveById 981248 SecRuleRemoveById 981249 SecRuleRemoveById 981251 SecRuleRemoveById 981255 SecRuleRemoveById 981256 SecRuleRemoveById 981257 SecRuleRemoveById 981260 SecRuleRemoveById 981276 SecRuleRemoveById 981317 SecRuleRemoveById 981318 SecRuleRemoveById 981319 SecRuleRemoveById 981320 </IfModule>
※「/var/lib/mod_security」ディレクトリについて
auditログ確認時、下記のパーミッションエラーが出力される場合は、対象ディレクトリが「httpd」の動作ユーザーの権限ではない可能性があります。「chown」にて適切に権限付与する必要があります。
(抜粋) Message: Failed to access DBM file "/var/lib/mod_security/global": Permission denied Message: Failed to access DBM file "/var/lib/mod_security/ip": Permission denied
5.本番運用
SecRuleEngine 設定を “DetectionOnly” → “On” に設定します。
$ sudo vi /etc/httpd/conf.d/mod_security.conf
SecRuleEngine On # SecRuleEngine DetectionOnly
以上