![fail2ban detecta o IP do invasor, mas não o bane e lê logs lentamente](https://rvso.com/image/770115/fail2ban%20detecta%20o%20IP%20do%20invasor%2C%20mas%20n%C3%A3o%20o%20bane%20e%20l%C3%AA%20logs%20lentamente.png)
Há alguns dias estou recebendo ataques de alguns endereços IP ao meu nginx. Decidi usar o fail2ban para bani-lo automaticamente, mas percebi que não está funcionando muito bem. Posso ver nos logs que está detectando os endereços IP, mas não está banindo conforme o esperado.
Meu arquivo de prisão é:
[nginx-40x-req]
enabled = true
bantime.rndtime = 2800
bantime.increment = true
port = http,https
filter = nginx-40x-req
logpath = /var/log/nginx/access.log
maxretry = 5
e meu filtro ficou assim:
[Definition]
failregex = ^{"status": (400|401|403), "request_time": [0-9\.]+,\s+"remote_addr": "<HOST>",
No meu nginx adicionei um mapa para detectar suas solicitações e retornar 403 quando detectado. Os logs ficam assim:
{"status": 403, "request_time": 0.000, "remote_addr": "xx.xx.xx.xx", "@timestamp": "2021-09-03T18:32:34+02:00", "type": "nginx", "hostname": "vps-e642f340", "host": "d.itsyjd.com", "uri": "/v2/speed_test", "request": "GET https://d.itsyjd.com/v2/speed_test HTTP/1.1", "request_method": "GET", "request_proto": "http", "request_proto_proxy": "-", "request_uri": "/v2/speed_test", "request_args": "-", "server_proto": "HTTP/1.1", "body_bytes_sent": 552, "http_referer": "-", "http_user_agent": "Mozilla/5.0 (Linux; Android 8.0; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044304 Mobile Safari/537.36 (compatible; Baiduspider/2.0;+http://www.baidu.com/search/spider.html)", "msec": 1630686754.923, "upstream_connect_time": -, "upstream_header_time": -, "upstream_response": -, "pipe": "p", "gzip_ratio": "-", "brotli_ratio": "-", "remote_user": "-", "bad_request": "1"}
No meu fail2ban posso ver muitas mensagens dizendo que o endereço IP foi detectado:
2021-09-03 18:34:31,494 fail2ban.filter [32586]: INFO [nginx-40x-req] Found xx.xx.xx.xx - 2021-09-03 18:29:33
Mas ainda não há proibição desses endereços IP.
Uma coisa que notei é que a velocidade de leitura do fail2ban é mais lenta que a velocidade do log, então comecei a pensar que talvez esse seja o problema, porque quando esses IP são banidos e o fail2ban lê em tempo real, então outros endereços IP são banidos sem problema . Max_retry é 5 e todos os endereços IP foram detectados mais de 5 vezes, portanto devem ser banidos.
Alguém sabe o que posso estar fazendo de errado (porque com certeza é algo que não estou vendo).
Atenciosamente.
EDIT: Depois de escrever esta mensagem vi que está banindo, mas está funcionando muito devagar. Em cerca de 15 minutos baniu cerca de 4 endereços IP de cerca de 11, quando a cada segundo eles estão sendo detectados muitas vezes.
EDIT2: Limpar o log com um simples echo "" > <logfile>
acionou os banimentos.
Minha versão do fail2ban é 0.10.2
Com o invasor problemático banido e recebendo apenas algumas solicitações, o fail2ban está lendo em tempo real e banindo:
2021-09-03 18:46:13,759 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:46:13
2021-09-03 18:46:13,909 fail2ban.actions [32586]: NOTICE [nginx-40x-req] Ban XX.XX.XX.XX
2021-09-03 18:46:18,855 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:46:18
2021-09-03 18:47:07,004 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:47:06
2021-09-03 18:48:34,390 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:34
2021-09-03 18:48:54,230 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,231 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,231 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,335 fail2ban.actions [32586]: NOTICE [nginx-40x-req] Ban XX.XX.XX.XX
2021-09-03 18:50:08,488 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:50:08
Então ainda estou pensando que o problema talvez seja a velocidade de leitura.
EDITAR3:
Finalmente atualizei a versão fail2ban para 0.11.2, adicionei um padrão de data e mudei o detector de endereço. Agora parece ler o arquivo nginx muito mais rápido.
[Definition]
failregex = ^{"status": (400|401|403), "request_time": [0-9\.]+,\s+"remote_addr": "<ADDR>",
datepattern = "@timestamp": "%%Y-%%m-%%dT%%H:%%M:%%S%%z"
Responder1
- Não é aconselhável monitorar o log de acesso, consultefail2ban/wiki :: Melhores práticasespecialmente a parte "Reduzir o tráfego de log parasitário".
- Regexs inapropriados também podem fazer com que fail2bans "a velocidade de leitura possa ser mais lenta que a velocidade do log", só que não vejo que seu RE não seja bom. Mas isso pode ser feito mais rápido, bastando alterar o formato de registro para isso. A especificação de algo único e preciso também
datepattern
pode ajudar a acelerar o processamento. - Em suma, ele poderia criar a condição de corrida conhecida, fail2ban foi afetado até v.0.10.5, consultehttps://github.com/fail2ban/fail2ban/issues/2660para obter detalhes (a correção foi lançada na v.0.10.6/v.0.11.2)
Observe também as respostas para questões semelhantes, por exemplohttps://github.com/fail2ban/fail2ban/issues/3021#issuecomment-834287295.