Администрирование FreeBSD, Linux, ... Защита от DDoS с помощью Fail2Ban Tue, April 16 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Защита от DDoS с помощью Fail2Ban Печать
Добавил(а) microsin   

Fail2Ban сканирует логи WEB-сервера (например /var/log/apache/error_log, или /var/log/pwdfail) и банит по IP-адресу запросы, которые содержат признаки попыток нанесения вреда - слишком много неудачных попыток ввода пароля, сканирование для применения эксплойтов, просто часто повторяющиеся пустые запросы с целью перегрузки сервера, и т. д. Fail2Ban может обрабатывать несколько лог-файлов сервисов, таких как sshd или веб-сервер Apache.

В основном Fail2Ban используется для обновления правил файервола (iptables) чтобы отбрасывать подозрительные обращения к сайту по IP-адресу, которые происходят слишком часто (обращений с одного и того же IP слишком много в единицу времени). Правила iptables для применения бана конфигурируются пользователем. Также можно произвольно сконфигурировать и другие необходимые действия (например отправка email с предупреждением об атаке). Изначально Fail2Ban поставляется с фильтрами для различных служб (apache, courier, ssh и т. п.).

Примечание: Fail2Ban может снизить частоту некорректных попыток аутентификации, однако не может полностью устранить риск использования слабого пароля и эксплуатации уязвимостей. Конфигурируйте свои службы с использованием надежного пароля доступа и/или с использованием двухфакторной аутентификации, если реально хотите защитить свою систему от взлома.

Текущий список возможностей Fail2Ban 0.9.x:

• Действия выполняются на основе Python (поддерживается Python3+).
• Поддержка базы данных.
• Многострочный парсинг в фильтрах.
• Поддержка в фильтрах пользовательского формата даты/времени.
• По умолчанию используется состояние timezone.
• Настраиваемый таймаут для команд бана.
• Обрабатывается формат кодировки в файлах лога.

Текущий список возможностей Fail2Ban 0.8.x:

• Архитектура клиент/сервер.
• Поддержка многопоточности.
• Гибко конфигурируется с помощью разделенных файлов настроек.
• Поддержка Gamin/Pyinotify.
• Парсинг файлов лога в поиске заданных шаблонов.
• Автоматическое распознавание формата даты/времени в файлах лога.
• Выполняет команду (команды), когда шаблон обнаружен для одного и того же IP-адреса более чем X раз в единицу времени (X можно настроить).
• Поддержка wildcard в опции logpath.
• После заданного времени выполняется другая команда для отмены бана по IP-адресу.
• По умолчанию для бана используется файервол Netfilter/Iptables, но можно также использовать TCP Wrapper (/etc/hosts.deny) и многие другие файерволы или действия.
• Поддерживает ротацию файлов лога.
• Может за один раз обработать несколько сервисов (sshd, apache, vsftpd, и т. д.).
• Распознает имя хоста DNS, преобразовывая его в IP-адреса (используйте это с осторожностью, при необходимости запретите опцией usedns = no).

[Установка Fail2Ban]

Нужен python версии ? 2.3. Опционально понадобится gamin ? 0.0.21.

Для установки выполните:

tar xvfj fail2ban-0.8.5.tar.bz2
cd fail2ban-0.8.5
python setup.py install

Это действие установит Fail2Ban в каталог /usr/share/fail2ban. Исполняемые скрипты помещаются в /usr/bin. Возможно, что Fail2Ban уже присутствует в Вашем дистрибутиве, тогда следует использовать его.

Для проверки, что Fail2Ban корректно установлен, выполните команду:

fail2ban-client -h

Всегда используйте команду fail2ban-client, и никогда напрямую не используйте fail2ban-server.

[Конфигурация Fail2Ban]

Fail2Ban конфигурируется правкой файлов в каталоге /etc/fail2ban. Сервер можно сконфигурировать командами fail2ban-client. Доступные команды описаны в man fail2ban-client, а также на сайте [1].

filter: фильтр определяет регулярное выражение, которое должно совпасть с шаблоном, соответствующим ошибке в логе, либо любому другому выражению.

action: действие, которое определяет несколько команд, выполняемых в различные моменты времени.

jail: комбинация одного filter и одного или нескольких action. Fail2Ban может обработать несколько jail одновременно.

client: обозначает скрипт fail2ban-client. Этот скрипт используется для управления сервером.

server: обозначает скрипт fail2ban-server. Этот скрипт реализует весь рабочий функционал Fail2Ban.

С помощью редактора текста можно открыть файл fail2ban.conf, где находятся опции общей конфигурации Fail2Ban:

# mcedit /etc/fail2ban/fail2ban.conf

В файле jail.local находятся опции конфигурации ловушек:

# mcedit /etc/fail2ban/jail.local

