DoS攻撃対策 Apache mod_evasive

最近、稀にサーバー負荷が非常に高い時があります。
その時でも完全にフリーズしているわけではないが、ログインして再起動するのがやっとな状況で
サーバーとしては機能しておらず、何かの対策を行う必要が出て来ました。

まずはKernelを最新の2.6.32.2にアップ。
これだけでは解決しないと考えているので、一番疑わしいhttpdにも対策を。
既にiptablesにてヤバそうな国からのアクセス自体をブロックしているが
DoS攻撃などは、ウィルス感染により足場サーバーから行われるので
DoS攻撃をブロックすることにしました。

今回はDoS攻撃に有効なアパッチ用のモジュールmod_evasiveを使用することにました。

まずは、適当なディレクトリにzdziarski.comのmod_evasiveページからソースをDLしてインストール。
※既にリンク先のサイトはなくなっているようです

ディレクトリ移動
#cd /usr/local/src

mod_evasive v1.10.1のDL
#wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz

解凍
#tar xzf mod_evasive_1.10.1.tar.gz

解凍したソースディレクトリに移動
#cd mod_evasive

このモジュールはAPXSを使用してコンパイル&インストールを行うのですが
デフォルトではAPXSが入っていなかったので、パッケージをインストール。
#apt-get install apache2-prefork-dev

APXSを利用してコンパイル&インストール
#/usr/bin/apxs2 -i -a -c mod_evasive20.c

※ブラックリスト追加時にメールを送信したい場合は
mod_evasive20.cの中にメールコマンドがハードコーディングされているので
コマンドを書き換える必要があります。

45行目の以下の行がメール送信コマンド部分です。
#define MAILER “/bin/mail %s”

/* BEGIN DoS Evasive Maneuvers Definitions */

#define MAILER	"/bin/mail %s"
#define  LOG( A, ... ) { openlog("mod_evasive", LOG_PID, LOG_DAEMON); syslog( A, __VA_ARGS__ ); closelog(); }

Exim4の場合は ↓ のように書き換えることで送信出来ます

/* BEGIN DoS Evasive Maneuvers Definitions */

#define MAILER	"mail -t %s"
#define  LOG( A, ... ) { openlog("mod_evasive", LOG_PID, LOG_DAEMON); syslog( A, __VA_ARGS__ ); closelog(); }

件名も付けたい場合は ↓ のように書き換えることで件名付きで送信出来ます

/* BEGIN DoS Evasive Maneuvers Definitions */

#define MAILER	"mail -s 'ここに件名を入れます' -t %s"
#define  LOG( A, ... ) { openlog("mod_evasive", LOG_PID, LOG_DAEMON); syslog( A, __VA_ARGS__ ); closelog(); }

当然ならがApacheの設定ファイルのDOSEmailNotifyに(後述の設定部分参照)
送信先のメールアドレスを書いて有効にする必要があります。

コンパイルとインストールに成功したようですが
なんかモジュールのデフォルト設定書き込みに失敗したみたいなので、手動で書きこみます。

confファイルに追記(追記はhttpd.confで良いと思いますが、私はファイル分けが面倒な人なので・・・)
#vi /etc/apache2/apache2.conf

以下の行をapache2.confに追加

LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so


DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 60
DOSLogDir "/var/log/apache2/mod_evasive/logs"
#DOSEmailNotify info@domain
#DOSSystemCommand   ""
#DOSWhitelist       127.0.0.1

これらの設定の意味は、「mod_evasive 設定」などで検索すると沢山出て来ますので、省略させて頂きます。
ちなみにこの設定では、1秒間に同じページに2回アクセスがあるか
1秒間にサイトに50回以上アクセスがあった場合に、60秒間 403Eroorを返すような動作となります。
ブロックの記録は、DOSLogDirで設定した場所へブロックしたIPが保存されます。

設定が終わったらconfが正しく設定されたかを確認。
#apache2ctl -M

上記コマンド実行後にevasive20_moduleとSyntax OKが表示されれば、設定自体は問題ない事になります。

設定が問題なければ、apacheを再起動
#/etc/init.d/apache2 restart

ちゃんとブロック出来るかmod_evasiveのソースに付属していた、テストスクリプトを実行
#perl test.pl

テストのレスポンスが、途中からHTTP/1.1 403 Forbiddenを返すようになれば
うまくブロックが出来ている事になります。

mod_evasive自体は設定通りの振る舞いをするだけで
決して万能なブロックツールというわけではありません。
他のブロック方法との併用や、環境にあった適切な設定を行うことが大切だと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です