DoS攻撃対策 Apache mod_antiloris

mod_evasive、mod_limitipconnと攻撃対策のモジュールを導入しましたが
今回は一番厄介なSlowlorisの対策モジュールを導入します。

最初にmod-pacify-slowlorisを入れてみましたが
ページが正常に表示されなかったりしたので、mod_antilorisを入れる事にしました。
(mod-pacify-slowloris、mod_antilorisでも完全に防ぐのは、現状では難しいようです)

まずは、適当なディレクトリにソースをDL。

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

mod_antiloris-0.4.tar.bz2のDL
#wget ftp://ftp.monshouwer.eu/pub/linux/mod_antiloris/mod_antiloris-0.4.tar.bz2

解凍
#tar -xjvf mod_antiloris-0.4.tar.bz2

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

APXSを利用してコンパイル&インストール
#/usr/bin/apxs2 -i -a -c mod_antiloris.c
※APXSが未インストールの場合は
#apt-get install apache2-prefork-devで先にインストールしてください。

以下の行をapache2.confに追加
LoadModule antiloris_module /usr/lib/apache2/modules/mod_antiloris.so

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

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

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

暫くこれで様子を見てみる予定です。
それでもSlowlorisの被害にあうようであればiptablesのrecentで弾く事も検討します。

Slowlorisについて

Apacheに、DoS攻撃に繋がる脆弱性が新たに見つかったそうだ(本家/.記事より)

この脆弱性は、これを利用したHTTP DoSツール「Slowloris」がリリースされたことから明らかになったとのこと。この攻撃ツールはApacheに不完全なリクエストヘッダーを送り続けるもので、Apacheが最後のヘッダが送られてくるのを待つ間、偽のヘッダを送ることで接続をオープンにし続け、Apacheのプロセスを一杯にさせるものだという。

脆弱性はApache 1.x、 2.x、 dhttpd、 GoAhead WebServer、そしてSquidにて確認されているが、IIS6.0、 IIS7.0、およびlighttpdでは確認されていないとのこと。

SANSでは詳細のレポートが挙がっており、TimeOutディレクティブでタイムアウト値の設定を変えることでこの攻撃を軽減することが可能とのことで、今のところ対策はこれくらいしかないそうだ。

DoS攻撃対策 Apache mod_limitipconn

前回DoS攻撃対策としてmod_evasiveを導入しました。
今までは攻撃をあまり気にしていませんでしたが
そこそこmod_evasiveが働いているようなので、更に攻撃対策を強化することに。

今回導入するのは、同時接続数を制限してくれるmod_limitipconnというモジュールです。
このモジュールは同一IPからの同時接続数を制限してくれます。

まずは、適当なディレクトリにmod_limitipconnのページからソースをDLしてインストール。

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

mod_limitipconn-0.23のDL
#wget http://dominia.org/djao/limit/mod_limitipconn-0.23.tar.bz2

解凍
#tar xjvf mod_limitipconn-0.23.tar.bz2

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

Apache2用にMakefileを変更
#vi Makefile

7行目のAPXSコマンドをApache2用に変更
※APXSが未インストールの場合は
#apt-get install apache2-prefork-devで先にインストールしてください。

#   the used tools
APXS=apxs
APACHECTL=apachectl

↓ のように書き換え

#   the used tools
APXS=/usr/bin/apxs2
APACHECTL=apachectl

コンパイル&インストール
#make install

Apacheの設定にモジュールの記述を追加
#vi /etc/apache2/apache2.conf

LoadModule limitipconn_module /usr/lib/apache2/modules/mod_limitipconn.so

ExtendedStatus On