Server. Fail2ban состоит из двух частей: клиента и сервера. Сервер (fail2ban-server) многопоточный, он прослушивает сокеты Unix на предмет поступления команд. Сам сервер ничего не знает про файлы конфигурации. Таким образом при своем первоначальном старте сервер находится в состоянии по умолчанию, где не определено ни одного jail. Для сервера доступны следующие опции командной строки:

-b                   запуститься в фоне (background)
-f                   запуститься с выводом сообщений в консоль (foreground)
-s < FILE>           socket path
-x                   принудительное выполнение сервера
-h, --help           отображение этой подсказки
-V, --version        вывести номер версии

fail2ban-server не должен использоваться напрямую, кроме как для отладки. Опция -s < FILE> вероятно наиболее важная, и она используется для пути сокета (socket path). Таким образом, можно запустить несколько экземпляров Fail2ban на разных сокетах. Однако это не требуется, потому что Fail2ban может конкурентно запустить несколько jail.

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

Сервер обрабатывает сигналы SIGTERM и SIGINT. Когда поступит один из этих сигналов, fail2ban-server по-тихому завершает работу.

Client. Скрипт fail2ban-client это фронтенд Fail2ban. Он соединяется с файлом сокета сервера, и посылает ему команды для конфигурации и управления работой. Клиент может прочитать файлы конфигурации, или просто может использоваться для отправки одиночных команд серверу либо через командную строку, либо в интерактивном режиме (который активируется опцией -i). Скрипт fail2ban-client также может запустить сервер. Для fail2ban-client доступны следующие опции:

-c < DIR>               директория с конфигурационными файлами
-s < FILE>              socket path
-d                      дамп конфигурации. Используется для отладки
-i                      интерактивный режим
-v                      увеличить подробность вывода сообщений
-q                      уменьшить подробность вывода сообщений
-x                      принудительно запустить сервер
-h, --help              отображение этой подсказки
-V, --version           вывести номер версии

Как и для fail2ban-server, может использоваться опция -s < FILE> для установки socket path. Обратите внимание, что эта команда отменяет действие опции сокета в fail2ban.conf. Директория по умолчанию для конфигурации /etc/fail2ban, однако это можно переназначить опцией -c < DIR>. Опция -x просто перенаправляется к fail2ban-server при запуске сервера.

Существует полезная для отладки опция -d. Она выведет конфигурацию, которую прочитал fail2ban-client. Вывод этой команды соответствует потоку, отправленному серверу. Если вывод -d показывает:

['set', 'loglevel', 1]
['set', 'logtarget', 'STDERR']

.. того же можно достичь командами:

$ fail2ban-client set loglevel 1
$ fail2ban-client set logtarget STDERR

[Часто используемые команды]

Команда start. Все, что настроено в файлах конфигурации, можно сконфигурировать вручную. Конфигурация это просто легкий и эффективный способ настроить поведение сервера. Скрипт fail2ban-client только транслирует конфигурацию в набор команд для сервера. Однако у fail2ban-client есть две дополнительные команды для внутреннего использования. Первая из них это start. Когда выполняется команда:

$ fail2ban-client start

.. клиент сначала попытается запустить экземпляр сервера. Затем клиент ждет запуска сервера, отправляя ему ping-запросы. Когда сервер ответить на эти запросы, fail2ban-client делает парсинг конфигурации, и передает соответствующие команды серверу.

Команда reload. Вторая команда это reload. Когда выполняется команда:

$ fail2ban-client reload

.. клиент указывает серверу остановить все jail, снова парсит конфигурационные файлы и отправляет команды серверу. Это полезно, когда должна быть загружена новая конфигурация без выгрузки сервера. Также это полезно для отладки сервера. Можно в одном терминале запустить сервер с опцией вывода сообщений в консоль fail2ban-server -f, и в другом терминале ввести команду fail2ban-client reload для загрузки конфигурации в сервер. Таким образом, вывод сообщений клиента и сервера не будут перемешаны.

Все другие команды просто отправляются серверу без какой-либо специальной обработки. Однако чаще всего будут использоваться только 2 вышеупомянутые команды и иногда команда stop.

И возможно будет полезной еще одна команда: status [jail]. Если не указать имя jail, то будет возвращен глобальный статус сервера. Если имя jail соответствует настроенному jail, то отобразится статус этого jail.

[Базовые команды]

Команда Описание
start Запустит сервер и jail-ы.
reload Перезагрузит конфигурацию.
reload < JAIL> Перезагрузит JAIL.
stop Остановит все jail-ы и завершит работу сервера.
status Получит текущий статус сервера.
ping Проверка, жив ли сервер.
help Вывод подсказки по командам.

[Настройка вывода в лог]

Команда Описание
set loglevel < LEVEL> Установит уровень подробности лога в LEVEL. Это могут быть следующие уровни (по мере нарастания подробности сообщений): CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG.
get loglevel Возвратит текущий уровень лога.
set logtarget < TARGET> Установит цель лога в TARGET. Целью может быть STDOUT, STDERR, SYSLOG или файл.
get logtarget Возвратит цель лога.
flushlogs Если logtarget это файл, то сбросит его содержимое на диск и заново откроет его. Используется для ротации лога.

