Специальный jail для postgresql (fail2ban)

Вопрос или проблема

Я пытаюсь написать специальный jail для PostgreSQL.
Моя строка журнала выглядит следующим образом:

2025-01-24 14:43:17.769 CET [112253] postgres@postgres FATAL:  no pg_hba.conf entry for host "x.x.x.x", user "postgres", database "postgres", SSL off

Мой файл фильтра fail2ban:

[Definition]

failregex = ^\s*\S+\s+\S+\s+\S+\s+\[\d+\]\s+\S+@\S+\s+FATAL:\s+no pg_hba\.conf entry for host "<ADDR>", user '<F-USER>.*</F-USER>', database '.*', SSL off.*$

После тестирования этой командой:

echo '2025-01-24 14:43:17.769 CET [112253] postgres@postgres FATAL:  no pg_hba.conf entry for host "x.x.x.x", user "postgres", database "postgres", SSL off' | fail2ban-regex - /etc/fail2ban/filter.d/postgresql.conf

Вывод:

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

Use   failregex filter file : postgresql, basedir: /etc/fail2ban
Use      single line : -

Results
=======

Failregex: 0 total

Ignoreregex: 0 total

Date template hits:

Lines: 1 lines, 0 ignored, 0 matched, 1 missed
[processed in 0.01 sec]

|- Missed line(s):
|  -
`-

Что не так с регулярным выражением?

В то время как многие утилиты командной строки читают из стандартного ввода при указании имени файла -, это должно быть запрограммировано в них, так что, к сожалению, не все так делают, и fail2ban-regex — одна из тех, которые не делают. Вы можете увидеть, что он указывает, что строка, с которой он сравнил ваше регулярное выражение, — это -. То есть, буквально строка из одного символа, единственный символ которой — это -.

Вместо перенаправления в fail2ban-regex вам нужно передать строку как аргумент:

fail2ban-regex \
     '2025-01-24 14:43:17.769 CET [112253] postgres@postgres FATAL:  no pg_hba.conf entry for host "x.x.x.x", user "postgres", database "postgres", SSL off' \
     /etc/fail2ban/filter.d/postgresql.conf

Если ваша строка действительно не идет из команды echo, а из другой команды:

fail2ban-regex \
     "$(thecommand with args)" \
     /etc/fail2ban/filter.d/postgresql.conf

Ответ или решение

Создание кастомной тюрьмы в Fail2Ban для PostgreSQL – задача, которая требует внимательного подхода и точного понимания работы с регулярными выражениями. Ваша цель — защитить базу данных от несанкционированного доступа, и для этого необходимо правильно настроить фильтр, который будет идентифицировать неудачные попытки подключения и блокировать IP-адреса, откуда такие попытки исходят.

Теория

Fail2Ban — это программа, предназначенная для защиты серверов от нежелательных воздействий путём блокирования IP-адресов, осуществляющих подозрительные или вредоносные действия. Она работает путем мониторинга серверных логов и применения предопределенных действий к IP, которые совпадают с критериями определёнными в конфигурационных файлах — тюрьмах (jails). Каждая тюрьма ссылается на фильтр, который использует регулярные выражения для проверки строк журнала.

В вашем случае, вы хотите создать тюрьму для PostgreSQL, используя конкретный формат строки лога:

2025-01-24 14:43:17.769 CET [112253] postgres@postgres FATAL:  no pg_hba.conf entry for host "x.x.x.x", user "postgres", database "postgres", SSL off

Ваша попытка определить регулярное выражение для фильтра не удалась. Разберёмся, почему.

Пример

Регулярное выражение, которое вы пытались использовать:

^\s*\S+\s+\S+\s+\S+\s+\[\d+\]\s+\S+@\S+\s+FATAL:\s+no pg_hba\.conf entry for host "<ADDR>", user '<F-USER>.*</F-USER>', database '.*', SSL off.*$

Это выражение должно соответствовать определённым частям строки лога. Однако, проблема может заключаться в следующих аспектах:

  1. Специальные маркеры: Вы используете <ADDR> и <F-USER>, которые не будут обрабатываться как стандартные регулярные выражения. Если ваша цель заключается в том, чтобы использовать переменные Fail2Ban, замените <ADDR> на (?P<host>\S+) и <F-USER> на (?P<user>\S+).

  2. Кавычки и экранирование: Регулярные выражения должны быть правильно экранированы. Проверьте, учитываются ли кавычки в выражении и правильное ли их количество.

  3. Проверка вывода в командной строке: Как было упомянуто, fail2ban-regex не принимает стандартный ввод через -, следовательно команда echo не даст желаемого результата. Вместо этого передавайте строку напрямую или через переменные.

Применение

Изменим ваш фильтр для Fail2Ban с учётом вышеизложенного:

[Definition]

failregex = ^\s*\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\s+\S+\s+\[\d+\] \S+@\S+ FATAL:  no pg_hba\.conf entry for host\s+"(?P<host>\S+)", user\s+'(?P<user>\S+)', database\s+'.*', SSL off.*$

Для проверки вашего фильтра используйте корректные команды fail2ban-regex, передавая строку как аргумент:

fail2ban-regex '2025-01-24 14:43:17.769 CET [112253] postgres@postgres FATAL:  no pg_hba.conf entry for host "x.x.x.x", user "postgres", database "postgres", SSL off' /etc/fail2ban/filter.d/postgresql.conf

Если вы получаете строку из другой команды, используйте:

fail2ban-regex "$(your_command_here)" /etc/fail2ban/filter.d/postgresql.conf

Заключение

Создание кастомной тюрьмы в Fail2Ban требует глубокого понимания регулярных выражений и форматов логов, которые вы обрабатываете. Важно убедиться, что ваш фильтр максимально точно соответствует строкам журнала, которые вы хотите интерпретировать. Лишь хорошо настроенная системы сможет эффективно защитить вашу базу данных от несанкционированного доступа. Настройка Fail2Ban для PostgreSQL — это шаг вперёд в обеспечении безопасности ваших данных.

Оцените материал
Добавить комментарий

Капча загружается...