Estou tentando bloquear solicitações de script não disponíveis para nginx com 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 =
Mas isso também cria uma ocorrência se o referenciador no log de acesso contiver a tag de script. Por exemplo, esta linha: (ofusquei o IP e o referenciador e trunquei várias linhas; no log real, essas 4 linhas estão em uma linha.)
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"
Como posso alterar o regexp para encontrar apenas o .asp
etc na GET /xxxxx HTTP
seção?
Responder1
Bem, há coisas muito interessantes nas expressões regulares, que as expressões regulares são gananciosas.
Mesmo que consigam a correspondência no início da frase, continuarão procurando e irão para a última correspondência disponível na frase. No seu caso, corresponde a "referrer.com/default.aspx", porque você tem uma expressão regular para corresponder a .asp e também corresponderá a qualquer coisa com .asp *.
Portanto, você precisa ser muito específico ao trabalhar com expressões regulares.
Para isso, você deve tentar o seguinte:
failregex = ^<HOST> -.*GET.*(\.asp|\.exe|\.pl|\.cgi|\scgi)\"\s\d*
Algo assim deve funcionar muito bem. Se, de qualquer forma, não funcionar, agora você sabe qual é o problema e tenho certeza de que pode corrigi-lo pesquisando um pouco na expressão regular.
Espero que isso tenha ajudado.