[База данных]

Команда Описание
set dbfile < FILE> Установит место постоянного хранилища данных (fail2ban persistent datastore). Для запрета установите в "None".
get dbfile Возвратит место fail2ban persistent datastore.
set dbpurgeage < SECONDS> Установит максимальный возраст в секундах SECONDS, в течение которого хранится история банов.
get dbpurgeage Возвратит максимальный возраст в секундах, в течение которого сохраняется история банов.

[Управление Jail-ами]

Команда Описание
add < JAIL> < BACKEND> Создаст JAIL, используя BACKEND.
start < JAIL> Запустит jail с именем JAIL.
stop < JAIL> Остановит jail с именем JAIL. Указанный JAIL удаляется.
status < JAIL> Возвратит текущий статус для указанного JAIL.

[Конфигурация JAIL]

Команда Описание
off < JAIL> Установит состояние ожидания для JAIL.
set < JAIL> addignoreip < IP> Добавит IP в список игнора JAIL.
set < JAIL> delignoreip < IP> Удалит IP из списка игнора JAIL.
set < JAIL> addlogpath < FILE> ['tail'] Добавит FILE в список мониторинга JAIL, опционально от места 'tail' в файле (по умолчанию 'head').
set < JAIL> dellogpath < FILE> Удалит < FILE> из списка мониторинга JAIL.
set < JAIL> logencoding < ENCODING> Установит кодировку ENCODING файлов лога для JAIL.
set < JAIL> addjournalmatch < MATCH> Добавит MATCH к фильтру журнала JAIL.
set < JAIL> deljournalmatch < MATCH> Удалит MATCH из фильтра журнала JAIL.
set < JAIL> addfailregex < REGEX> Добавит регулярное выражение REGEX, которое должно соответствовать событиям сбоя для JAIL.
set < JAIL> delfailregex < INDEX> Удалит регулярное выражение по индексу INDEX для failregex.
set < JAIL> ignorecommand < VALUE> Установит команду игнора для JAIL.
set < JAIL> addignoreregex < REGEX> Добавит регулярное выражение REGEX, которое должно совпасть с шаблоном исключения для JAIL.
set < JAIL> delignoreregex < INDEX> Удалит регулярное выражение REGEX, которое должно совпасть с шаблоном исключения для JAIL.
set < JAIL> findtime < TIME> Установит количество секунд, в течение которого фильтр будет просматривать совпадения для JAIL.
set < JAIL> bantime < TIME> Установит количество секунд TIME, в течение которого JAIL будет сохранять бан хоста.
set < JAIL> datepattern < PATTERN> Установит шаблон PATTERN, используемый для совпадения с датой/временем JAIL.
set < JAIL> usedns < VALUE> Установит режим использования DNS для JAIL.
set < JAIL> banip < IP> Снятие бана IP вручную для JAIL.
set < JAIL> maxretry < RETRY> Установит количество ошибок RETRY перед тем, как будет применен бан хоста для JAIL.
set < JAIL> maxlines < LINES> Установит количество строк LINES буфера поиска regex для JAIL.
set < JAIL> addaction < ACT>[ < PYTHONFILE> < JSONKWARGS>] Добавит новое действие с именем ACT для JAIL. Опционально для действий на основе Python могут быть указаны PYTHONFILE и JSONKWARGS, иначе будет использовано сконфигурированное действие команды (Command Action).
set < JAIL> delaction < ACT> Удалит действие ACT из JAIL.

[Конфигурация Command Action]

Команда Описание
set < JAIL> action < ACT> actionstart < CMD> Установит start команды CMD действия ACT для JAIL.
set < JAIL> action < ACT> actionstop < CMD> Установит stop команды CMD действия ACT для JAIL.
set < JAIL> action < ACT> actioncheck < CMD> Установит check команды CMD действия ACT для JAIL.
set < JAIL> action < ACT> actionban < CMD> Установит ban команды CMD действия ACT для JAIL.
set < JAIL> action < ACT> actionunban < CMD> Установит unban команды CMD действия ACT для JAIL.
set < JAIL> action < ACT> timeout < TIMEOUT> Установит таймаут TIMEOUT в секундах действия ACT для JAIL.

[Основная конфигурация Action]

Команда Описание
set < JAIL> action < ACT> < PROPERTY> < VALUE> Установит значение VALUE свойства PROPERTY действия ACT для JAIL.
set < JAIL> action < ACT> < METHOD>[ < JSONKWARGS>] Вызовет метод METHOD с JSONKWARGS действия ACT для JAIL.

[Информация JAIL]

