mod_evasive で Apache の DoS 対策

本記事は最終更新日より 1 年以上経過しております。
スポンサーリンク

 昨年あたりから、アクセス数が著しく上昇する事を多く目にするようになった。Munin で監視しているいるのだが、Load Average が突発的に 30~50 あたりに急上昇し、Apache の項目を見ると Process が増大していたり、MySQL に於いてもクエリーが増えて Thread が急増する。
 負荷としてはかなりの物になり、アクセス過多の状態にあるときでは MySQL への接続もままならずエラーを吐く場合もあるので今回は DoS 対策として mod_evasive を導入する事とした。


 mod_evasice は同一 URI へ短時間で多数のアクセスするホストに対し、一定時間 403 エラーを返す事が出来るモジュールだ。
 これがどういうシチュエーションで効いてくるかと言えば、WordPress であれば wp-login.php に対するブルートフォースであったり、他のスクリプトの脆弱性を狙う為、ありきたりな URI を狙って何度もアクセスしてくるような攻撃になる。その他無意味にブラウザでリロード連打だとか、Apache Bench を人のホストに向けてくるような輩にも効いてくる。

 導入方法は手軽に yum を用いてパッケージをインストールする方法を取った。パッケージ管理は全て rpm で行う方針にしているからではあるが、mod_evasive はソースに手を入れたくなる状況もあるので面倒でない人であればソースから入れても良いと思われる。

# yum install mod_evasive

 これでインストールは完了した。

 次にログを保存するディレクトリを用意する。/etc/httpd/conf.d/mod_evasive.conf に記述されている DOSLogDir に記されているパスをそのまま用いることとした。ディレクトリは Apache の実効ユーザーがアクセス出来る様にしておく必要があるので chown している。

# mkdir /var/lock/mod_evasive
# chown apache:apache /var/lock/mod_evasive

 そして設定ファイルを編集する。当方が今のところ使っているパラメータは次の通り。コメントと空行は除外している。

LoadModule evasive20_module modules/mod_evasive20.so
<IfModule mod_evasive20.c> 
    DOSHashTableSize    3097
    DOSPageCount        5
    DOSSiteCount        30
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   30
    DOSEmailNotify      "-s 'DoS Alert' hoge@example.com"
    DOSLogDir           "/var/lock/mod_evasive"
    DOSWhitelist   127.0.0.1
    DOSWhitelist   192.168.1.*
</IfModule>

 この設定だと
 ・1 秒間に同一ページへのアクセスが 5 回あった場合、BlockList へ入れて 30 秒の間 403 エラーを返す。
 ・1 秒間に同一サイトへのアクセスが 30 回あった場合、BlockList へ入れて 30 秒の間 403 エラーを返す。
 ・BlockList に入ったアクセス元を “DoS Alert” という Subject で hoge@example.com に E-Mail を送信する。
 ・動作した Log を保存するのは “/var/lock/mod_evasive” に。
 ・127.0.0.1 と 192.168.1.* は WhiteList として検知対象にしない。
 以上のようになる。
 要するに「同一ページへ DOSPageInterval 秒以内に DOSPageCount 回のアクセス」「同一サイトへ DOSSiteInterval 秒以内に DOSSiteCount 回のアクセス」を DOSBlockingPeriod 秒間 BlockList に入れて次のアクセスからは 403 エラーを返しますよと言う事。

 設定を終えたら service httpd restart 等としておく。
 動作テストを行う場合、DOSWhiteList をコメントアウトしておかないと検知されないので注意。
 テストスクリプトも一緒にインストールされる為、次の様に実行すれば良い。

# perl /usr/share/doc/mod_evasive-1.10.1/test.pl
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
...
...
...
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
...
...

 この様に短時間で何回ものアクセスがあると規定数に達したアクセスは BlockList に入れられて居るので 403 が帰ってきている。更に設定したメールアドレスに対し「Subject: HTTP BLACKLIST 127.0.0.1」でメールが届いている。現状、メールのヘッダに余計な改行が入ってしまっているのが非常に気になる所なので、ソースで入れた人は修正してしまうと良い。

 また、syslog でも記録される為 /var/log/messages を確認するのも良い。

# grep 'mod_evasive' /var/log/messages
Feb  4 23:18:34 hogehoge mod_evasive[4863]: Blacklisting address 192.168.1.3: possible DoS attack.
Feb  4 23:19:53 hogehoge mod_evasive[4979]: Blacklisting address 127.0.0.1: possible DoS attack.
Feb  5 00:48:58 hogehoge mod_evasive[5653]: Blacklisting address 202.217.72.80: possible DoS attack.
Feb  5 01:12:17 hogehoge mod_evasive[16841]: Blacklisting address 117.26.199.165: possible DoS attack.
Feb  5 02:16:09 hogehoge mod_evasive[19795]: Blacklisting address 180.110.188.113: possible DoS attack.
Feb  5 04:11:45 hogehoge mod_evasive[5054]: Blacklisting address 70.39.246.37: possible DoS attack.
Feb  5 04:22:09 hogehoge mod_evasive[5054]: Blacklisting address 218.66.69.123: possible DoS attack.
Feb  5 04:27:58 hogehoge mod_evasive[9245]: Blacklisting address 192.168.1.3: possible DoS attack.
Feb  5 04:37:52 hogehoge mod_evasive[9242]: Blacklisting address 115.37.179.80: possible DoS attack.
Feb  5 04:40:08 hogehoge mod_evasive[10441]: Blacklisting address 192.168.1.3: possible DoS attack.
Feb  5 04:42:45 hogehoge mod_evasive[11070]: Blacklisting address 192.168.1.3: possible DoS attack.
Feb  5 04:43:44 hogehoge mod_evasive[11165]: Blacklisting address 192.168.1.3: possible DoS attack.
Feb  5 07:09:46 hogehoge mod_evasive[12286]: Blacklisting address 14.169.7.198: possible DoS attack.
Feb  5 10:18:12 hogehoge mod_evasive[4443]: Blacklisting address 110.85.81.251: possible DoS attack.
Feb  5 20:15:46 hogehoge mod_evasive[17932]: Blacklisting address 127.0.0.1: possible DoS attack.

 動作確認を終えたら念のため 127.0.0.1 が記録されたログを削除して conf の DOSWhiteList を有効化。httpd を再起動する。

# rm /var/lock/mod_evasive/dos-127.0.0.1
rm: remove 通常ファイル `/var/lock/mod_evasive/dos-127.0.0.1'? yes
#

 以後の細かい調整は運用中にどの程度 BlockList 入りしているか良く見ながら行うと良い。

* 2015/02/06 0:33 追記
 2/5 00:00 辺りから調整を終えて動かして居る。現状、Load Average を見る限りは平和が訪れている様だ。毎日発生していた負荷なので平坦なグラフは久々に見た。
06_load-day

スポンサーリンク