fail2ban 正規表示式過濾器不適用於 nginx 日誌文件

fail2ban 正規表示式過濾器不適用於 nginx 日誌文件

我一整天都在絞盡腦汁試圖將我的正規表示式過濾器與我的 access.log 相匹配,但沒有成功。我已經在gentoo伺服器上安裝了fail2ban並且它運行良好(我手動禁止了我自己的IP並且它可以工作)但是fail2ban正則表達式失敗並且使用過濾器返回0結果即使我的網站現在和過去幾天遭受重載攻擊。

順便說一句,我不在我的伺服器上使用iptables 軟體(我需要安裝一個才能讓fail2ban 工作嗎?)我猜fail2ban 無法讀取我的日誌格式或時間格式,我嘗試調整所有內容,但沒有運氣,任何幫助都是非常非常讚賞

這是我的本地監獄

[INCLUDES]
before = paths-common.conf
[DEFAULT]
action=%(action_mwl)s
ignoreip = 127.0.0.1/8 192.168.99.25
ignorecommand =
bantime  = 86400
findtime  = 300
backend = gamin

[wp-login]
enabled = true
filter = wp-login
banaction=iptables-allports
logpath = /var/log/nginx/localhost*access_log
bantime = 7200
maxretry = 1


[nginx-nohome]
enabled=true
port=http,https
filter=nginx-nohome
logpath=/var/log/nginx/localhost.error.log
bantime=86400
maxretry=2

[nginx-dos]
enabled = true
port    = http,8090,8080
filter  = nginx-dos
logpath = /var/log/nginx/localhost.access*log
findtime = 30
bantime  = 172800
maxretry = 140

[nginx-login]
enabled = true
filter = nginx-login
action = iptables-multiport[name=NoLoginFailures, port="http,https"]
logpath = /var/log/messages
bantime = 7200
maxretry = 6

[nginx-req-limit]
enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]
logpath = /var/log/nginx/localhost.access*log
findtime = 600
bantime = 7200
maxretry = 10

這是我的過濾器:

[Definition]i
failregex = limiting requests, excess:.* by zone.*client: <HOST>

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
~

[Definition]
failregex = ^<HOST> -.*GET */wp-login* HTTP/1\.."
ignoreregex =

#
[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\scgi)
ignoreregex =


[Definition]
failregex = ^<HOST> -.*GET .*/~.*
ignoreregex =
~

在 nginx 方面,這是我的日誌格式語法和輸出:

日誌格式

 log_format main
 '[$time_local] - $remote_addr '
 '"$request" $status $bytes_sent '
 '"$http_referer" "$http_user_agent" ';

訪問日誌輸出:

[01/Oct/2015:09:15:52 +0800] - 60.18.17.206, 113.21.15.23 "POST/httprl_async_function_callback?count=121 HTTP/1.1" 200 1351 "-" "Drupal (+http://drupal.org/)" "-"

錯誤日誌格式:

2015/09/22 00:04:06 [error] 7418#0: *287 FastCGI sent in stderr: "Primary    scriptunknown", client: 192.168.99.76, server: www.sams.com, request: "GET/city HTTP/1.0", host: "www.sams.com"

更新: 我的網站不使用WordPress,但我收到了數百萬個與WordPress 相關的連結wp-login.php,我想阻止它們,有許多攻擊性的惡意搜尋機器人、廣告機器人、蜘蛛也破壞了我的伺服器,我想阻止

答案1

所以看來您對正規表示式不太熟悉,您的學習曲線很陡峭。 fail2ban 實用程式使用python 正規表示式,值得稍微閱讀一下該頁面。

您遇到的部分問題是失敗正規表示式的這一部分

^<HOST>

<HOST>這表示在行的開頭(或緊接在換行符之後)找到預先定義的正規表示式,這就是它^的用途。

查看您的日誌範例,它們都以日期/時間開頭,在將正規表示式應用於該行的其餘部分之前,fail2ban 將其刪除。該行不以 '^' 可以識別的任何內容開頭,因此這就是您的正規表示式失敗的原因。

使用錯誤日誌條目的簡單範例。如果您想對scriptunknown錯誤採取行動(這可能是好事,也可能不是好事),您可以使用failregex,例如

failregex= scriptunknown", clinet: <HOST>

您可以透過使用日誌檔案運行它來測試它fail2ban-正規表示式(1)例如

fail2ban-regex /path/to/logfile 'scriptunknown", client: <HOST>'
Running tests
=============

Use   failregex line : scriptunknown", client: <HOST>
Use         log file : /path/to/logfile
Use         encoding : UTF-8


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] scriptunknown", client: <HOST>
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1] Day(?P<_sep>[-/])MON(?P=_sep)Year[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
|  [1] Year(?P<_sep>[-/.])Month(?P=_sep)Day 24hour:Minute:Second(?:,Microseconds)?
`-

Lines: 2 lines, 0 ignored, 1 matched, 1 missed [processed in 0.00 sec]    
|- Missed line(s):
|  [01/Oct/2015:09:15:52 +0800] - 60.18.17.206, 113.21.15.23  "POST/httprl_async_function_callback?count=121 HTTP/1.1" 200 1351 "-" "Drupal (+http://drupal.org/)" "-"

好吧,這可能會做你想要的,但它可能太廣泛,你必須查看結果並進行這些呼叫。

順便說一句,我不在我的伺服器上使用 iptables 軟體(我需要安裝一個才能讓fail2ban 工作嗎?)

您需要某種與系統上安裝並運行的fail2ban 相容的防火牆。當你測試它並且

我手動禁止了我自己的IP並且它有效

然後我想那裡有東西在做這個工作。

相關內容