最近、稀にサーバー負荷が非常に高い時があります。
その時でも完全にフリーズしているわけではないが、ログインして再起動するのがやっとな状況で
サーバーとしては機能しておらず、何かの対策を行う必要が出て来ました。
まずは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自体は設定通りの振る舞いをするだけで
決して万能なブロックツールというわけではありません。
他のブロック方法との併用や、環境にあった適切な設定を行うことが大切だと思います。