Webサイトを運営するうえで、Firewallはどこも利用していると思う。 しかし、iptablesやfirewalldのようなFirewallの場合、防御してくれるのはされたポートやIPアドレスレベルでのフィルタリングであり、Webアプリケーションの脆弱性に対する攻撃を防御してくれるわけではない。
そういった攻撃を防ぐには、Webアプリケーションファイアウォール(WAF)が必要になるのだが、そんな時にApacheのモジュールとして動作するオープンソースなプロダクトが今回導入するmod_securityだ。
今回は、このmod_securityをCentOS 7にインストールして不正アクセスを防御する。 なお、すでにApacheはインストール済みとする。
1. mod_securityのインストール
mod_security自体のインストールは簡単で、以下のようにyumからインストールが可能だ。 今回はよく利用されている攻撃のルールファイルも取得するので、「mod_security_crs」も取得する。
yum install -y epel-release
yum --enablerepo=epel install -y mod_security mod_security_crs
これで、mod_securityのインストールは完了した。 この時点では、まだmod_securityを有効にしないためhttpdの再起動は行わない。
2. mod_securityの設定
次に、mod_securityの設定を行う。 最初に「mod_security_crs」を取得したことで一般的に行われる攻撃に関してはすでに対応しているが、テストのために簡単なセキュリティルールを追加する。
/etc/httpd/modsecurity.d/activated_rules/modsecurity_01_orgrules.confSecDefaultAction "phase:2,deny,log,status:406" SecRule REQUEST_URI "etc/passwd" "id:'500001'" SecRule REQUEST_URI "\.\./" "id:'500002'" SecRule ARGS "<[Ss][Cc][Rr][Ii][Pp][Tt]" "id:'500003'" SecRule ARGS "[Ss][Ee][Ll][Ee][Cc][Tt][[:space:]]+[Ff][Rr][Oo][Mm]" "id:'500004'"
設定後、httpdの再起動を行う。
systemctl restart httpd
3. 攻撃テストを行う
それでは実際に攻撃テストしてみよう。 curlからルールに沿ったリクエストを投げてみよう。406エラーになるはずだ。
blacknon@BS-PUB-UBUNTU-01:~$ curl http://BS-PUB-WEBTOOL-TEST01/index.html?+select
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>406 Not Acceptable</title>
</head><body>
<h1>Not Acceptable</h1>
<p>An appropriate representation of the requested resource /index.html could not be found on this server.</p>
</body></html>
blacknon@BS-PUB-UBUNTU-01:~$ curl http://BS-PUB-WEBTOOL-TEST01/../../etc/passwd
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>406 Not Acceptable</title>
</head><body>
<h1>Not Acceptable</h1>
<p>An appropriate representation of the requested resource /etc/passwd could not be found on this server.</p>
</body></html>
これで、無事問題のあるリクエストは防御できるようになった。 もちろん場合によっては正常なリクエストもエラーになる可能性があるので、ちゃんとチューニングは必要。 環境に合わせて設定をしてやろう。