Ошибка разбора фильтра fail2ban

Я пытаюсь добавить дополнительное правило фильтра в фильтр exim fail2ban. Я хочу поймать неудачных попыток бота, которые пытаются отправить аутентификацию слишком рано.

Failregex моего фильтра exim.conf выглядит следующим образом (с последней строкой, которую я добавил):

failregex = ^%(pid)s %(host_info)ssender verify fail for <\S+>: (?:Unknown user|Unrouteable address|all relevant MX records point to non-existent hosts)\s*$
^%(pid)s \w+ authenticator failed for (\S+ )?\(\S+\) \[<HOST>\](:\d+)?( I=\[\S+\](:\d+)?)?: 535 Incorrect authentication data( \(set_id=.*\)|: \d+ Time\(s\))?\s*$
^%(pid)s %(host_info)sF=(<>|[^@]+@\S+) rejected RCPT [^@]+@\S+: (relay not permitted|Sender verify failed|Unknown user)\s*$
^%(pid)s SMTP protocol synchronization error \([^)]*\): rejected (connection from|"\S+") %(host_info)s(next )?input=".*"\s*$
^%(pid)s SMTP call from \S+ \[<HOST>\](:\d+)? (I=\[\S+\](:\d+)? )?dropped: too many nonmail commands \(last was "\S+"\)\s*$
^%(pid)s SMTP protocol error in "AUTH LOGIN" %(host_info)sAUTH command used when not advertised\s*$

Не работает. Когда я запускаю fail2ban-regex, чтобы проверить его, я получаю следующую ошибку:

Running tests
=============

Use   failregex filter file : exim, basedir: .
Traceback (most recent call last):
  File "/usr/bin/fail2ban-regex", line 549, in <module>
    fail2banRegex.readRegex(cmd_regex, 'fail') or sys.exit(-1)
  File "/usr/bin/fail2ban-regex", line 279, in readRegex
    if not reader.read():
  File "/usr/lib/python3/dist-packages/fail2ban/client/configreader.py", line 274, in read
    return ConfigReader.read(self, self._file)
  File "/usr/lib/python3/dist-packages/fail2ban/client/configreader.py", line 89, in read
    ret = self._cfg.read(name)
  File "/usr/lib/python3/dist-packages/fail2ban/client/configreader.py", line 185, in read
    config_files_read = SafeConfigParserWithIncludes.read(self, config_files)
  File "/usr/lib/python3/dist-packages/fail2ban/client/configparserinc.py", line 206, in read
    fileNamesFull += self._getIncludes(filenames)
  File "/usr/lib/python3/dist-packages/fail2ban/client/configparserinc.py", line 151, in _getIncludes
    fileNamesFull += self.__getIncludesUncached(filename, seen)
  File "/usr/lib/python3/dist-packages/fail2ban/client/configparserinc.py", line 168, in __getIncludesUncached
    parser, i = self._getSharedSCPWI(resource)
  File "/usr/lib/python3/dist-packages/fail2ban/client/configparserinc.py", line 130, in _getSharedSCPWI
    i = cfg.read(filename, get_includes=False)
  File "/usr/lib/python3/dist-packages/fail2ban/client/configparserinc.py", line 251, in read
    return SafeConfigParser.read(self, fileNamesFull, encoding='utf-8')
  File "/usr/lib/python3.5/configparser.py", line 696, in read
    self._read(fp, filename)
  File "/usr/lib/python3.5/configparser.py", line 1107, in _read
    raise e
configparser.ParsingError: Source contains parsing errors: './filter.d/exim.conf'
    [line 21]: '^%(pid)s SMTP protocol error in "AUTH LOGIN" %(host_info)sAUTH command used when not advertised\\s*$\n'

Я недостаточно хорошо знаю регулярные выражения, чтобы понять, на что они жалуются.

Это на Ubuntu 16.04 с версией fail2ban-regex 0.9.3

1 ответ

Оказывается, что многострочные регулярные выражения требуют вкладки перед каждой новой строкой, поэтому вышеупомянутый фильтр должен быть:

failregex = ^%(pid)s %(host_info)ssender verify fail for <\S+>: (?:Unknown user|Unrouteable address|all relevant MX records point to non-existent hosts)\s*$
    ^%(pid)s \w+ authenticator failed for (\S+ )?\(\S+\) \[<HOST>\](:\d+)?( I=\[\S+\](:\d+)?)?: 535 Incorrect authentication data( \(set_id=.*\)|: \d+ Time\(s\))?\s*$
    ^%(pid)s %(host_info)sF=(<>|[^@]+@\S+) rejected RCPT [^@]+@\S+: (relay not permitted|Sender verify failed|Unknown user)\s*$
    ^%(pid)s SMTP protocol synchronization error \([^)]*\): rejected (connection from|"\S+") %(host_info)s(next )?input=".*"\s*$
    ^%(pid)s SMTP call from \S+ \[<HOST>\](:\d+)? (I=\[\S+\](:\d+)? )?dropped: too many nonmail commands \(last was "\S+"\)\s*$
    ^%(pid)s SMTP protocol error in "AUTH LOGIN" %(host_info)sAUTH command used when not advertised\s*$
Другие вопросы по тегам