o filtro de regex fail2ban não funciona com arquivos de log nginx

3

Eu tenho batido minha cabeça o dia todo tentando combinar meu filtro regex com o meu access.log sem sorte. Eu instalei o fail2ban em um servidor gentoo e ele está rodando bem (eu manualmente bani meu próprio IP e ele funciona) mas o regex fail2ban falha e retorna 0 resultados com filtros até mesmo meu site tem ataque pesado agora e nos últimos dias.

by the way i dont use iptables software on my server (do i need to install one in order for fail2ban to work?) i guess fail2ban cant read my logformat or my time format, i tried to tweak everything but no luck, any help is very very appreciated

Aqui está minha 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

e aqui estão meus filtros:

[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 =
~

No lado nginx, esta é a minha sintaxe de formato de log e saída:

formato de log

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

saída do log de acesso:

[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/)" "-"

formato de log de erros:

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"

ATUALIZAÇÃO: Meu site não usa wordpress, mas eu estou recebendo milhões de wordpress relacionados link link wp-login.php que eu quero bloquear, há muitos bots de busca maliciosos agressivos, bots de anúncios, spider também que quebra meu servidor, eu quero bloquear

    
por Iain 01.10.2015 / 04:00

1 resposta

1

Então parece que você não está muito familiarizado com expressões regulares, você tem uma curva de aprendizado íngreme. O utilitário fail2ban usa expressões regulares do python , vale a pena ler essa página um pouco.

Parte do problema que você está tendo é essa parte do seu failregex

^<HOST>

Isso diz que procure o <HOST> regex pré-definido no início da linha (ou imediatamente depois de uma nova linha), é para isso que o ^ é para.

Examinando seus exemplos de log, todos eles começam com uma data / hora, isso é removido pelo fail2ban antes que o regex seja aplicado ao restante da linha. A linha não começa com nada que '^' reconheça e é por isso que o seu regex está falhando.

Um exemplo simples usando sua entrada errorlog. Se você quiser tomar medidas para scriptunknown erros (que pode ou não ser uma coisa boa) você pode usar um failregex como

failregex= scriptunknown", clinet: <HOST>

Você pode testar isso executando o arquivo de log usando 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/)" "-"

Ok, para que você possa fazer o que quiser, mas pode ser muito amplo, é necessário analisar os resultados e fazer essas ligações.

by the way i dont use iptables software on my server (do i need to install one in order for fail2ban to work?)

Você precisa de algum tipo de firewall compatível com o fail2ban instalado e funcionando em seu sistema. Como você testou e

i manually baned my own IP and it works

Então eu acho que há algo lá fazendo o trabalho.

    
por 01.10.2015 / 12:04