2017/09/22

fail2ban 0.9.6-2


原先在 debian 6 做 apt-get dist-upgrade ,結果因為 esstential package : dpkg 無法相容,導致整個基礎架構的套件安裝有問題 (可能是 debian 6 -> 9 版本跨太多)
** 以後不要再做 dist-upgrade **  
如果跨太多版本,另裝一台 VM ,再將軟體裝回去,再把設定檔複製過去,理論上也可以無痛轉移
在遷移的過程中,fail2ban 的服務未如預期運作,原來是設定檔的結構有大變動
記錄如下:


fail2ban.conf 要加入這些設定,不然會一直看到警告訊息
ocket = /var/run/fail2ban/fail2ban.sock
pidfile = /var/run/fail2ban/fail2ban.pid
syslogsocket = auto
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 86400

新版的設定和舊版稍有不同
首先是新版支援 customize config (這我自創的,不知道作者是怎麼稱呼)
意思是程式所附的 config (filter.d/*.conf) 建議不要動,然後另外建立自己的 filter 

以 postfix 為例:
原本的 postfix.conf 不要去動,另外建一個 postfix.local (如下
[Definition]
failregex = %(known/failregex)s
            ^%(__prefix_line)slost connection after (AUTH|UNKNOWN|EHLO) from [^\[]*\[\]\s*$
標示的部份,表示引用原本 postfix.conf 的東西,這樣 config 就會包含 postfix.local  
(參考資料  Blocking relay hammering on Postfix with Fail2ban | Vorkbaard uit de toekomst) 

regex 實在不是人看的東西,因此一定會對自己剛寫的正規表示法有所疑問:寫這樣程式看的懂嗎?  (是你寫的東西沒符合語法吧喂)

因此 fail2ban 有一個工具程式 fail2ban-regex 用來檢測語法是否有效,mail.log 裡面有多少 log 符合我們寫的規則
$ fail2ban-regex /var/log/mail.log /etc/fail2ban/filter.d/postfix.conf

執行結果
Running tests
=============
Use   failregex filter file : postfix, basedir: /etc/fail2ban
Use         log file : /var/log/mail.log
Use         encoding : UTF-8
Results
=======
Failregex: 16134 total
|-  #) [# of hits] regular expression
|   8) [16134] ^(?:\[\])?\s*(?:<[^.]+\.[^.]+>\s+)?(?:\S+\s+)?(?:kernel: \[ *\d+\.\d+\]\s+)?(?:@vserver_\S+\s+)?(?:(?:(?:\[\d+\])?:\s+[\[\(]?postfix(-\w+)?/(?:submission/|smtps/)?smtp[ds](?:\(\S+\))?[\]\)]?:?|[\[\(]?postfix(-\w+)?/(?:submission/|smtps/)?smtp[ds](?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)\s+)?(?:\[ID \d+ \S+\]\s+)?lost connection after (AUTH|UNKNOWN|EHLO) from [^\[]*\[\]\s*$
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
|  [62930] (?:DAY )?MON Day 24hour:Minute:Second(?:\.Microseconds)?(?: Year)?
`-
Lines: 62930 lines, 0 ignored, 16134 matched, 46796 missed
[processed in 9.53 sec]

postfix 的規則抓到 16134 行符合規則,這些符合規則的 ip 就會被提報給 iptable 進行 ban ip
root@lnx02:/etc/fail2ban# iptables-save
# Generated by iptables-save v1.6.0 on Thu Sep 21 14:26:59 2017
*filter
:INPUT ACCEPT [79:6174]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [105:10926]
:f2b-postfix - [0:0]
:f2b-postfix-sasl - [0:0]
:f2b-sshd - [0:0]
-A INPUT -p tcp -m tcp --dport 25 -j f2b-postfix-sasl
-A INPUT -p tcp -m tcp --dport 25 -j f2b-postfix
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A f2b-postfix -s 117.68.174.107/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 60.168.177.188/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 117.68.174.101/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 60.168.180.255/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 117.68.172.209/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 60.168.183.118/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 93.174.94.246/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 60.168.183.92/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 60.168.181.110/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 60.168.177.252/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 36.7.102.152/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 36.7.102.15/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 36.7.102.108/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 192.168.0.10/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 117.68.175.253/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 117.68.175.217/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 117.68.174.179/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 117.68.173.223/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 117.68.172.239/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -s 117.68.172.212/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-postfix -j RETURN
-A f2b-postfix-sasl -j RETURN
-A f2b-sshd -j RETURN
COMMIT
# Completed on Thu Sep 21 14:26:59 2017

(IP 是來亂的,因此不馬賽克也沒關係吧)

上面的 fail2ban-regex 雖然強大,但並沒有解決我的問題:為什麼新版的 fail2ban 沒有ban 搗蛋鬼的 ip?

在這個指定的幫助下,發現我的 filter 根本沒有生效
fail2ban-client -d | grep "lost connection"
執行結果是空白

正常的執行結果是
root@lnx02:/etc/fail2ban# fail2ban-client -d | grep "lost connection"
['set', 'postfix', 'addfailregex', '^(?:\\[\\])?\\s*(?:<[^.]+\\.[^.]+>\\s+)?(?:\\S+\\s+)?(?:kernel: \\[ *\\d+\\.\\d+\\]\\s+)?(?:@vserver_\\S+\\s+)?(?:(?:(?:\\[\\d+\\])?:\\s+[\\[\\(]?postfix(-\\w+)?/(?:submission/|smtps/)?smtp[ds](?:\\(\\S+\\))?[\\]\\)]?:?|[\\[\\(]?postfix(-\\w+)?/(?:submission/|smtps/)?smtp[ds](?:\\(\\S+\\))?[\\]\\)]?:?(?:\\[\\d+\\])?:?)\\s+)?(?:\\[ID \\d+ \\S+\\]\\s+)?lost connection after (AUTH|UNKNOWN|EHLO) from [^\\[]*\\[\\]\\s*$']


如果有注意到我上面 fail2ban-regex 的語法,應該可以看到,我有指定 filter:postfix 的完整路徑,還有 mail.log 的完整路徑
$ fail2ban-regex /var/log/mail.log /etc/fail2ban/filter.d/postfix.conf

但從 fail2ban-client 的檢查結果來看,fail2ban 並不知道我有設定 filter 

原來 0.8.1 的 filter 是統一寫在 jail.conf 裡面,因此改 jail.conf 就可以了

不過 0.9.6 因為模組化的關係,已經把 filter 的結構拆開,所以我必須先到 jail.d 裡面,先去指定我的 postfix jail,才能啟用 postfix filter
jail 的內容如下:
[postfix-sasl]
enabled  = true
filter   = postfix-sasl
action   = iptables[name=postfix-sasl, port=smtp, protocol=tcp]
logpath  = /var/log/mail.log
maxretry = 3
findtime = 30
bantime = 33200

[postfix]
enabled  = true
filter   = postfix
action   = iptables[name=postfix, port=smtp, protocol=tcp]
logpath  = /var/log/mail.log
maxretry = 3
findtime = 30
語法的部份和舊版相比並無變化,不另說明

總結一下
  1. 0.9.6 必須先設定 fail2ban.conf
  2. 在 jail.d 中,新增要處理的程式 (例 postfix) 及其 log 所在位置
  3. 在 filter.d 中,新增自定的 filter (例 postfix.local)
  4. 用 fail2ban-client 先檢查 jail.d/postfix 的設定
  5. 再用 fail2ban-regex 檢查正規表示法能不能抓到違規的 log
  6. 啟動 fail2ban 的服務
  7. 觀察 log
  8. 用 iptables-save 看是不是有 ip 被抓進去關 (ban ip)


沒有留言: