apache2 httpd環境でhttpに対するDoSを回避するためのモジュール
Debian buster 環境で検索すると出てくるので試してみる.
$ apt-cache search apache dos libapache2-mod-evasive - evasive module to minimize HTTP DoS or brute force attacks libfile-listing-perl - module to parse directory listings $ apt show libapache2-mod-evasive Package: libapache2-mod-evasive Version: 1.10.1-3 Priority: optional Section: httpd Source: libapache-mod-evasive Maintainer: Alberto Gonzalez Iniesta <agi@inittab.org> Installed-Size: 82.9 kB Depends: libc6 (>= 2.14), apache2-api-20120211, bsd-mailx | mailx Homepage: http://www.zdziarski.com/blog/?page_id=442 Tag: protocol::http, role::program, role::shared-lib, suite::apache Download-Size: 15.0 kB APT-Manual-Installed: yes APT-Sources: http://deb.debian.org/debian buster/main amd64 Packages Description: evasive module to minimize HTTP DoS or brute force attacks mod_evasive is an evasive maneuvers module for Apache to provide some protection in the event of an HTTP DoS or DDoS attack or brute force attack. . It is also designed to be a detection tool, and can be easily configured to talk to ipchains, firewalls, routers, and etcetera. . This module only works on Apache 2.x servers
少し試すといくつかのバグを見つける.報告済だが長らく対処されていないし,上流も数年メンテされてなさそうなので別のものを使ったほうがいいかもしれない.
$ sudo apt install libapache2-mod-evasive $ sudo a2enmod evasive Module evasive already enabled
設定ファイル : /etc/apache2/mods-available/evasive.conf
DOSHashTableSize
ハッシュテーブルサイズ.大きくすると高速になるけどメモリ使用量が増える.DOSPageCount
同一ページでのDOSカウントDOSSiteCount
サイト単位でのODSカウントDOSPageInterval
同一ページでのDOSカウント間隔(秒)DOSSiteInterval
サイト単位でのODSカウント間隔(秒)DOSBlockingPeriod
DOSと判定されたときのブロック時間(秒)DOSEmailNotify
DOSと判定されたときの通知メール宛先(mailコマンドでメールが送れるように設定しておく)DOSSystemCommand
DOSと判定されたときに実行するコマンド(動作未確認)DOSLogDir
DOSと判定されたときに作られるログファイル格納ディレクトリ( dos-<IP address>
というファイル名)DOSWhitelist
DOSと判定されないアドレスを設定(複数行設定可能)
mod_evasive20.c
より既定値
#define DEFAULT_HASH_TBL_SIZE 3079ul // Default hash table size #define DEFAULT_PAGE_COUNT 2 // Default maximum page hit count per interval #define DEFAULT_SITE_COUNT 50 // Default maximum site hit count per interval #define DEFAULT_PAGE_INTERVAL 1 // Default 1 Second page interval #define DEFAULT_SITE_INTERVAL 1 // Default 1 Second site interval #define DEFAULT_BLOCKING_PERIOD 10 // Default for Detected IPs; blocked for 10 seconds #define DEFAULT_LOG_DIR "/tmp" // Default temp directory
テスト用のperl script がある.
$ perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl
しかしバグがあるので修正が必要.
$ sudo apt build-dep libapache2-mod-evasive $ sudo apt source libapache2-mod-evasive $ cd libapache-mod-evasive-1.10.1 $ #修正 $ debuild -uc -us -b $ sudo apt install ../libapache2-mod-evasive_1.10.1-3_amd64.deb
400になってしまう.
$ perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl HTTP/1.1 400 Bad Request HTTP/1.1 400 Bad Request HTTP/1.1 400 Bad Request :
改行コードを \n
から \r\n
に変更する.
@@ -10,7 +10,7 @@ my($SOCKET) = new IO::Socket::INET( Proto => "tcp", PeerAddr=> "127.0.0.1:80"); if (! defined $SOCKET) { die $!; } - print $SOCKET "GET /?$_ HTTP/1.0\n\n"; + print $SOCKET "GET /?$_ HTTP/1.0\r\n\r\n"; $response = <$SOCKET>; print $response; close($SOCKET);
$ perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 403 Forbidden HTTP/1.1 200 OK HTTP/1.1 403 Forbidden HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK :
メールは送信されるが, To:
, Subject:
も body の中に入ってしまっている.
From: www-data <www-data@vmi264672.contaboserver.net> To: matohara@gmail.com Subject: HTTP BLACKLIST 98.240.193.8 mod_evasive HTTP Blacklisted 98.240.193.8
mod_evasive20.c
の MAILER
に -t
オプションを加える.
#define MAILER "/usr/bin/mail -t %s"
$ man mail | grep '\-t,' -A1 -t, --to read recipients from the message header
1度目のDoS検出でログ( dos-<ip address>
)が作られ,2度目以降の検出時に403は返すが,syslogやメールに記録されない.
以下のissueによると制限解除時に該当ログファイルのクリーンアップ処理が必要.
3097 から 3079 に変更する.
コメント