Me he estado golpeando la cabeza todo el día tratando de hacer coincidir mi filtro de expresiones regulares con mi access.log sin suerte. Instalé fail2ban en un servidor gentoo y está funcionando bien (prohibí manualmente mi propia IP y funciona) pero la expresión regular de fail2ban falla y devuelve 0 resultados con filtros, incluso mi sitio tiene un ataque de carga pesada en este momento y en los últimos días.
por cierto, no uso el software iptables en mi servidor (¿necesito instalar uno para que fail2ban funcione?) Supongo que fail2ban no puede leer mi formato de registro o mi formato de hora, intenté modificar todo pero no tuve suerte, cualquier ayuda es muy muy apreciado
Aquí está mi cárcel.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
y aquí están mis 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 =
~
En el lado de nginx, esta es mi sintaxis y salida del formato de registro:
formato de registro
log_format main
'[$time_local] - $remote_addr '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" ';
salida del registro de acceso:
[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 registro de errores:
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"
ACTUALIZAR: Mi sitio no usa WordPress, pero recibo millones de enlaces relacionados con WordPress, wp-login.php, que quiero bloquear. Hay muchos robots de búsqueda maliciosos y agresivos, robots publicitarios y arañas que también dañan mi servidor. Quiero bloquearlos.
Respuesta1
Entonces parece que no estás muy familiarizado con las expresiones regulares, tienes una curva de aprendizaje pronunciada. La utilidad fail2ban utilizaexpresiones regulares de Python, vale la pena leer un poco esa página.
Parte del problema que tienes es esta parte de tu failregex
^<HOST>
Esto dice buscar la expresión regular predefinida <HOST>
al principio de la línea (o inmediatamente después de una nueva línea), para eso está ^
.
Al observar sus ejemplos de registro, todos comienzan con una fecha/hora, esto lo elimina fail2ban antes de que se aplique la expresión regular al resto de la línea. La línea no comienza con nada que '^' reconozca, por eso su expresión regular falla.
Un ejemplo sencillo que utiliza la entrada del registro de errores. Si desea tomar medidas en caso de scriptunknown
errores (que pueden ser algo bueno o no), puede usar una expresión de error como
failregex= scriptunknown", clinet: <HOST>
Puede probar esto ejecutándolo más allá de su archivo de registro usandofail2ban-expresión regular (1)p.ej
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, eso puede hacer lo que quieres, pero puede que sea demasiado amplio, tendrías que mirar los resultados y hacer esas llamadas.
Por cierto, no uso el software iptables en mi servidor (¿necesito instalar uno para que fail2ban funcione?)
Necesita algún tipo de firewall que sea compatible con fail2ban instalado y funcionando en su sistema. Como lo probaste y
Prohibí manualmente mi propia IP y funciona.
Entonces supongo que hay algo ahí que hace el trabajo.