Estoy intentando bloquear solicitudes de scripts no disponibles para nginx con fail2ban.
# Noscript filter /etc/fail2ban/filter.d/nginx-noscript.conf:
#
# Block IPs trying to execute scripts such as .php, .pl, .exe and other funny scripts.
#
# Matches e.g.
# 192.168.1.1 - - "GET /something.cgi
#
[Definition]
failregex = ^<HOST> -.*GET.*(\.asp|\.exe|\.pl|\.cgi|\scgi)
ignoreregex =
Pero esto también crea un acierto si la referencia en el registro de acceso contiene la etiqueta script. Por ejemplo, esta línea: (He ofuscado la IP y el referente, y los trunqué en varias líneas; en el registro real, estas 4 líneas están en una sola línea).
1.2.3.4 - - [16/Dec/2013:18:01:10 +0100] "GET / HTTP/1.1"
301 178 "http://referrer.com/default.aspx"
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.41 Safari/537.36"
¿Cómo puedo cambiar la expresión regular para encontrar solo .asp
etc en la GET /xxxxx HTTP
sección?
Respuesta1
Bueno, hay cosas muy interesantes en las expresiones regulares, que las expresiones regulares son codiciosas.
Incluso si obtienen el partido al comienzo de la oración, seguirán buscando e irán por el último partido disponible en la oración. En su caso, coincide con este "referrer.com/default.aspx", porque tiene una expresión regular que coincide con .asp y también coincidirá con cualquier cosa con .asp*.
Por lo tanto, debes ser muy específico al trabajar con expresiones regulares.
Para esto, deberías probar esto:
failregex = ^<HOST> -.*GET.*(\.asp|\.exe|\.pl|\.cgi|\scgi)\"\s\d*
Algo como esto debería funcionar muy bien. Si en algún caso no funciona, ahora sabes cuál es el problema y estoy seguro de que puedes solucionarlo investigando un poco en expresiones regulares.
Espero que esto haya ayudado.