MaxConnPerIP 3
NoIPLimit image/*


※Locationの設定は複数記述することが出来ます。
また、.httaccessに記述することも可能です。
複数の設定を行うことで、より細かく制限を行う事が出来ます。

上記の設定の意味は、/(httpルート)以下のディレクトリで
同一IPからの同時接続数を3に制限する。
但し、MIMEタイプ image/* は除く、という設定になります。
MaxConnPerIPが3だとサイトによっては少ないかもしれません。
ZIPや大きなファイルなど、回線負荷に関わるものを、MIMEで少なめに指定するのは有効だと思います。
しかし通常のページを3に制限してしまうと、JavaScriptファイルを裏で読んでくれなかったりしますので
ページとして問題が出る場合があります。
その場合は数字を少し大きくしてあげるか、特定のファイルタイプのみカウントの対象(または非対象)にするか
MIMEタイプでカウントの対象外になるようにしましょう。

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

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

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

最後にうまく動作するかテストを行うといいと思います。
※ページによってはうまく読み込めなかったりしますので、テストされる事をお勧めします。
ブラウザを複数開いて、一気にアクセスしてみると簡単にテスト出来ます。

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

Kernel 2.6.32をコンパイル

※書いてあるカーネルより新しいカーネル用のdiffファイルは下の方にあります。
コマンド部分はカーネルのバージョンに合わせ、2.6.32.○のように書き換えて実行してください。

Kernelの2.6.32が正式にリリースされたので、T4のカーネルを2.6.32に上げてみることに。

まずは、適当なディレクトリを作成。
# mkdir kernel_complie
# cd kernel_complie

The Linux Kernel Archivesから2.6.32のカーネルソースをDL
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.bz2

解凍
# tar jxvf linux-2.6.32.tar.bz2

作業ディレクトリに2.6.32用のパッチをDL
↓これがパッチです。
kuro-nas-t4-2.6.32.diff

解凍したカーネルソースのディレクトリに移動。
# cd linux-2.6.32

initrd.img、its、dtbファイルをソースディレクトリにDL
(これらはFitImage作成用のディレクトリにDLでも構いません)
initrd.img
kuro_nas_t4.its
kuro_nas_t4.dtb
※dtbファイルは時刻のズレ対応済みです。

2.6.32用のパッチを実行
# patch -p 1 < ..//kuro-nas-t4-2.6.32.diff T4デフォルトのconfigファイルをコピー # cp arch/powerpc/configs/kuro_nas_t4_defconfig .config ※既にオプション変更したconfigを利用する場合は、変更済みのconfigをコピーしてください。

oldconfig実行
# make oldconfig

※カーネルのコンパイルオプションを変更する場合は、ここでオプション変更してください。
デフォルトで選択されていない機能やデバイスを有効にするには
コンパイルオプションを必要に応じて変更する必要があります。

コンパイルオプションを変更する場合
# make menuconfig

カーネルのコンパイル
# make

カーネルのコンパイルがうまく行けばmoduleのインストール
# make modules_install

コンパイルされたカーネルバイナリを名前変更
# mv vmlinux.bin.gz vmlinuz

fitImageの作成
# mkimage -f kuro_nas_t4.its uImage-2.6.32.buffalo

作成したfitImageを/bootにコピー
# cp uImage-2.6.32.buffalo /boot

試しに正常起動できるかテスト。
再起動してu-bootからコマンドを実行。

BUFFALO>> setenv kernel uImage-2.6.32.buffalo
BUFFALO>> run hdboot

正常起動したら/bootのシンボリックリンクを書き換えて、通常起動カーネルを新しく作成したカーネルに変更。
# cd /boot
# rm uImage.buffalo
# ln -s uImage-2.6.32.buffalo uImage.buffalo
※もし正常起動しなかった場合、シンボリックリンクを書き換えてなければ
普通にリセットすることで、正常動作時のカーネルで起動します。

今のところエラーも無く正常に2.6.32が動作中です。

以下は参考にさせて頂いたサイトです、感謝。
FrontPage – PukiWiki
D Blog

2009/12/21 追記
Kernel2.6.32.2をコンパイルして無事動作中です。

The Linux Kernel Archivesから2.6.32.2のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.bz2

Kernel2.6.32.2対応パッチファイル
kuro-nas-t4-2.6.32.2.diff

2010/01/09 追記
Kernel2.6.32.3をコンパイルして無事動作中です。

The Linux Kernel Archivesから2.6.32.3のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.3.tar.bz2

Kernel2.6.32.3対応パッチファイル
kuro-nas-t4-2.6.32.3.diff

2010/01/20 追記
Kernel2.6.32.4をコンパイルして無事動作中です。

The Linux Kernel Archivesから2.6.32.4のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.4.tar.bz2

Kernel2.6.32.4対応パッチファイル
kuro-nas-t4-2.6.32.4.diff

2010/01/24 追記
Kernel2.6.32.5をコンパイルして無事動作中です。

The Linux Kernel Archivesから2.6.32.5のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.5.tar.bz2

Kernel2.6.32.5対応パッチファイル
kuro-nas-t4-2.6.32.5.diff

2010/01/29 追記
Kernel2.6.32.6をコンパイルして無事動作中です。

The Linux Kernel Archivesから2.6.32.6のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.6.tar.bz2

Kernel2.6.32.6対応パッチファイル
kuro-nas-t4-2.6.32.6.diff

2010/01/30 追記
Kernel2.6.32.7をコンパイルして無事動作中です。

The Linux Kernel Archivesから2.6.32.7のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.7.tar.bz2

Kernel2.6.32.7対応パッチファイル
kuro-nas-t4-2.6.32.7.diff

2010/02/11 追記
Kernel2.6.32.8をコンパイルして無事動作中です。

The Linux Kernel Archivesから2.6.32.8のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.8.tar.bz2

Kernel2.6.32.8対応パッチファイル
kuro-nas-t4-2.6.32.8.diff

2010/02/26 追記
Kernel2.6.33をコンパイルしてテスト運用中です。

The Linux Kernel Archivesから2.6.33のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.tar.bz2

Kernel2.6.33対応パッチファイル
kuro-nas-t4-2.6.33.diff

2010/03/19 追記
Kernel2.6.33.1をコンパイルしてテスト運用中です。

The Linux Kernel Archivesから2.6.33.1のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.1.tar.bz2

Kernel2.6.33.1対応パッチファイル
kuro-nas-t4-2.6.33.1.diff

2010/04/03 追記
Kernel2.6.33.2をコンパイルしてテスト運用中です。

The Linux Kernel Archivesから2.6.33.2のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.2.tar.bz2

Kernel2.6.33.2対応パッチファイル
kuro-nas-t4-2.6.33.2.diff

2010/04/28 追記
Kernel2.6.33.3をコンパイルしてテスト運用中です。

The Linux Kernel Archivesから2.6.33.3のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.3.tar.bz2

Kernel2.6.33.3対応パッチファイル
kuro-nas-t4-2.6.33.3.diff

2010/05/14 追記
Kernel2.6.33.4をコンパイルしてテスト運用中です。

The Linux Kernel Archivesから2.6.33.4のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.4.tar.bz2

Kernel2.6.33.4対応パッチファイル
kuro-nas-t4-2.6.33.4.diff

2010/05/19 追記
Kernel2.6.34をコンパイルしてテスト運用中です。

The Linux Kernel Archivesから2.6.34のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.tar.bz2

Kernel2.6.34対応パッチファイル
kuro-nas-t4-2.6.34.diff

2010/07/06 追記
Kernel2.6.34.1をコンパイルしてテスト運用中です。

The Linux Kernel Archivesから2.6.34.1のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.1.tar.bz2

Kernel2.6.34.1対応パッチファイル
kuro-nas-t4-2.6.34.1.diff

2010/08/12 追記
Kernel2.6.35.1をコンパイルしてテスト運用中です。

The Linux Kernel Archivesから2.6.35.1のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.1.tar.bz2

Kernel2.6.35.1対応パッチファイル
kuro-nas-t4-2.6.35.1.diff

2010/08/16 追記
Kernel2.6.35.2をコンパイルしてテスト運用中です。

The Linux Kernel Archivesから2.6.35.2のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.2.tar.bz2

Kernel2.6.35.2対応パッチファイル
kuro-nas-t4-2.6.35.2.diff

2010/08/24 追記
Kernel2.6.35.3をコンパイルしてテスト運用中です。

The Linux Kernel Archivesから2.6.35.3のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.3.tar.bz2

Kernel2.6.35.3対応パッチファイル
kuro-nas-t4-2.6.35.3.diff

2010/09/30 追記
Kernel2.6.35.7をコンパイルしてテスト運用中です。

The Linux Kernel Archivesから2.6.35.7のカーネルソースをDL
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.7.tar.bz2

Kernel2.6.35.7対応パッチファイル
kuro-nas-t4-2.6.35.7.diff