Вопрос или проблема
Я не уверен, правильный ли это регулярное выражение, но я пытаюсь добавить несколько строк в ignoreregex
Вот строки конфигурации в моем ddos.conf:
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*
ignoreregex =.*(robots.txt|favicon.ico|jpg|png)
^<HOST> -.*"(GET|POST).*(Googlebot|bingbot)
Если код правильный, что мне добавить для множества строк
Вы можете добавить несколько регулярных выражений к failregex
и ignoreregex
(точно так же, как вы это сделали с ignoreregex
), просто:
ignoreregex
на самом деле не ожидает тега<HOST>
, поэтому замените его на\S+
или что-то подобное;- ваши регулярные выражения уязвимы – не используйте захватывающие выражения (
.*
,.+
и т.д.), поэтому всегда старайтесь писать регулярные выражения как можно точнее и закреплять их. Например, из-за первогоignoreregex
злоумышленник может добавить?robots.txt
к запросу, чтобы игнорировать находки. - таким же образом фейковый googlebot может продолжать свою атаку – недостаточно проверять только агента.
Написание многострочного регулярного выражения для fail2ban
Смотрите мой ответ на аналогичный вопрос на github.com / fail2ban #2971, comment-798429044.
Также обратите внимание на мой ответ на stackoverflow / 64857401 #65375323.
Ответ или решение
Для написания многострочного регулярного выражения (regex) для Fail2Ban, важно учитывать специфику работы с логами, чтобы наиболее точно идентифицировать нежелательные запросы для блокировки. Давайте рассмотрим ваш запрос о добавлении нескольких строк к ignoreregex
в конфигурационном файле ddos.conf
.
1. Понимание структуры failregex
и ignoreregex
a. failregex
Ваша строчка:
failregex = ^<HOST> -.*"(GET|POST).*
Эта конструкция предполагает, что Fail2Ban будет искать строки в логах, начинающиеся с IP-адреса (<HOST>
), за которым следует определенный шаблон (GET или POST).
b. ignoreregex
Конструкция:
ignoreregex =.*(robots.txt|favicon.ico|jpg|png)
здесь вы пытаетесь игнорировать запросы к определённым ресурсам, таким как robots.txt
или favicon.ico
.
2. Модификация вашего конфигурационного файла
Ваше актуальное выражение ignoreregex
можно улучшить. Во-первых, <HOST>
не является необходимым в этой секции, так как это выражение игнорирует хосты. Вместо этого можно использовать \S+
для захвата любого значащего символа.
Пример исправленной конфигурации:
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*
ignoreregex = \S+ -.*"(GET|POST).*(robots.txt|favicon.ico|jpg|png)
|^<HOST> -.*"(GET|POST).*(Googlebot|bingbot)
Объяснение:
\S+
заменяет<HOST>
, чтобы обнаруживать все IP-адреса.- Используется оператор
|
для объединения условий игнорирования в одну строку. Это позволяет легко добавлять дополнительные правила прямо в одной секции без большого количества повторяющихся строк.
3. Усовершенствование регулярных выражений
Следует обратить внимание на уязвимости:
- Использование выражений
.*
может приводить к ненадежному срабатыванию. Лучше использовать более специфичные конструкции. - Проверка только на User-Agent (например, Googlebot) недостаточна; хакеры могут легко вводить поддельные User-Agent строки.
Пример более строгого ignoreregex
:
ignoreregex = \S+ -.*"(GET|POST).*(robots\.txt|favicon\.ico|\.jpg|\.png|\.jpeg)$
|^(\S+) -.*"(GET|POST).*(Googlebot|bingbot).*
4. Проверка и тестирование
После внесения изменений важно протестировать ваши регулярные выражения с помощью утилит, таких как fail2ban-regex
. Это поможет убедиться, что они правильно захватывают данные, которые нужно игнорировать, и не блокируют легитимные запросы.
Пример использования:
fail2ban-regex /path/to/access.log /etc/fail2ban/filter.d/ddos.conf
Заключение
Создание эффективного fail2ban
фильтра требует тщательного выбора регулярных выражений, чтобы избежать ложных срабатываний. Используя указанные выше рекомендации, вы сможете улучшить свои конфигурации и повысить безопасность своей системы, минимизируя ненужные блокировки.
Эта информация может быть полезной как для администраторов, так и для корневых пользователей, стремящихся защитить свои серверы и приложения от DDoS-атак.