web-dev-qa-db-ja.com

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

運が悪かったので、正規表現フィルターをaccess.logに一致させようと一日中頭を悩ませてきました。 gentooサーバーにfail2banをインストールし、正常に動作しています(手動で自分のIPを禁止しましたが、機能します)が、fail2ban正規表現が失敗し、現在および過去数日間にサイトに高負荷の攻撃があった場合でも、フィルターで0の結果が返されます。

ちなみに、サーバーでiptablesソフトウェアを使用していません(fail2banを機能させるにはiptablesソフトウェアをインストールする必要がありますか?)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"

PDATE:私のサイトはwordpressを使用していませんが、何百万ものwordpress関連リンクリンクwp-login.phpを取得していますブロックしたい、攻撃的な悪意のある検索ボット、広告ボット、スパイダーもたくさんあり、サーバーを壊します、ブロックしたい

3
user314215

したがって、正規表現にあまり詳しくないようです。学習曲線が急です。 fail2banユーティリティは python regexes を使用します。そのページを少し読む価値があります。

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

^<Host>

これは、行の先頭(または改行の直後)で事前定義された<Host>正規表現を探すことを意味します。つまり、^が対象です。

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

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

failregex= scriptunknown", clinet: <Host>

fail2ban-regex(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を機能させるためにiptablesソフトウェアをインストールする必要がありますか?)

システムにインストールされて動作しているfail2banと互換性のある何らかのファイアウォールが必要です。あなたがそれをテストし、

自分のIPを手動で禁止しましたが、機能します

それから私はそこに仕事をしている何かがあると思います。

1
user9517