Estoy jugando con fail2ban en kubernetes. Para eso, creé un pod que crea mensajes de registro falsos: 2021-08-04 18:33:13 Error de autenticación 15.15.15.15 Creé un filtro personalizado para probar si fail2ban está funcionando. Primero probé la utilidad fail2ban-regex con un archivo que contenía 10 líneas de estos mensajes de registro y obtuve este resultado:
Running tests
=============
Use failregex filter file : test, basedir: /etc/fail2ban
Use log file : /logs.txt
Use encoding : UTF-8
Results
=======
Failregex: 10 total
|- #) [# of hits] regular expression
| 1) [10] \sAuthentication failed\s<HOST>
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [10] ExYear(?P<_sep>[-/.])Month(?P=_sep)Day(?:T| ?)24hour:Minute:Second(?:[.,]Microseconds)?(?:\s*Zone offset)?
`-
Lines: 10 lines, 0 ignored, 10 matched, 0 missed
[processed in 0.12 sec]
pero cuando pruebo el mismo filtro en el archivo, que contiene los registros continuos, aparece este error:
Running tests
=============
Use failregex filter file : test, basedir: /etc/fail2ban
Use log file : /logs/kubernetes.logs
Use encoding : UTF-8
Traceback (most recent call last):
File "/usr/bin/fail2ban-regex", line 34, in <module>
exec_command_line()
File "/usr/lib/python3.8/site-packages/fail2ban/client/fail2banregex.py", line 836, in exec_command_line
if not fail2banRegex.start(args):
File "/usr/lib/python3.8/site-packages/fail2ban/client/fail2banregex.py", line 776, in start
self.process(test_lines)
File "/usr/lib/python3.8/site-packages/fail2ban/client/fail2banregex.py", line 584, in process
line_datetimestripped, ret, is_ignored = self.testRegex(line)
File "/usr/lib/python3.8/site-packages/fail2ban/client/fail2banregex.py", line 456, in testRegex
found = self._filter.processLine(line, date)
File "/usr/lib/python3.8/site-packages/fail2ban/server/filter.py", line 613, in processLine
timeMatch = self.dateDetector.matchTime(line)
File "/usr/lib/python3.8/site-packages/fail2ban/server/datedetector.py", line 368, in matchTime
(line[distance] == self.__lastPos[2] and not self.__lastPos[2].isalnum())
IndexError: string index out of range
Y cuando activo el filtro para fail2ban, no hay ninguna IP prohibida, así que creo que mi filtro no funciona, pero no puedo encontrar el error.
filtro.conf:
[Definition]
failregex = \sAuthentication failed\s<HOST>
Respuesta1
Este es un error conocido (ya solucionado en el medio), consultehttps://github.com/fail2ban/fail2ban/issues/3020
Pero la razón real es un patrón de fecha impreciso y una marca de tiempo incompleta (que coincide con el conjunto de patrón de fecha predeterminado) o alguna línea sin marca de tiempo. La solución sería una actualización o (mejor) un patrón de fecha lo más preciso posible y, en el mejor de los casos, anclado al inicio (o al final).