想定環境
CentOS 6 または 7
# rpm -q mod_evasive
mod_evasive-1.10.1-10.el6.x86_64
# rpm -q mod_evasive
mod_evasive-1.10.1-22.el7.x86_64
効能
しつこいHTTP DoSアタックやブルートフォースアタックに。
導入前の検討事項
ホワイトリスト
下記のケースでは、アクセス元IPアドレスをホワイトリストに登録することを検討しましょう。
- 決済モジュールを導入していて通知のある場合、その通知サーバー
- ロードバランス構成の場合、ロードバランサ(冗長構成の場合はその全て。大抵クラウド管理画面で確認できます)
- 死活監視サーバー
- CDN
- 検索ボット
- その他に自サイトをキックしてくる連携プログラム
設定ファイル
設定ファイルは /etc/httpd/conf.d/mod_evasive.conf です。
デフォルトの設定は、下記の通りです。
LoadModule evasive20_module modules/mod_evasive20.so
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
#DOSEmailNotify you@yourdomain.com
#DOSSystemCommand "su - someuser -c '/sbin/... %s ...'"
#DOSLogDir "/var/lock/mod_evasive"
#DOSWhitelist 127.0.0.1
#DOSWhitelist 192.168.0.*
</IfModule>
ブラックリストの動き
- クライアントIPアドレスがブラックリストに登録されていれば、403 Forbidden を返す。
- 同一ページに 2回/秒 のアクセスがあれば、ブラックリストに登録する(DOSPageCount/DOSPageInterval)
- 同一サイトに 50回/秒 のアクセスがあれば、ブラックリストに登録する(DOSSiteCount/DOSSiteInterval)
- ブラックリスト登録後10秒間 403 Forbidden を返す。新にアクセスがあれば、その都度10秒延長される(DOSBlockingPeriod)
DOSLogDir
ブラックリスト登録時、このディレクトリ下に dos-<IP>
という名前でファイルが作成されます。
これは DOSEmailNotify・DOSSystemCommand の実行を制御するロックファイルです。
DOSEmailNotify・DOSSystemCommand はロックファイル作成時にのみ実行され、既にロックファイルが
存在する場合は実行されません。
また、ブラックリスト登録時に /var/log/messages
にログが出力されますが、これもロックファイル作成時のみ出力されます。
Jun 18 18:53:28 sv mod_evasive[21663]: Blacklisting address 127.0.0.1: possible DoS attack.
デフォルトではロックファイルを消さないので、DOSEmailNotifyを設定しても一度しか送信されません。一時間ごとにメールを受けとっていもいい場合は、ロックファイルの削除をスケジュールする設定をします。
DOSSystemCommand "echo rm -f /tmp/dos-%s | SHELL=/bin/sh at now + 60 minutes"
ロックファイル作成後、1時間後に削除します。
デフォルト値は /tmp です。
ロックファイルの中身は、ロックファイルを作成したhttpdのプロセスIDです。
DOSEmailNotify
デフォルトでは通知メールの件名が空ですが、設定可能です。
DOSEmailNotify "-s 'DoS Attack Alert' me@example.com"
DOSSystemCommand
TODO: iptables/ipset と連携
導入手順
rpmパッケージをインストールする
# yum -y install mod_evasive
初回導入時は、Apacheを再起動して反映します。
# service httpd restart
設定変更時は、リロードで反映します。
# service httpd reload
動作確認
連続アクセスで、途中から 403 Forbidden になる事を確認します。
# yes 'exec 4<>/dev/tcp/127.0.0.1/80; printf "GET / HTTP/1.0\r\n\r\n" >&4; head -1 <&4' | head -100 | bash
HTTP/1.1 200 OK
HTTP/1.1 200 OK
... # 200 OK の繰り返し
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
... # 403 Forbidden の繰り返し
HTTP/1.1 403 Forbidden
syslogにログが出力されている事を確認します。
# grep mod_evasive /var/log/messages
Jun 18 18:53:28 sv mod_evasive[21663]: Blacklisting address 127.0.0.1: possible DoS attack.
ロックファイルが作成されます。
# ls /tmp/dos-127.0.0.1
/tmp/dos-127.0.0.1
付属のtest.plは、最近のapacheでは 400 Bad Request になって使えません。リクエストの改行コードがCRLFでないためです。
切り戻し手順
mod_evasive.confのLoadModuleをコメントアウトします。
#LoadModule evasive20_module modules/mod_evasive20.so
Apacheを再起動して反映して、モジュールをアンロードします。
# service httpd restart