Команда Описание
get < JAIL> logpath Возвратит список просматриваемых файлов лога для JAIL.
get < JAIL> logencoding Возвратит кодировку просматриваемых файлов лога для JAIL.
get < JAIL> journalmatch Возвратит журнал совпадений фильтра для JAIL.
get < JAIL> ignoreip Возвратит список игнорируемых IP-адресов для JAIL.
get < JAIL> ignorecommand Возвратит команду игнора для JAIL.
get < JAIL> failregex Возвратит список регулярных выражений, которые соответствуют ошибкам для JAIL.
get < JAIL> ignoreregex Возвратит список регулярных выражений, совпадающих с шаблонами игнора для JAIL.
get < JAIL> findtime Возвратит время, на котором фильтр просматривает наличие ошибок для JAIL.
get < JAIL> bantime Возвратит время, в течение которого хост находится в бане для JAIL.
get < JAIL> datepattern Возвратит шаблон, используемый в совпадении даты/времени для JAIL.
get < JAIL> usedns Возвратит значение опции использования DNS для JAIL.
get < JAIL> maxretry Возвратит количество ошибок, разрешенных для JAIL.
get < JAIL> maxlines Возвратит количество буферизированных строк для JAIL.
get < JAIL> actions Возвратит список действий для JAIL.

[Информация Command Action]

Команда Описание
get < JAIL> action < ACT> actionstart Возвратит команду start действия ACT для JAIL.
get < JAIL> action < ACT> actionstop Возвратит команду stop действия ACT для JAIL.
get < JAIL> action < ACT> actioncheck Возвратит команду check действия ACT для JAIL.
get < JAIL> action < ACT> actionban Возвратит команду ban действия ACT для JAIL.
get < JAIL> action < ACT> actionunban Возвратит команду unban действия ACT для JAIL.
get < JAIL> action < ACT> timeout Возвратит таймаут команды в секундах действия ACT для JAIL.

[Общая информация Action]

Команда Описание
get < JAIL> actionproperties < ACT> Возвратит список свойств действия ACT для JAIL.
get < JAIL> actionmethods < ACT> Возвратит список методов действия ACT для JAIL.
get < JAIL> action < ACT> < PROPERTY> Возвратит значение свойства PROPERTY действия ACT для JAIL.

[Конфигурация Fail2Ban]

Стандартный каталог конфигурации это папка /etc/fail2ban. Это может быть установлено опцией -c скрипта fail2ban-client. Типовая структура файлов конфигурации выглядит следующим образом:

/etc/fail2ban/
├── action.d
│   ├── dummy.conf
│   ├── hostsdeny.conf
│   ├── iptables.conf
│   ├── mail-whois.conf
│   ├── mail.conf
│   └── shorewall.conf
├── fail2ban.conf
├── fail2ban.local
├── filter.d
│   ├── apache-auth.conf
│   ├── apache-noscript.conf
│   ├── couriersmtp.conf
│   ├── postfix.conf
│   ├── proftpd.conf
│   ├── qmail.conf
│   ├── sasl.conf
│   ├── sshd.conf
│   └── vsftpd.conf
├── jail.conf
└── jail.local

Каждый файл с расширением .conf может быть переназначен файлом с расширением .local. Сначала считывается файл .conf, затем .local, и настройки последнего переопределяют настройки первого. Таким образом, файл .local не должен включать в себя ничего, что уже есть в соответствующем файле .conf, в файле .local должны быть только те настройки, которые Вы хотите поменять.

Таким образом, изменения конфигурации должны быть внесены в файл .local, но не в файл .conf. Это позволит избежать проблем при миграции, и упрощает настройку. Все файлы настроек подробно задокументированы.

Основные настройки. В файле fail2ban.conf содержатся главные настройки для демона fail2ban-server, такие как logging level и target. Также Вы можете указать socket path, используемый для обмена между клиентом и сервером.

Jail. Самый важный файл для настроек это jail.conf, где содержится конфигурация для ловушек jail. По умолчанию в этот файл вставлены некоторые секции в качестве шаблонов. Они пока запрещены, но Вы можете их разрешить, если они интересны, и адаптировать для своей собственной локальной конфигурации. Вот пример такой секции ssh-iptables:

[ssh-iptables]
#enabled  = false
enabled  = true
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
#          mail-whois[name=SSH, dest=yourmail@mail.com]
#logpath  = /var/log/sshd.log
logpath  = /var/log/auth.log
maxretry = 5

Вот что задано в этой секции:

1. Секция ssh-iptables запрещена, но её можно разрешить, если раскомментировать строку с enabled.
2. Обрабатывается фильтр sshd.conf в подкаталоге filter.d.
3. Действие (действия), описанное в файле iptables.conf (находится в подкаталоге action.d), будет выполняться, если обработка фильтра будет true. В этом примере дополнительное действие по отправке email оповещения mail-whois.conf закомментировано.
4. Задан лог-файл для сканирования фильтром: auth.log.

