fail2ban 正規表現フィルターは nginx ログ ファイルでは機能しません

fail2ban 正規表現フィルターは nginx ログ ファイルでは機能しません

正規表現フィルターを access.log に一致させようと一日中頭を悩ませていますが、うまくいきません。Gentoo サーバーに fail2ban をインストールし、問題なく動作しています (自分の IP を手動で禁止し、動作しています)。しかし、現在および過去数日間、サイトが大量の攻撃を受けているにもかかわらず、fail2ban 正規表現は失敗し、フィルターで 0 件の結果が返されます。

ちなみに、私はサーバー上で iptables ソフトウェアを使用していません (fail2ban を動作させるためにインストールする必要がありますか?) fail2ban は私のログ形式や時間形式を読み取れないようです。すべてを調整しようとしましたがうまくいきませんでした。どんな助けでも大歓迎です。

ここが私の jail.local です

[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 正規表現、そのページを少し読んでみる価値はあります。

あなたが抱えている問題の一部は、failregexのこの部分です

^<HOST>

<HOST>これは、行の先頭 (または改行の直後) にある定義済みの正規表現を検索することを意味します^。これが の目的です。

ログの例を見ると、すべて日付/時刻で始まっていますが、これは正規表現が行の残りの部分に適用される前に fail2ban によって削除されます。行は '^' が認識するもので始まっていないため、正規表現が失敗します。

エラーログエントリを使用した簡単な例。エラーに対してアクションを実行したい場合scriptunknown(それが良いことかどうかはわかりませんが)、次のようなfailregexを使用できます。

failregex= scriptunknown", clinet: <HOST>

これをログファイルで実行することでテストできます。失敗2禁止正規表現(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を手動で禁止しましたが、うまくいきました

すると、そこには仕事をしている何かがあるのだと思います。

関連情報