iT邦幫忙

1

fail2ban 自定義規則 fail2ban-regex 失敗,請問正確寫法

環境

Ubunta 16.04
fail2ban 0.10.4
nginx 1.10.3
沒裝 php , mysql

情境描述

最近因為一直被

45.6.76.58 - - [05/Aug/2019:22:41:45 +0000] "GET /logon.php HTTP/1.1" 301 194 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"
45.6.76.58 - - [05/Aug/2019:22:41:45 +0000] "GET /help-e.php HTTP/1.1" 301 194 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"
45.6.76.58 - - [05/Aug/2019:22:41:45 +0000] "GET /license.php HTTP/1.1" 301 194 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"
45.6.76.58 - - [05/Aug/2019:22:41:45 +0000] "GET /log.php HTTP/1.1" 301 194 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"
45.6.76.58 - - [05/Aug/2019:22:41:45 +0000] "GET /hell.php HTTP/1.1" 301 194 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"
45.6.76.58 - - [05/Aug/2019:22:41:46 +0000] "GET /pmd_online.php HTTP/1.1" 301 194 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"

所以裝了 fail2ban 想說來擋掉這些 ip
於是作了以下設定

jail.local設定

[DEFAULT]
#3600秒內失敗2次就ban,bantime=-1 == 永久

bantime = -1
findtime = 3600
maxretry = 2

ignoreip = 127.0.0.1

[sshd]
enabled = true
mode   = normal
port    = ssh
logpath = /var/log/auth.log
#backend = systemd

[nginx-http-auth]
enabled = true
port    = http,https
logpath = /var/log/nginx/error.log

[nginx-botsearch]
enabled = true
port     = http,https
logpath  = /var/log/nginx/error.log

[http-cc]
enabled = true
port = http,https
filter = nginx-cc
logpath = /var/log/nginx/access.log
action = iptables-multiport[name=nginxcc, port="http,https", protocol=tcp]
maxretry = 480
findtime = 60
bantime = 86400

[phpmyadmin-syslog]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log

但發現即使 [phpmyadmin-syslog] 有開,來自 45.6.76.58 的"善液" 還是源源不絕

於是猜測可能因為我本身沒有裝php,所以把 [phpmyadmin-syslog] 的 logpath 設在/var/log/nginx/access.log 可能造成 regex 不合身(php 和 nginx log檔格式不同造成),因此失敗。

所以我自己重寫一個規則去 regex 。

  1. copy nginx access.log 並把紀錄貼在 https://regex101.com/
  2. 寫好正則表達式
  3. 把寫好的正則改成 fail2ban 的版本(改)
  4. fail2ban-regex access.log /etc/fail2ban/filter.d/nginx-php-out.conf

https://ithelp.ithome.com.tw/upload/images/20190806/20112304YNOFRxGD1G.png
(先寫正則)

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[^\"]+\"(GET|POST)\s\/([^\"]+\.PHP|mysql|[^\"]+\.php|manager\/html){1,}.+\"

https://ithelp.ithome.com.tw/upload/images/20190806/201123048cbTSX1Nvw.png
(改fail2ban版本)

<HOST>[^\"]+\"(GET|POST)\s\/([^\"]+\.PHP|mysql|[^\"]+\.php|manager\/html){1,}.+\"

https://ithelp.ithome.com.tw/upload/images/20190806/20112304bq9a9TNiLw.png
(發現自己寫的無法使用...)


這個寫法是參考
https://newtoypia.blogspot.com/2016/04/fail2ban.html
https://ithelp.ithome.com.tw/upload/images/20190806/20112304JmOVYn9x4J.png

完整版code:
https://gist.github.com/ckhung/a5710351b281c4bd079c7b38a692b9d6
https://ithelp.ithome.com.tw/upload/images/20190806/20112304vCdtwkvwle.png

問題

1.請問要怎麼修改正則讓他能正常運作?

2.請問有沒有官方或網友有其他更漂亮的解決方式?
(可能有但我沒挖到,故此一問...)

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2019-08-06 19:50:01 檢舉
先看看:
systemctl status fail2ban.service
we684123 iT邦研究生 5 級 ‧ 2019-08-07 13:30:54 檢舉
/var/log # systemctl status fail2ban.service root@XXX
● fail2ban.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead) since 五 2019-08-02 07:54:06 UTC; 4 days ago
Main PID: 10363 (code=killed, signal=TERM)

8月 02 07:53:03 XXX systemd[1]: Starting Fail2Ban Service...
8月 02 07:53:05 XXX systemd[1]: Started Fail2Ban Service.
8月 02 07:54:04 XXX systemd[1]: Stopping Fail2Ban Service...
8月 02 07:54:06 XXX fail2ban-client[10551]: Shutdown successful
8月 02 07:54:06 XXX systemd[1]: Stopped Fail2Ban Service.
we684123 iT邦研究生 5 級 ‧ 2019-08-07 13:38:42 檢舉
恩...
然後很尷尬的是... 他突然好了
今天中午看 "fail2ban-client status nginx-php-out" 時突然發現有在正常運作

他就... 突然... 好了........
https://imgur.com/vDuIP4c

感謝您的回應,真的很抱歉浪費您的時間
我真的不知道發生什麼事。・゚・(つд`゚)・゚・
ayu iT邦好手 2 級 ‧ 2019-08-08 02:17:39 檢舉
已經很難得看到這樣的發問/討論了, 真好!!
不建議用<HOST>開頭
0.11.x 有讓bantime倍增的功能, 值得試試!
bantime.multipliers = 1 4 16 32 64 128
bantime.increment = true
froce iT邦大師 1 級 ‧ 2019-08-08 18:44:20 檢舉
有看到討論說如果系統是用systemd的話,要把你的backend那行取消註解。
所以我才問你到底service有沒有起來,不過解決了就好。
可以再去看看他的log,到底是發生什麼事。可以用journalctl 去看狀況。
we684123 iT邦研究生 5 級 ‧ 2019-08-09 15:12:16 檢舉
@ayu
ㄜ... 能否請問不建議 <HOST> 開頭的原因是什麼呢?
另外因為我用<HOST>開頭是因為nginx預設的log格式就是ip位置開頭
所以只能這樣(雖然要改log格式也是可以啦)。

然後我是 0.11 一直安裝不成功才改用 0.10.4 的 qwq
當初好像他 github 的 Release 也沒有說 0.11 通過測試
等之後他 0.11 Release 後我才來試試,謝謝推薦(*´∀`)~♥
we684123 iT邦研究生 5 級 ‧ 2019-08-09 15:23:42 檢舉
@froce
有看到您說的那則[討論](https://bbs.archlinux.org/viewtopic.php?id=190394)

另外也有看到 [fail2ban官方手冊](http://www.fail2ban.org/wiki/index.php/MANUAL_0_8)(雖然是0.8版...)中,Server那一段

**fail2ban-server should not be used directly except in case of debugging.**

所以在我認知中 fail2ban-server 好像除非你要開發 fail2ban,否則一般只是要ban ip 的人應該是不會用到的這樣(?

journalctl - 知道了新指令! 乾恩m(_ _)m
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答