CentOS 7でApacheのWAF(Web Application Firewall)としてmod_securityを用いる
Pocket

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の再起動は行わない。

Sponsored Links

2.mod_securityの設定

次に、mod_securityの設定を行う。
最初に「mod_security_crs」を取得したことで一般的に行われる攻撃に関してはすでに対応しているが、テストのために簡単なセキュリティルールを追加する。

●/etc/httpd/modsecurity.d/activated_rules/modsecurity_01_orgrules.conf

SecDefaultAction "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>

 

これで、無事問題のあるリクエストは防御できるようになった。
もちろん、場合によっては正常なリクエストもエラーになる可能性があるので、ちゃんとチューニングは必要。
環境に合わせて設定をしてやろう。

 

【参考】

 

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*