Fail2Ban

用途

監聽 Service Log File 找出想封鎖Client
可以用在防暴力破解密碼掃網址之類的行為
例如:

  • 2分鐘內,登入失敗100次,就擋掉60分鐘
  • 一直寄信給不存在的信箱地址, 像是 vivian@example.com
  • 一直被 try 不存在的 uri, 像是 example.com/editWhiteList

環境

  • CentOS 7

安裝

systemctl enable --now firewalld
yum install -y epel-release
yum install -y fail2ban

設定

確認設定,不一定需要修改

vi /etc/fail2ban/fail2ban.conf

# 修改 log path
logtarget = /var/log/fail2ban.log
# jail.conf 裡面的 [DEFAULT] 是 banaction = iptables-multiport
# 在 CentOS 7 要用 firewallcmd-ipset
vi /etc/fail2ban/jail.d/00-firewalld.conf

[DEFAULT]
banaction = firewallcmd-ipset[actiontype=<multiport>]
banaction_allports = firewallcmd-ipset[actiontype=<allports>]

實例 [ Mail Service 防暴力破解 ]

  • postfix-sasl
  • dovecot
vi /etc/fail2ban/jail.local

[DEFAULT]
# 不想擋的IP or CIDR mask
ignoreip = 127.0.0.1 192.168.0.0/16

# 2分鐘內失敗100次就擋掉,m = 分鐘
findtime = 2m
maxretry = 100

# 每次要擋多久 (秒),m = 分鐘
bantime = 60m

# 要監聽的服務
[postfix-sasl]
enabled = true

[dovecot]
enabled = true
# 因為 dovecot 不會寫 log 到 systemd
# 所以 backend 不能使用預設的 systemd 且要指定 logpath
backend = auto
logpath = /var/log/dovecotlog

啟動

systemctl enable --now fail2ban

設定檔說明

設定檔讀取順序 (後面的設定檔會覆蓋前面的設定檔)
  1. /etc/fail2ban/jail.conf
  2. /etc/fail2ban/jail.d/*.conf, alphabetically
  3. /etc/fail2ban/jail.local
  4. /etc/fail2ban/jail.d/*.local, alphabetically

有關 postfix-saslDEFAULT 設定,
可以在 /etc/fail2ban/jail.conf 找到下面設定

[postfix-sasl]
filter   = postfix[mode=auth]
logpath  = %(postfix_log)s
backend  = %(postfix_backend)s

分別是

  • filter : 在 log file 裡要尋找的 pattern,
    設定檔路徑是 /etc/fail2ban/filter.d
    根據上面的設定,設定檔為 /etc/fail2ban/filter.d/postfix.conf 並輸入參數 mode=auth
  • logpath : log file 路徑
  • backend : 監聽模式,通常設 auto 即可

那麼 %(postfix_log)s%(postfix_backend)s 又是什麼鬼呢?
%(postfix_log)s 是命名為 postfix_log變數
這些變數在哪裡定義的呢? 在 /etc/fail2ban/jail.conf 裡面會看到

[INCLUDES]
before = paths-fedora.conf

[INCLUDES] 往上追,在 /etc/fail2ban/paths-fedora.conf 裡又看到

[INCLUDES]
before = paths-common.conf

[DEFAULT]
syslog_mail_warn = /var/log/maillog
postfix_backend = systemd

這邊就看到 %(postfix_backend)s 的設定值是 systemd
再往上追,在 /etc/fail2ban/paths-common.conf 裡又可以看到

[DEFAULT]
postfix_log = %(syslog_mail_warn)s

發現 postfix_log%(syslog_mail_warn)s
也就是在 paths-fedora.conf 裡定義的 syslog_mail_warn = /var/log/maillog

Fail2ban 是怎麼擋這些 client 的

可以看到前面在 /etc/fail2ban/jail.d/00-firewalld.conf 的設定

[DEFAULT]
banaction = firewallcmd-ipset[actiontype=<multiport>]
banaction_allports = firewallcmd-ipset[actiontype=<allports>]

ban 掉 client 要用的是 firewallcmd-ipset
那這個 action 在哪裡定義的呢?
action設定檔路徑 /etc/fail2ban/action.d/
/etc/fail2ban/action.d/firewallcmd-ipset.conf 裡面

actionstart = ipset create <ipmset> hash:ip timeout <bantime><familyopt>
               firewall-cmd --direct --add-rule <family> filter <chain> 0 <actiontype> -m set --match-set <ipmset> src -j <blocktype>

actionban = ipset add <ipmset> <ip> timeout <bantime> -exist

actionstart 是第一次 action 的動作,
上面定義要新建一個 ipset 並且 firewalld 要讀取這個新建的 ipset 設定,
actionban 是發現符合ban條件時的動作,
是增加 IPexpire timeipset

狀態檢查

檢查 ban 狀態

fail2ban-client status postfix-sasl
# print
Status for the jail: postfix-sasl
|- Filter
|  |- Currently failed:	7
|  |- Total failed:	3645
|  `- Journal matches:	_SYSTEMD_UNIT=postfix.service
`- Actions
   |- Currently banned:	2
   |- Total banned:	655
   `- Banned IP list:	1.1.1.1 2.2.2.2

手動解除封鎖 IP

fail2ban-client set postfix-sasl unbanip 1.1.1.1

firewalld 檢查

Banned IP list 有東西之後才會有,還沒有人被 Ban 之前看不到
firewall-cmd --direct --get-all-rules

# 會看到已經設定 `--match-set f2b-postfix-sasl` 採取 `REJECT` 行為
ipv4 filter INPUT_direct 0 -p tcp -m multiport --dports smtp,465,submission,imap,imaps,pop3,pop3s -m set --match-set f2b-postfix-sasl src -j REJECT --reject-with icmp-port-unreachable

ipset 檢查

Banned IP list 有東西之後才會有,還沒有人被 Ban 之前看不到
ipset list

# print
Name: f2b-postfix-sasl
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536 timeout 600
Size in memory: 120
References: 1
Number of entries: 0
Members:

查看 Log

狀態說明:

  • Unban:bantime 過期所以解除封鎖的 IP
  • Ban:開始封鎖的IP
  • Found:登入失敗的IP,失敗次數就是用這個算
    cat /var/log/fail2ban.log
    # print
    2019-12-23 11:29:23,529 fail2ban.actions        [4085]: NOTICE  [postfix-sasl] Unban 123.123.123.123
    2019-12-23 11:29:47,357 fail2ban.filter         [4085]: INFO    [postfix-sasl] Found 123.123.123.123 - 2019-12-23 11:29:47
    2019-12-23 11:29:55,576 fail2ban.actions        [4085]: NOTICE  [postfix-sasl] Ban 1.1.1.1
    

Tags : [ CentOS Mail Security ]