Preciso implementar o fail2ban para proteger um servidor. Gostaria de verificar os logs e banir hosts que geram muitas mensagens 404.
O problema que tenho é que pode haver vários clientes por trás de um determinado IP NAT, e preciso distinguir entre eles. Cada cliente está solicitando um URL diferente no seguinte formato:
https://server.example.com/path/<uniqueid>/<mac_address>
Eu gostaria de executar o fail2ban para que ele considere o ID exclusivo no regex, em vez de apenas observar o número de erros 404 por IP.
Desenvolvi o seguinte regex que parece capturar os eventos necessários:
(?P<host>(\d{1,3}.){4})\ -\ -\ \[\d{1,2}\/\w+\/\d{4}[\:\d{2}]+\ \+\d{4}\] "GET \/path\/(?P<unique_id>.+)\/.+HTTP\/\d.\d" ".+" ".+" 404.+
Isso deve corresponder:
1.1.1.11 - - [29/Aug/2018:01:27:45 +0100] "GET /path/3B44444444483/ddddee37D4.cfg HTTP/1.1" "somestring" "otherstring" 404 - 2005 5 0.117
E isso deve corresponder, mas ser considerado uma instância diferente da acima:
1.1.1.11 - - [29/Aug/2018:01:27:45 +0100] "GET /path/3B46666444483/ddddee37D4.cfg HTTP/1.1" "somestring" "otherstring" 404 - 2005 5 0.117
Responder1
Usando esta configuração, seu servidor está consumindo mais CPU procurando respostas 404 nos logs do que qualquer benefício de segurança ou benefício de CPU de não servir resposta 404 para X IP.
Se você não gosta de ver essas respostas, não crie entradas de log para elas.