Создать правило Fail2ban для Named

Создать правило Fail2ban для Named

Поскольку я пытаюсь создать правило для Fail2ban, которое, как мне кажется, отсутствовало уже долгое время, поскольку в прошлом я был очень напуган, я также готов представить его миру :-)

Что было сделано?

  1. Уже создан файл в fail2ban/filter/named-antispam.conf

  2. Создал его с содержанием
    #cat filter.d/named-antispam.conf
    [Definition]
    prefregex = ([a-zA-Z][a-zA-Z][a-zA-Z])\s([0-9]|[0-9][0-9])\s([0-9][0-9]):([0-9][0-9]:[0-9][0-9])
    failregex = ^rate limit drop all response to <HOST>$

и jail.conf

#Disabled for Writing this Articel
[named-antispam]
enabled = false
filter = named-antispam
logpath  = /var/log/named/rate.log
bantime      = 2628000
maxretry     = 30
findtime     = 60
  1. проверил, что произойдет с fail2ban, если я включу его и установлю для него режим отладки?

2021-01-26 11:25:19,461 fail2ban.filterpyinotify[14180]: DEBUG   Event queue size: 16
2021-01-26 11:25:19,462 fail2ban.filterpyinotify[14180]: DEBUG   <_RawEvent cookie=0 mask=0x2 name='' wd=2 >

Если я отключу правило, я смогу установить отладку без этой ошибки - так что мне кажется, что у меня какая-то ошибка, которую я не могу понять, и поэтому я спрашиваю здесь. И в конце - да, у меня много записей в моем журнале, но fail2ban не обращает на это внимания

решение1

Вы не указали, в чем по сути проблема, более того, ни фрагмента журнала с сообщениями, которые вы хотите отловить в фильтре, ни попытки fail2ban-regex -vнайти то, что фильтрует.

Я полагаю, сообщение выглядит так:

Jan 26 14:00:10 srv named[26403]: client 192.0.2.100#21324 (example.com): rate limit drop all response to 192.0.2.0/24

Далее следует отметить две вещи: во-первых, IP-адрес следует за клиентом (здесь 192.0.2.100), а в конце указывается подсеть (нотация IP/CIDR, здесь 192.0.2.0/24).

Если вы хотите забанить подсеть (если ваш fail2ban и выбранный banaction вообще способны банить подсети), вы можете использовать в зависимости от вашей версии:

либо это (если ваш fail2ban поддерживает <SUBNET>):

failregex = ^\s*\S+\s+named(?:\[\d+\])?: [^:]+: rate limit drop all response to <SUBNET>

или это:

failregex = ^\s*\S+\s+named(?:\[\d+\])?: [^:]+: rate limit drop all response to (?:<F-IP4>\d+\.\S+</F-IP4>|<F-IP6>\w+\:\S+</F-IP6>)

Вы также можете запретить IP вместо подсети, а затем использовать один из следующих вариантов:

failregex = ^\s*\S+\s+named(?:\[\d+\])?: client <ADDR>[^:]*: rate limit drop all response

Вы также можете проверить это fail2ban-regex, например:

msg='Jan 26 14:00:10 srv named[26403]: client 192.0.2.100#21324 (example.com): rate limit drop all response to 192.0.2.0/24'
fail2ban-regex "$msg" '^\s*\S+\s+named(?:\[\d+\])?: [^:]+: rate limit drop all response to <SUBNET>'
...
Lines: 1 lines, 0 ignored, 1 matched, 0 missed

или для проверки фильтра с помощью лог-файла используйте это:

fail2ban-regex /var/log/named/rate.log named-antispam

Что касается вашего prefregexand failregex- они просто неверны. Ни prefregex, ни failregex не должны содержать часть с временной меткой datepattern(читайте how-to в нашемвикиилируководство, это содержит: ПРИМЕЧАНИЕ: failregexбудет применено к оставшейся части сообщения после prefregexобработки (если указано), которая в свою очередь происходит после datepatternобработки (при которой строка временной метки, соответствующая наилучшему шаблону, вырезается из сообщения).

Также prefregexимеет смысл, если вам нужна предварительная фильтрация, например, у вас есть более одного failregex (и такие регулярные выражения будут применяться либо ко всей части строки, либо к части совпавшего RE, заключенного между <F-CONTENT>и </F-CONTENT>, если это указано). Если предварительная фильтрация не предполагается, prefregexто смысла мало.

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

prefregex = ^\s*\S+\s+named(?:\[\d+\])?: <F-CONTENT>.+</F-CONTENT>$ 

failregex = ^[^:]+: rate limit drop all response to <SUBNET>
#failregex = ^[^:]+: rate limit drop all response to (?:<F-IP4>\d+\.\S+</F-IP4>|<F-IP6>\w+\:\S+</F-IP6>)
#failregex = ^client <ADDR>[^:]*: rate limit drop all response

Связанный контент