Linux:fail2banで防ぐ「DoS/DDoS攻撃」対策

不正アクセスを検知し一定時間、対象IPアドレスからのアクセスをブロックするソフトウェア「fail2ban」を用いた、DoS/DDoS攻撃対策を行います。通常 fail2banは、単体では使用せずファイアウォール(iptablesや firewalld)ともに使用します。(2017/12/23作成)

Firewall aitoff / Pixabay

1.fail2banの導入

0)環境

[crayon]
$ cat /etc/redhat-release
CentOS release 6.9 (Final)
[/crayon]

1)インストール

fail2banのインストールには、Yumリポジトリ「EPEL」が必要になります。

[crayon]
$ rpm -qa | grep -i epel-release
epel-release-6-8.noarch

$ sudo yum install fail2ban
[/crayon]

2)fail2banのlog設定

[crayon]
$ sudo mkdir /var/log/fail2ban

$ sudo vi /etc/fail2ban/fail2ban.conf

# logtarget = SYSLOG
logtarget = /var/log/fail2ban/fail2ban.log

$ sudo vi /etc/logrotate.d/fail2ban

/var/log/fail2ban/fail2ban.log {
missingok
notifempty
weekly
rotate 5
compress
dateext
create 0644 root root
postrotate
/usr/bin/fail2ban-client set logtarget /var/log/fail2ban/fail2ban.log 2> /dev/null || true
endscript
}
[/crayon]

3)fail2banのloglevel設定

Ban(ブロックした)やUnBan(ブロックを解除した)の処理だけを記録するように fail2banの設定ファイルを編集します。

[crayon]
$ sudo vi /etc/fail2ban/fail2ban.conf

loglevel = INFO ⇒ NOTICE
[/crayon]

注意) 後の解説にある fail2banの filter定義「recidive」を用いる場合、loglevelは「INFO」にする必要があります。

4)fail2banのファイアウォールversion

[crayon]
$ iptables -V
iptables v1.4.7
[/crayon]

ファイアウォール(iptables)のバージョンが古いとうまく動作しないことがあるようなので、 /etc/fail2ban/action.d/iptables-common.conf も編集して lockingoptオプションを無効にします。

[crayon]
# Option: lockingopt
# Notes.: Option was introduced to iptables to prevent multiple instances from
# running concurrently and causing irratic behavior. -w was introduced
# in iptables 1.4.20, so might be absent on older systems
# See https://github.com/fail2ban/fail2ban/issues/1122
# Values: STRING
lockingopt =

#lockingopt =

# Option: iptables
# Notes.: Actual command to be executed, including common to all calls options
# Values: STRING
iptables = iptables

iptables = iptables
[/crayon]

なお iptables –helpコマンドを実行して「-w」オプションがあれば本作業は必要ありません。

5)fail2banのfilter定義

[crayon]
$ sudo vi /etc/fail2ban/filter.d/nginx-dos.conf

[Definition]
failregex = ^ -.*”(HEAD|GET|POST).*
ignoreregex = \.(?i)(jpe?g|gif|png|bmp|pdf|js|css|woff|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?)
[/crayon]

6)fail2banのJail(ban)定義

[crayon]
$ sudo vi /etc/fail2ban/jail.local
[/crayon]

[crayon]
[nginx-dos]
enabled = true
port = http,https
filter = nginx-dos
logpath = /var/log/nginx/access.log
action = iptables-multiport[name=dos, port=”http,https”, protocol=tcp]
sendmail-whois[name=dos, dest=root, sender=fail2ban]
maxretry = 12
findtime = 3
bantime = 7200
[/crayon]

このJail(檻)設定内容をまとめると「 /etc/fail2ban/filter.d/nginx-dos.conf フィルターファイルのルールに、3秒間で12回一致したら、そのIPアドレスを1日ブロック」する。ブロック結果は root宛にメール配信する。

[crayon]
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban/fail2ban.log
action = iptables-allports[name=recidive]
sendmail-whois-lines[name=recidive, logpath=/var/log/fail2ban/fail2ban.log, dest=root, sender=fail2ban]
maxretry = 5
findtime = 43200 ; 12 hours
bantime = 604800 ; 1 week
[/crayon]

このJail(檻)設定内容をまとめると「 /etc/fail2ban/filter.d/recidive.conf フィルターファイルのルールに、攻撃再犯者には厳しく…fail2banでしつこい攻撃者だけ長期Banする設定。ブロック結果は root宛にメール配信する。

7)起動/自動起動設定

[crayon]
$ sudo /etc/init.d/fail2ban start
$ sudo /sbin/chkconfig fail2ban on
[/crayon]

2.fail2banの運用

1)ホワイトリスト設定

[crayon]
$ sudo vi /etc/fail2ban/jail.conf

ignoreip = 127.0.0.1/8 xxx.xxx.0.0/16
[/crayon]

2)間違えてIPを Banしてしまった場合の対処

[crayon]
$ sudo fail2ban-client set {Jailルール名} unbanip {BANしたIPアドレス}
[/crayon]

3)どれくらいIPが Banされているのかを確認

[crayon]
$ sudo fail2ban-client status {Jailルール名}
Status for the jail: {Jailルール名}
|- Filter
| |- Currently failed: 1
| |- Total failed: 184
| `- File list: /var/log/nginx/access.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 107.158.xxx.xxx
[/crayon]

以上

About yoshimasa

埼玉県さいたま市在住、2男3女のパパです。Linux系の技術情報を中心にまとめています。1978年2月生まれ。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください