mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Apache2 - DoS 攻撃対策!

[ サーバ構築 ] [ Apache, CentOS ]

こんばんは。

少し前に、「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 が未インストールならインストールする。

1
# yum -y install httpd-devel

2.mod_so.c の存在確認

mod_evasive の導入には mod_so.c が必要になるので存在するか確認する。

1
2
3
4
5
6
# httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c

3.mod_evasive のダウンロード・展開

mod_evasive をダウンロード・展開する。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 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 をコンパイル・インストールする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 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 に以下の行が追加されていることを確認する。

1
LoadModule evasive20_module   /usr/lib/httpd/modules/mod_evasive20.so

そして、Apache 設定ファイル httpd.conf の最終行に以下の記述を追加する。

1
2
3
4
5
6
7
8
9
10
11
# 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 の文法が正しいかチェックする。

1
2
# /etc/rc.d/init.d/httpd configtest
Syntax OK

7.Apache 再起動

設定を有効にするために Apache を再起動します。

1
# /etc/rc.d/init.d/httpd restart

今のところ順調です。 (実は他にも手を加えている箇所がありますが、今は秘密!)

以上。

Comments