如果要在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