インターネット上にサーバを公開していると、sshやhttpdへDDoS攻撃やディレクトリトラサーバル攻撃を公開しているページすべてに行うようになツールを投げられたり、乗っ取りしようとして来たりといろいろと攻撃されることが多い。 DDoSやらツールでの攻撃を受けると大量のパケットやリクエストが飛んできてサーバへの負荷が重く、サービスの継続にも支障が出たりする。 そんな時は、攻撃してきているグローバルIPからの接続をファイアウォールなどでしばらく拒否してやるといった対応が必要になる。

そういったことをするためのツールがこのfail2banだ。 結構有名なツールだし、LPIC(303かな?201と202でも出てくるかも…)でもよく出てくるので名前を聞いたことのある人も多いと思う。 各種ログを元に、定義されたフィルターに適合したアクセス元の接続を拒否するようiptables(firewalld)で設定をするツールだ。

今回は、このfail2banをCentOS 7にインストール・設定しログを監視、問題のあるアクセス元のIPアドレスをbanさせる。 iptablesではなくfirewalldからファイアウォールの設定を行う必要があるので、iptablesを用いた方法と少し変える必要がある。 また、当たり前ながらfirewalldを起動させる必要があるので注意。 前提条件として、httpdおよびfirewalldはサービスとして起動済みで、80番ポートも解放されているものとする。

1. インストール

fail2banのインストールは簡単で、以下のようにepelリポジトリ経由でyumからインストールできる。

yum install -y epel-release
yum install fail2ban fail2ban-systemd

これでインストールは完了。

2. fail2banの設定

次に、fail2banの設定を行う。 fail2banは、主にそのアクセスが攻撃かどうかを判別するためのログについて記述したFilterと、Filter条件のログから攻撃者として検知する回数・さらに検知した後のBANの対処方法を定めるJailを設定、定義する。

2-1. fail2banのFilterを定義する

まずはアクセスが攻撃かどうかを判別するFilterの定義ファイルを作成する。 すでにデフォルトの定義ファイルが「/etc/fail2ban/filter.d/」フォルダ以下にあるので、対象のサービス名のファイルを随時編集するか、新規でファイルを作成してやればよい。 今回は、DDoS(apache-ddos.conf)とディレクトリトラサーバル(apache-dirtra.conf)に対応した定義ファイルを作成する。

/etc/fail2ban/filter.d/apache-ddos.conf
[Definition] failregex = ^<HOST> -.*"(GET|POST).* ignoreregex = \.(?i)(jpe?g|gif|png|bmp|pdf|js|css|woff|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?)
/etc/fail2ban/filter.d/apache-dirtra.conf
[Definition] failregex = <HOST>.*] "GET /.*\.\./\.\./\.\./ ignoreregex =

上で設定している項目がだが、それぞれ

  • failregex … BAN対象とするログの正規表現
  • ignoreregex … failregexの中で除外するログの正規表現

2-2. fail2banのJailを定義する

次にJailの定義ファイルを設定する。 この設定でBANする基準やBAN後の挙動についてを定義する。

「/etc/fail2ban/jail.conf」というファイルがあるが、アップデートで変更される可能性もあるので「/etc/fail2ban/jail.d/jail.local」というファイルをコピーして新規に作成する。 DDoS(apache-ddos)、ディレクトリトラサーバル(apache-dirtra)の2つのルールを追記する。

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.d/jail.local
/etc/fail2ban/jail.d/jail.local
[apache-ddos] enabled = true port = http,https filter = apache-ddos logpath = %(apache_access_log)s maxretry = 10 findtime = 5 bantime = 86400 action = %(action_mwl)s destemail = user@domain.com [apache-dirtra] enabled = true port = http,https filter = apache-dirtra logpath = %(apache_access_log)s maxretry = 10 findtime = 5 bantime = 86400 action = %(action_mwl)s destemail = user@domain.com

それぞれの設定項目だが、

  • enabled … Jailルールの有効/無効
  • port … Jailルールを適用するポート
  • filter … Jailルールで利用するフィルター名(/etc/fail2ban/filter.d/(フィルター名).conf)
  • logpath … 監視対象とするログのPATH(変数での指定可)
  • maxretry … 攻撃として認識する回数(findtimeで指定された秒数基準)
  • findtime … アクセス回数(maxretry)を攻撃としてカウントする時間
  • bantime … BANしたIPアドレスのブロック時間(秒)
  • action … BANしたIPアドレスに対して行うアクション。「%(action_mwl)s」はログの内容やWHOIS情報についてアラートメールに記述してくれる。
  • destemail … アラートメールの送信先アドレス

2-3. サービス起動

諸々の設定が終わったら、fail2banのサービス起動を行う。

systemctl start fail2ban
systemctl enable fail2ban

3.アクセス・攻撃を行ってみる

さて、インストールが完了したら実際にブラウザからアクセスや攻撃を行ってみよう。 今回の場合はDDoSで普通にF5アタックをすればいいだろう。

何度かアタックすると、「/var/log/fail2ban.log」にBanしたというログが出力されるはずだ。

2016-12-11 11:14:15,553 fail2ban.filter         [31812]: INFO    [apache-ddos] Found 172.XXX.XXX.XXX
2016-12-11 11:14:15,553 fail2ban.filter         [31812]: INFO    [apache-ddos] Found 172.XXX.XXX.XXX
2016-12-11 11:14:15,885 fail2ban.filter         [31812]: INFO    [apache-dirtra] Found 172.XXX.XXX.XXX
2016-12-11 11:14:15,885 fail2ban.filter         [31812]: INFO    [apache-dirtra] Found 172.XXX.XXX.XXX
2016-12-11 11:14:16,556 fail2ban.filter         [31812]: INFO    [apache-ddos] Found 172.XXX.XXX.XXX
2016-12-11 11:14:16,556 fail2ban.filter         [31812]: INFO    [apache-ddos] Found 172.XXX.XXX.XXX
2016-12-11 11:14:16,828 fail2ban.actions        [31812]: NOTICE  [apache-ddos] Ban 172.XXX.XXX.XXX

これで、あとは解除の時間がくるまで対象のIPアドレスはアクセスができないようになった。

3-1.現在BANされているIPアドレスを調べる

現在アクセス制限をしているIPアドレス(BANされたIPアドレス)を調べるには、以下のコマンドを実行する。

fail2ban-client status <Jailルール名>
[root@BS-PUB-WEBTOOL-TEST01 ~]# fail2ban-client status apache-ddos
Status for the jail: apache-ddos
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     90
|  `- File list:        /var/log/httpd/access_log
`- Actions
   |- Currently banned: 2
   |- Total banned:     2
   `- Banned IP list:   172.XXX.XXX.XXX 172.XXX.XXX.XXX

3-2.BANされたIPアドレスを解除する

BANされてしまったIPアドレスを手動で解除する場合は、以下のコマンドで解除を行う。

fail2ban-client set <Jail名> unbanip IPアドレス

これで無事攻撃を受けた際にfail2banで対象のIPアドレスをBANできるようになった。 少々リソースを食うのが難点だが、インストールや設定も簡単なので外部公開しているサービスでは導入しておくといいだろう。


参考