ユーザ用ツール

サイト用ツール


サイドバー

最新の10件
一覧
linux:debian:buster:apache2:libapache2-mod-evasive

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

少し試すといくつかのバグを見つける.報告済だが長らく対処されていないし,上流も数年メンテされてなさそうなので別のものを使ったほうがいいかもしれない.

導入

snippet.bash
$ 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

しかしバグがあるので修正が必要.

https://wiki.matoken.org/linux/debian/buster/apache2/libapache2-mod-evasive#%E3%83%AD%E3%82%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E5%87%BA%E5%8A%9B%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84

バグ

パッケージを作り直す

snippet.bash
$ 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になってしまう.

snippet.bash
$ 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 に変更する.

snippet.bash
@@ -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);
snippet.bash
$ 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.cMAILER-t オプションを加える.

#define MAILER "/usr/bin/mail -t %s"

$ man mail | grep '\-t,' -A1
       -t, --to
              read recipients from the message header

ログファイルがクリーンアップされない(2度目以降の通知が飛ばない)

1度目のDoS検出でログ( dos-<ip address> )が作られ,2度目以降の検出時に403は返すが,syslogやメールに記録されない. 以下のissueによると制限解除時に該当ログファイルのクリーンアップ処理が必要.

キャッシュサイズが間違っているらしい

コメント

コメントを入力. Wiki文法が有効です:
   ___    ___   __  __   _  __   ____
  / _ \  / _ \ / / / /  / |/ /  / __/
 / ___/ / ___// /_/ /  /    /  / _/  
/_/    /_/    \____/  /_/|_/  /_/
 
linux/debian/buster/apache2/libapache2-mod-evasive.txt · 最終更新: 2021/06/18 05:12 by matoken