如何寫 Fail2ban 的 filter

如果要在Fail2ban自訂封鎖條件

就要先寫好 filter

並在jail裡開啟

filter 其實就是用 regular expression

去parse每一行log

這一段 regular expression 比較特別的是

可以特別標注要封鎖的ip在哪

前一篇剛好講完如何安裝 modsecurity 的 nginx module

這幾天發現有很多人來try我其中一個站

所以就針對 modsecurity 的 log 寫一份自訂的封鎖條件

mod security 的 log 長這樣

www.domain.com 36.226.163.161 - - [10/Sep/2017:23:10:20 +0800] "GET /?id=1%20or%201=1 HTTP/1.1" 403 8192 - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36" 150505622085.113787 - /var/log/nginx/20170910/20170910-2310/20170910-231020-150505622085.113787 0 2153.000000 md5:c3c782d016803d103671676079e34188\n

這是之前測試留下的log

可以發現第一個是我的 domain

第二個是連線者的 ip

再來是時間

然後是 request uri

再來是 http status code

想法很簡單

只要讓 regular expression match 到 403 的 ip 即可

所以按照剛剛的順序來寫

一開始是我的domain但有些log這邊顯示的是我的hostname

所以用通用符號代替

[\.\d\w]*

可以有0或以上個 . 數字 跟文字

再來是要抓到的封鎖ip

[\.\d\w]*\s<HOST>

再來要判斷 status code 是403

[\.\d\w]*\s<HOST> - - \[.*\] \".*\" 403

所以整個filter檔案會長這樣

/etc/fail2ban/filter.d/mod-403.conf

[Definition]
failregex = [\.\d\w]*\s<HOST> - - \[.*\] \".*\" 403
ignoreregex =

之後再編輯 jail.local 啟用

加入

[mod-403]
enabled = true
port = http,https
filter = mod-403
logpath = /var/log/modsec_audit.log
bantime = 6000
findtime = 600
maxretry = 5

即可啟用

再測試一筆就可以在 /var/log/fail2ban.log 裡看到

2017-09-24 17:13:02,231 fail2ban.filter         [23430]: INFO    [mod-403] Found 36.231.my.ip

 

看更多