ServersMan@VPS:WAF(Web Application Firewall)の導入【ModSecurity編】

インターネット上に公開されたサイトである以上、外部から脆弱性を狙う攻撃の脅威は避けられません。WAF(Web Application Firewall) を導入することで、プログラムを修正することなく透過的に脅威からサーバーを守ることが期待できます。今回は、Apacheモジュールとして動作する「ModSecurity」をServersMan@VPSにインストールします。ModSecurity はオープンソースで開発されている WAFであり、無償で利用することができます。(2015/04/11作成)

Security 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

以上

About yoshimasa

埼玉県さいたま市在住、2男3女のパパです。Linux系の技術情報を中心にまとめています。1978年2月生まれ。