Фильтр (filter) и его действия (action) совместно образуют jail. На один jail допустим только один filter, но можно указать несколько действий (опция action), каждое в отдельной строке. Например, можно реагировать на попытки взлома логина SSH, сначала добавив нового правила для firewall, затем получением некоторой информации о хосте-нарушителе с использованием whois, и наконец отправкой оповещения по e-mail. Или возможно Вы захотите получать оповещение на учетную запись Jabber, когда кто-то попытается обратиться к страничке /donotaccess.html на web-сервере.

Fail2ban не ограничен защитой SSH. В нем содержатся фильтры и действия по умолчанию для многих демонов. Вы можете просто изменить их, или создать свои собственные фильтры и действия. Если Вы посмотрите на filter.d, то увидите несколько фильтров по умолчанию, которые не встречаются в стандартном jail.conf, который поставляется с исходным кодом. В этом примере мы возьмем sshd-ddos.conf. Для интеграции этого фильтра в fail2ban, отредактируйте свой jail.conf:

[ssh-ddos] 
enabled = true
port    = ssh,sftp
filter  = sshd-ddos
logpath  = /var/log/messages
maxretry = 2

Всегда помните о необходимости настройки $logpath на свой файл лога, как было упомянуто выше.

Опции jail. Каждый jail можно настроить следующими опциями:

Имя По умолчанию Описание
filter   Имя фильтра, используемого в детекте совпадений для jail. Каждое одиночное совпадение инкрементирует счетчик jail.
logpath /var/log/messages Путь до файла лога, предоставленного для фильтра.
maxretry 3 Количество совпадений (т. е. значение счетчика), которое приведет к срабатыванию бана по IP-адресу (ban action).
findtime 600 Счетчик сбросится в 0, если в течение этого времени (указывается в секундах) не будет совпадений фильтра.
bantime 600 Длительность (в секундах) в течение которой сохраняется бан по IP. Отрицательное значение означает постоянное блокирование (permanent ban).

Фильтры. Директория filter.d содержит главным образом регулярные выражения, которые используются для детекта попыток взлома, ошибок ввода пароля, слишком частых подключений к сайту (DDoS), и т. п. Ниже показан пример для filter.d/sshd.conf, где установлены 3 регулярных выражения для соответствия строкам в файле лога:

failregex = Authentication failure for .* from < HOST>
            Failed [-/\w]+ for .* from < HOST>
            ROOT LOGIN REFUSED .* FROM < HOST>
            [iI](?:llegal|nvalid) user .* from < HOST>

Этот пример показывает, что выражение regex по умолчанию было изменено, чтобы позволить отсутствие логина (имени пользователя) в строке лога, наподобие следующей:

Jan 10 07:02:37 homebrou sshd[18419]: Failed password for root from 222.76.213.151 port 55236 ssh2

Если Вы создаете свои собственные выражения failregex, то должны знать следующее:

