Eu tentei criar umregra de prisão personalizada em fail2ban, mas nunca é aplicado.
Não encontrei essa documentação oficial, posso perder alguma coisa.
/etc/fail2ban/filter.d/expressjs.conf
[Definition]
failregex = .* from ip <HOST>
/etc/fail2ban/jail.conf
[express-js]
enabled = true
filter = expressjs
logpath = /var/log/expressjs/slowin-killer.log
maxretry = 5
bantime = 3600
findtime = 600
/var/log/expressjs/slowin-killer.log
[20-5-2017 20:49:57] Failed to authentificate user "[email protected]" from ip 127.0.0.1
[20-5-2017 20:57:19] Failed to authentificate user "[email protected]" from ip 127.0.0.1
[20-5-2017 20:59:20] Failed to authentificate user "[email protected]" from ip 127.0.0.1
[20-5-2017 21:12:47] Failed to authentificate user "[email protected]" from ip 127.0.0.1
[20-5-2017 21:16:9] Failed to authentificate user "[email protected]" from ip 127.0.0.1
Nenhuma mensagem de erro, mas a prisão parece estar ativa...
$ fail2ban-client status expressjs
Status for the jail: expressjs
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/expressjs/slowin-killer.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
E o mais estranho, regex está ok ...
fail2ban-regex /var/log/expressjs/slowin-killer.log /etc/fail2ban/filter.d/expressjs.conf
Running tests
=============
Use failregex filter file : expressjs, basedir: /etc/fail2ban
Use log file : /var/log/expressjs/slowin-killer.log
Use encoding : UTF-8
Results
=======
Failregex: 27 total
|- #) [# of hits] regular expression
| 1) [27] .* from ip <HOST>
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [34] Day(?P<_sep>[-/])Month(?P=_sep)(?:Year|Year2) 24hour:Minute:Second
| [1] (?:DAY )?MON Day Year 24hour:Minute:Second(?:\.Microseconds)?
`-
Lines: 162 lines, 0 ignored, 27 matched, 135 missed
[processed in 0.01 sec]
Missed line(s): too many to print. Use --print-all-missed to print all 135 lines
Responder1
Há algumas coisas que estão faltando e precisam ser corrigidas para que o filtro funcione:
- Dentro do seu
expressjs.conf
você configuroufindtime = 600
emaxretry = 5
Isso significa que em um espaço de 10 minutos (600s) você precisará ter 5 tentativas fracassadas (correspondência de regex) para gerar a regra automática de bloqueio/rejeição de iptables.jail.conf
página de manual:
findtime time interval (in seconds) before the current time where failures will count towards a ban. maxretry number of failures that have to occur in the last findtime seconds to ban then IP.
Dando uma olhada em seus logs, você tem mais de 10 minutos entre a primeira entrada de log e a última entrada de log (5 tentativas) no log colado aqui. Primeiro 20:49
último:21:16
Todos os seus logs vêm de
127.0.0.1
. Se você olharjail.conf
dentro do[DEFAULT]
bloco, encontrará aignoreip = 127.0.0.1/8
configuração padrão. A menos que você tenha mudado isso, é muito perigoso bloquear um endereço de host local, pois irá quebrar outros softwares que usam esse endereço para comunicação interna.Você
expressjs.conf
não tem adatepattern =
configuração definida, portanto, o fail2ban não consegue adivinhar qual parte do arquivo de log é a data. Obtenha alguns exemplos de/etc/fail2ban/filter.d
arquivos e você encontrará regex de data comodatepattern = ^L %%d/%%m/%%Y - %%H:%%M:%%S
oudatepattern = ^%%Y:%%m:%%d-%%H:%%M:%%S
. Outro problema aqui é que a sua "segunda" parte da data do log não tem o zero à direita em seg <10 (ex:21:16:9
no seu último log) e isso precisa ser corrigido.
Dê uma olhada noWiki oficial do Fail2banpara obter exemplos e melhorar seu filtro. Você tem muitas coisas para consertar.