Apache2 - DoS 攻撃対策!
Updated:
少し前に、「Apache2 - 脆弱性対策!」で紹介したとおり、Apache2 脆弱性(DoS攻撃)対策として、Apache 設定ファイルに不正なヘッダーやリクエストそのものを拒否する記述を追加する方法を採っていました。 ※本来は、Apache2 のバージョンを 2.2.20 以上にする事が一番妥当な方法ですが。。。
しかし、この方法でも DoS 攻撃を受けているみたいで、数日経つと OOM-Killer によりあらゆるサービスが徐々に停止していく現象に陥ります。
そこで、別の方法(Rangeを許容しない方法)も試してみましたが、OOM-Killer が動くことは無かったのですが、いまいち挙動が不安定(数時間試しただけですが)だったので、さらに別の方法を試してみました。
Apache2 に mod_evasive というDoS攻撃対策モジュールを導入してみました。 色々調べ結果、全て同じ対応方法が記載されていましたので、これで間違いないと思います。
導入記録
前提条件
以下の条件で作業・確認しております。
- サーバOSは CentOS 6.2
- Apache2 のバージョンは 2.2.15
1.httpd-devel のインストール
httpd-devel が未インストールならインストールする。
# yum -y install httpd-devel
2.mod_so.c の存在確認
mod_evasive の導入には mod_so.c が必要になるので存在するか確認する。
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
3.mod_evasive のダウンロード・展開
mod_evasive をダウンロード・展開する。
# cd /usr/local/src
# wget http://www.zdziarski.com/blog/wp-content/uploads/2010/02/mod_evasive_1.10.1.tar.gz
# tar zxvf mod_evasive_1.10.1.tar.gz
mod_evasive/
mod_evasive/.cvsignore
mod_evasive/LICENSE
mod_evasive/Makefile.tmpl
mod_evasive/README
mod_evasive/mod_evasive.c
mod_evasive/mod_evasive20.c
mod_evasive/mod_evasiveNSAPI.c
mod_evasive/test.pl
mod_evasive/CHANGELOG
4.mod_evasive のコンパイル・インストール
mod_evasive をコンパイル・インストールする。
# cd mod_evasive
# apxs -i -a -c mod_evasive20.c
/usr/lib/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -Wformat-security -fno-strict-aliasing -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -pthread -I/usr/include/httpd -I/usr/include/apr-1 -I/usr/include/apr-1 -c -o mod_evasive20.lo mod_evasive20.c && touch mod_evasive20.slo
mod_evasive20.c: In function ‘create_hit_list’:
mod_evasive20.c:118: 警告: no return statement in function returning non-void
mod_evasive20.c: In function ‘access_checker’:
mod_evasive20.c:212: 警告: implicit declaration of function ‘getpid’
mod_evasive20.c:212: 警告: format ‘%ld’ expects type ‘long int’, but argument 3 has type ‘int’
mod_evasive20.c:229: 警告: ignoring return value of ‘system’, declared with attribute warn_unused_result
mod_evasive20.c: In function ‘destroy_hit_list’:
mod_evasive20.c:301: 警告: no return statement in function returning non-void
/usr/lib/apr-1/build/libtool --silent --mode=link gcc -o mod_evasive20.la -rpath /usr/lib/httpd/modules -module -avoid-version mod_evasive20.lo
/usr/lib/httpd/build/instdso.sh SH_LIBTOOL='/usr/lib/apr-1/build/libtool' mod_evasive20.la /usr/lib/httpd/modules
/usr/lib/apr-1/build/libtool --mode=install cp mod_evasive20.la /usr/lib/httpd/modules/
libtool: install: cp .libs/mod_evasive20.so /usr/lib/httpd/modules/mod_evasive20.so
libtool: install: cp .libs/mod_evasive20.lai /usr/lib/httpd/modules/mod_evasive20.la
libtool: install: cp .libs/mod_evasive20.a /usr/lib/httpd/modules/mod_evasive20.a
libtool: install: chmod 644 /usr/lib/httpd/modules/mod_evasive20.a
libtool: install: ranlib /usr/lib/httpd/modules/mod_evasive20.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/tripwire/sbin:/root/bin:/sbin" ldconfig -n /usr/lib/httpd/modules
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib/httpd/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/lib/httpd/modules/mod_evasive20.so
[activating module `evasive20' in /etc/httpd/conf/httpd.conf]
5.mod_evasive の設定
まず、Apache 設定ファイル httpd.conf に以下の行が追加されていることを確認する。
LoadModule evasive20_module /usr/lib/httpd/modules/mod_evasive20.so
そして、Apache 設定ファイル httpd.conf の最終行に以下の記述を追加する。
# vi /etc/httpd/conf/httpd.conf
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 3
DOSSiteCount 50
DOSPageInterval 2
DOSSiteInterval 1
DOSBlockingPeriod 60
DOSWhitelist 127.0.0.1 192.168.11.*
DOSEmailNotify hoge@hoge.com
</IfModule>
各設定項目の意味は以下のとおり。
項目名 | 説明 |
---|---|
DOSHashTableSize | 各子プロセスでのハッシュテーブル・サイズ サイズを大きくするとパフォーマンスは良くなりますがメモリを消費します |
DOSPageCount | 同ページへのリクエスト数のしきい値 |
DOSSiteCount | 同サイトへのリクエスト数のしきい値 |
DOSPageInterval | PageCountしきい値の計測間隔(秒) デフォルト:1秒間隔 |
DOSSiteInterval | SiteCountしきい値の計測間隔(秒) デフォルト:1秒間隔 |
DOSBlockingPeriod | IPアドレスを遮断する時間(秒) この遮断されている間のアクセスには403 (Forbidden)を返します |
DOSWhitelist | 検出対象外とするIPアドレス |
DOSEmailNotify | DoS攻撃を受けたことを知らせるメールアドレス |
6.Apache 設定ファイルの文法チェック
Apache 設定ファイル httpd.conf の文法が正しいかチェックする。
# /etc/rc.d/init.d/httpd configtest
Syntax OK
7.Apache 再起動
設定を有効にするために Apache を再起動します。
# /etc/rc.d/init.d/httpd restart
今のところ順調です。 (実は他にも手を加えている箇所がありますが、今は秘密!)
以上。
Comments