• В failregex может быть несколько строк, любая из которых может совпадать со строкой файла лога.
• В каждой строке failregex та часть, которая соответствует имени хоста или IP-адресу, должна быть обернута в сэндвич (?P< host> ... ). Это специфичное для Python расширение regex, которое присваивает содержимое совпадения имени < host>. Тег < host> указывает fail2ban, какой хост был подключен, поэтому такой тег должен быть в каждой строке failregex. Если это не так, то fail2ban сообщит о проблеме через error message "No 'host' group".
• Для удобства можно использовать предопределенный элемент < HOST> в своих выражениях regex. < HOST> это алиас для (?:::f{4,6}:)?(?P< host>\S+), который будет соответствовать либо имени хоста, либо адресу IPv4 (который возможно встроен в адрес IPv6).
• В скриптах action тег < ip> будет заменен IP-адресом хоста, совпавшим с тегом < host>.
• Чтобы строка лога совпала с Вашим failregex, в нем должны совпасть 2 части: начало строки должно совпасть с шаблоном метки времени (timestamp pattern) или regex, и остальная часть строки должна совпасть с Вашим failregex. Если failregex снабжен лидирующим ^, то это относится к началу остальной части строки, после timestamp и разделяющего пробела.
• Шаблон или regex для совпадения с меткой времени в настоящий момент не документирован, и недоступен для чтения или установки пользователем (см. Debian bug #491253). Это создаст проблему, если в Вашем логе присутствует формат, не ожидаемый для fail2ban, из-за чего он не сможет определить совпадение ни для одной из строк лога. По этой причине следует проверить любой новый failregex на предмет совпадения с примером строки лога, как показано в примере ниже - чтобы убедиться, что совпадения имеют место. Если fail2ban не распознает timestamp Вашего файла лога, то у Вас 2 варианта решения проблемы: либо переконфигурировать демона, чтобы он выводил timestamp в более распространенном формате, как в примере лога ниже; либо выставить запрос bug-репорта, прикрепив в него формат Вашей метки времени.

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

fail2ban-regex 'Jul 18 12:13:01 [1.2.3.4] authentication failed'     'authentication failed'
fail2ban-regex 'Jul 18 12:13:01 [1.2.3.4] authentication failed'     '\[< HOST>\] authentication failed'
fail2ban-regex '18-07-2008 12:13:01 [1.2.3.4] authentication failed' '\[< HOST>\] authentication failed'
fail2ban-regex '18-7-2008 12:13:01 [1.2.3.4] authentication failed'  '\[< HOST>\] authentication failed'

Первая команда не сработает, с сообщением об ошибке "No 'host' group". Вторая команда сработает, и обнаружит адрес хоста 1.2.3.4. Третья команда сработает, и обнаружит адрес хоста 1.2.3.4 (верно как минимум для версии v0.8.4). Четвертая команда не сработает, и сообщит почему - "...no valid date/time found for...". Очевидно, что не получается обнаружить совпадение с необычным форматом метки времени, который не является частью Вашего failregex.

Действия (action). Директория action.d содержит различные скрипты, где определены действия. Эти действия выполняются в определенные моменты времени, когда работает Fail2ban: когда запускается/останавливается jail, происходит бан/снятие бана хоста, и т. п.

[Тестирование]

Следующие команды могут помочь проверить Ваши настройки конфигурации:

# fail2ban-client -d

Выведет дамп текущей конфигурации.

# fail2ban-regex "line" "failregex"

Проверит одно регулярное выражение failregex (такое, как показано в sshd.conf) на одну строку (line) Вашего файла лога. Не забудьте применить двойные кавычки вокруг строки лога и вокруг определения failregex.

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

# fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Также можно использовать комбинацию файла лога и одного failregex:

# fail2ban-regex /var/log/auth.log "Failed [-/\w]+ for .* from < HOST>"

Пример команды, показывающей все настроенные jail:

# fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:           limit-http-requests

Пример команды, показывающей состояние указанной jail:

# fail2ban-client status limit-http-requests
Status for the jail: limit-http-requests
|- filter
|  |- File list:        /var/log/nginx/error.log
|  |- Currently failed: 0
|  `- Total failed:     6
`- action
   |- Currently banned: 0
   |  `- IP list:
   `- Total banned:     0

Перезапуск jail (может понадобиться при изменении конфигурации):

# fail2ban-client reload limit-http-requests

[Ограничения]

Время реакции. Прежде всего нужно помнить, что Fail2ban это парсер лога. Он ничего не может сделать, пока что-то не будет записано в лог. Некоторые демоны syslog буферизируют свой вывод, это может повлиять на производительность Fail2ban. Таким образом, было бы неплохо запретить буферизацию для Вашего демона syslog.

Довольно сложно оценить время реакции. Fail2ban ждет 1 секунду перед проверкой новых логов для сканирования. В большинстве случаев этого достаточно. Однако может быть больше ошибочных попыток логина, чем указано опцией maxretry.

Вот фрагмент файла /var/log/auth.log:

Jan 15 15:28:46 homebrou sshd[29778]: Invalid user recruit from 81.74.87.66
Jan 15 15:28:46 homebrou sshd[29778]: error: Could not get shadow information for NOUSER
Jan 15 15:28:46 homebrou sshd[29778]: Failed password for invalid user recruit from 81.74.87.66 port 47672 ssh2
Jan 15 18:33:27 homebrou sshd[2156]: Did not receive identification string from 88.191.23.27
Jan 15 19:23:37 homebrou sshd[3418]: Invalid user test from 88.191.23.27
Jan 15 19:23:37 homebrou sshd[3418]: error: Could not get shadow information for NOUSER
Jan 15 19:23:37 homebrou sshd[3418]: Failed password for invalid user test from 88.191.23.27 port 41017 ssh2
Jan 15 19:23:38 homebrou sshd[3420]: Invalid user test from 88.191.23.27
Jan 15 19:23:38 homebrou sshd[3420]: error: Could not get shadow information for NOUSER
Jan 15 19:23:38 homebrou sshd[3420]: Failed password for invalid user test from 88.191.23.27 port 41096 ssh2
Jan 15 19:23:38 homebrou sshd[3422]: Invalid user test from 88.191.23.27
Jan 15 19:23:38 homebrou sshd[3422]: error: Could not get shadow information for NOUSER
Jan 15 19:23:38 homebrou sshd[3422]: Failed password for invalid user test from 88.191.23.27 port 41162 ssh2
Jan 15 19:23:38 homebrou sshd[3424]: Invalid user test from 88.191.23.27
Jan 15 19:23:38 homebrou sshd[3424]: error: Could not get shadow information for NOUSER
Jan 15 19:23:38 homebrou sshd[3424]: Failed password for invalid user test from 88.191.23.27 port 41209 ssh2
Jan 15 19:23:39 homebrou sshd[3426]: Invalid user test from 88.191.23.27
Jan 15 19:23:39 homebrou sshd[3426]: error: Could not get shadow information for NOUSER
Jan 15 19:23:39 homebrou sshd[3426]: Failed password for invalid user test from 88.191.23.27 port 41267 ssh2
Jan 15 19:23:39 homebrou sshd[3428]: Invalid user test from 88.191.23.27
Jan 15 19:23:39 homebrou sshd[3428]: error: Could not get shadow information for NOUSER
Jan 15 19:23:39 homebrou sshd[3428]: Failed password for invalid user test from 88.191.23.27 port 41323 ssh2
Jan 15 19:23:40 homebrou sshd[3430]: Invalid user test from 88.191.23.27
Jan 15 19:23:40 homebrou sshd[3430]: error: Could not get shadow information for NOUSER
Jan 15 19:23:40 homebrou sshd[3430]: Failed password for invalid user test from 88.191.23.27 port 41376 ssh2
Jan 15 19:23:40 homebrou sshd[3433]: Invalid user test from 88.191.23.27
Jan 15 19:23:40 homebrou sshd[3433]: error: Could not get shadow information for NOUSER
Jan 15 19:23:40 homebrou sshd[3433]: Failed password for invalid user test from 88.191.23.27 port 41433 ssh2
Jan 15 19:23:41 homebrou sshd[3435]: Invalid user test from 88.191.23.27
Jan 15 19:23:41 homebrou sshd[3435]: error: Could not get shadow information for NOUSER
Jan 15 19:23:41 homebrou sshd[3435]: Failed password for invalid user test from 88.191.23.27 port 41484 ssh2
Jan 16 12:13:43 homebrou sshd[32249]: Did not receive identification string from 209.126.131.150

Вот что будет в логе /var/log/fail2ban.log за соответствующий период времени:

2007-01-15 15:38:47,142 fail2ban.actions: WARNING [ssh-iptables] Unban 81.74.87.66
2007-01-15 19:23:41,175 fail2ban.actions: WARNING [ssh-iptables] Ban 88.191.23.27
2007-01-15 19:23:42,373 fail2ban.actions: WARNING [ssh-iptables] 88.191.23.27 already banned
2007-01-15 19:33:41,508 fail2ban.actions: WARNING [ssh-iptables] Unban 88.191.23.27
2007-01-16 12:29:50,496 fail2ban.actions: WARNING [ssh-iptables] Ban 209.126.131.150

В этом примере можно увидеть, что между 19:23:37 и 19:23:41, т. е. в течение 4 секунд, было 9 попыток логина ssh (вместо только трех) с адреса 88.191.23.27 перед тем, как по этому IP был применен бан со стороны Fail2ban.

Возможность атаки DOS со стороны локального пользователя. Записи syslog могут быть подделаны обычным пользователем, например:

logger -p auth.warning -t 'sshd[123]' 'Illegal user user1 from 1.2.3.4'

Fail2Ban не должен быть запущен на системах, где предоставлены службы ssh/CGI/PHP для неизвестных пользователей без какого-либо уровня доверия. Это может заблокировать других пользователей от доступа к ssh и возможно от других служб путем вызова logger. Пользователь-злоумышленник может также писать в syslog через PHP-вызовы openlog()/syslog().

Примечание: chmod o-x /usr/bin/logger может предоставить как минимум решение по обфускации.

Системы лога, поддерживающие аутентификацию (например journal) могут предоставить в будущем адекватное решение для этой проблемы.

[Fail2Ban FAQ]

Вы используете действие mail-whois*/sendmail-whois*, и не установили исполняемый код whois.

В версии 0.8.1 действия "mail" устарели, используйте вместо этого "sendmail". Например, sendmail-whois вместо mail-whois в своем jail.[conf|local].

Скорее всего у Вас есть команда sendmail. Сделайте копию файла /etc/fail2ban/action.d/mail-whois.conf в /etc/fail2ban/action.d/mail-whois.local, отредактируйте его и замените mail на sendmail. Пример:

actionban = echo -en "From:root < fail2ban>
            To: < dest>
            Subject: [Fail2Ban] < name>: banned < ip>
            Hi,\n
            The IP < ip> has just been banned by Fail2Ban after
            < failures> attempts against < name>.\n\n
            Here are more information about < ip>:\n
            `whois < ip>`\n
            Regards,\n
            Fail2Ban"|sendmail -t

Так же можно изменить mail.conf.

Если Вы используете интеграцию Eclipse CVS с доступом через SSH, то каждый доступ CVS приведет к сбою до успешного выполнения запроса. Вследствие этого пользователи CVS время от времени попадают под запрет.

Как можно исправить: добавить IP-адреса пользователей CVS в белый список.

Такая ошибка выглядит примерно так:

ERROR: time data did not match format: data=Mar 21 10:00:50 fmt=%b %d %H:%M:%S
ERROR: Please check the format and your locale settings.

Это известный баг. Начиная с версии 0.6.1, в Fail2ban использует локальные настройки для формата даты и времени. Однако некоторые демоны не заботятся об использовании локального формата, и создают сообщения лога с кодированием даты и времени с использованием стандарта POSIX. Более подробно про этот баг см. [2].

Можно попробовать переназначить переменную LANG:

# LANG=en_US /etc/init.d/fail2ban restart

Доступную настройку локали можно получить командой:

# locale -a

Чтобы предоставлять в сообщениях Fail2ban больше информации, используйте опцию командной строки -vvv для fail2ban-client и fail2ban (только для версий 0.6.x). Установите loglevel на 4 в файле конфигурации /etc/fail2ban/fail2ban.conf (только для версий > 0.6.x).

Не получилось запустить команду fail2ban-client:

$ fail2ban-client status
ERROR  Unable to contact server. Is it running?

Запустите эту команду от имени root с помощью sudo:

$ sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:           ssh

Примечание: этот пример основан на системе Debian, но может быть легко выполнен на любом дистрибутиве.

Пакет установлен:

# dpkg -l |grep fail
ii  fail2ban    0.8.1-2    bans IPs that 
cause multiple authentication

Сервис работает:

# /etc/init.d/fail2ban status
Status of authentication failure monitor: fail2ban is running

SSH jail настроен и находится в готовности:

# sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:           ssh

Логи SSH bruteforce идентифицируются Fail2ban:

# fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
...
Success, the total number of match is 30

Теперь убедитесь, что все Ваши логи синхронизированы: все файлы логов должны иметь одно и то же опорное время (auth.log, syslog,..). Если сервер не очень загружен, то вероятно будет важным различие между выводом команды date и последним событием лога, записанного в syslog. Вы можете в syslog принудительно сгенерировать лог, используя команду logger, и проверить вывод команды date.

# date
Wed Nov 28 13:49:02 CET 2007
# tail -2 /var/log/auth.log
Nov 28 13:39:12 < SERVERNAME> sudo: pam_unix(sudo:session): session opened
 for user root by < user>(uid=0)
Nov 28 13:39:12 < SERVERNAME> sudo: pam_unix(sudo:session): session closed
 for user root

Если формат времени везде не различается, то Fail2Ban не может применить бан по IP!

Если Вы поменяли свою timezone, то помните о необходимости перезапуска syslogd, чтобы Fail2Ban видел правильное время в файлах лога.

Проверьте, установлено ли backend = auto. И установите backend = polling. В некоторых случаях Fail2Ban не может получать уведомления от gamin, но будет использовать его при установке auto.

[Сценарий 1]

Конфигурация VSFTP установлена на аутентификацию PAM, используя xferlog в стандартном формате. Fail2Ban для vsftpd просматривает /var/log/secure.

Проблема: PAM посылает информацию об отказах логина в лог /var/log/secure, однако IP удаленного сервера заменяется доменным именем. В результате DNS-имя не преобразуется в IP-адрес, или преобразуется неправильно, из-за чего Fail2Ban не может применить бан по IP-адресу.

Как исправить: сконфигурируйте VSFTP для "dual_log_enable=YES", и настройте Fail2Ban просматривать лог /var/log/vsftpd.log. Этот лог-файл показывает IP-адреса входящих подключений вместо DNS-имен.

[Сценарий 2]

Метки времени /var/log/vsftpd.log в формате GMT вместо local time zone.

Проблема: Fail2Ban не может применить бан, если видит метки времени, которые не соответствуют текущему времени.

Как исправить: добавьте "use_localtime=YES" в /etc/vsftpd/vsftpd.conf и перезапустите сервис vsftpd.

Примечание: это также приведет к тому, что метки времени файлов списков директорий и другие метки времени, отображаемые для клиентов, будут находиться в Вашей local time zone. Если это недопустимо, то Вы можете захотеть сконфигурировать Fail2Ban для мониторинга /var/log/secure, где метки находятся в local time zone, но это может привести к другим проблемам, описанным выше.

[upd240223]

На сегодняшний день fail2ban устанавливается и настраивается максимально просто. Точнее, его даже и настраивать не надо. Чтобы fail2ban на Debian сразу был установлен, запустился и заработал, достаточно выполнить команду, и на этом все, больше ничего фактически делать не надо [5]:

# apt-get install fail2ban

Лог работы fail2ban можно посмотреть командой:

# cat /var/log/fail2ban.log

[Ссылки]

1. Fail2Ban Main Page site:fail2ban.org.
2. Fail2Ban Bugs v0.6.1 trouble with locale-setting site:sourceforge.net.
3. Fail2Ban Commands site:fail2ban.org.
4. Как правильно отменить бан IP-адреса в Fail2Ban.
5. Настройка Fail2ban для защиты SSH site:putty.org.ru.

 

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


Защитный код
Обновить

Top of Page