Основное предназначение fail2ban
— защита от несанкционированного доступа, что возможно благодаря тщательному отслеживанию сетевой активности на основных портах и чтению журналов записей.
Чтобы блокировать адрес, fail2ban
создает правило в брандмауэре netfilter
. Блокировка настраивается путем внесения изменений в правила iptables
.
Программа особенно эффективна против так называемых brute-force
атак, поскольку она нейтрализует атакующего таким образом, что все пакеты, отправленные с устройства, IP-адрес которого по той или иной причине попал в черный список, отбрасываются.
Установка
CentOS 7/Red Hat
$ yum install fail2ban
Ubuntu/Debian
$ apt install fail2ban
CentOS 6
- Добавляем репозиторий:
$ rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
- Устанавливаем fail2ban:
$ yum install fail2ban
Запуск
$ systemctl enable fail2ban $ systemctl start fail2ban
или
$ service fail2ban start
Настройка
Процесс настройки fail2ban не зависит от дистрибутива Linux.
Основной конфигурационный файл jail.conf
находится в каталоге /etc/fail2ban/
. Однако, его не рекомендуется менять и для настройки используют подключаемые файлы из каталога /etc/fail2ban/jail.d
.
Существующие фильтры лежат в директории /etc/fail2ban/filter.d
. Можно изменять существующие фильтры или на их основе делать собственные.
Существующие правила реагирования хранятся в директории /etc/fail2ban/action.d
.
Как правило, все стандартные файлы содержат подробные комментарии.
Действия
Файлы с настройкой действий находятся в каталоге /etc/fail2ban/action.d
.
Остановимся на описании самых используемых действий:
- iptables — создание простого правила в netfilter с помощью одноименной утилиты;
- iptables-multiport — использование модуля multiports, позволяющий добавлять диапазоны портов для блокировки;
- iptables-ipset — использование ipset для придания более лаконичного вида правилам;
- iptables-allports — блокирует для адреса все порты.
Фильтры
Фильтры, в основном, представляют набор регулярных выражений для поиска ключевых слов в log-файлах. Они находятся в каталоге /etc/fail2ban/filter.d
.
Для создания и настройки своих фильтров, можно использовать имеющиеся файлы в качестве шаблона.
Файлы с фильтрами должны иметь расширение .conf
. В дальнейшем использовать указанный фильтр можно, обратившись к нему в правиле по имени файла без расширения.
Например, чтобы использовать фильтр /etc/fail2ban/filter.d/my.conf
в правиле надо указать:
filter = my
Указание параметров на примере
Для нового правила необходимо создать конфигурационный файл в каталоге /etc/fail2ban/jail.d:
$ vi /etc/fail2ban/jail.d/service.conf
[ssh] enabled = true port = ssh filter = sshd action = iptables[name=sshd, port=ssh, protocol=tcp] logpath = /var/log/auth.log maxretry = 10 findtime = 600 ignoreip = 127.0.0.1/8
Разберем параметры:
- ssh — название для правила.
- enabled позволяет быстро включать (true) или отключать (false) правило;
- port — порт целевого сервиса. Принимается буквенное или цифирное обозначение.
- filter — фильтр (критерий поиска), который будет использоваться для поиска подозрительных действий. По сути, это имя файла из каталога
/etc/fail2ban/filter.d
без.conf
на конце. - action — действие, совершаемое в случае срабатывания правила. В квадратных скобках указаны название для правила, сетевой порт и протокол для блокирования.
- logpath — расположение лог-файла, в котором фильтр будет искать подозрительную активность на основе описанных критериев.
- Примечание: Если путь к файлу хранения логов указан некорректно, перезапуск Fail2ban завершится сообщением об ошибке. Если файла не существует, его нужно создать. Лог должен иметь права доступа 755.
- maxretry — количество действий, которые разрешено совершить до блокировки.
- findtime — время в секундах, в течение которого учитывается maxretry.
- bantime — время, на которое будет блокироваться IP-адрес.
- ignoreip — игнорировать защиту, если запросы приходят с перечисленных адресов.
Если какой-то из параметров не указан в конкретном правиле, для него берется значение по умолчанию, описанное в правиле DEFAULT.
Примечание: Для применения новые правил необходимо перезапустить fail2ban одной из следующих команд:
$ systemctl restart fail2ban
или
$ service fail2ban restart
Работа со списком заблокированных адресов
Просмотр
Формат команды:
fail2ban-client status <имя правила>
Без имени правила будет отображен весь список активных правил.
- Получить список правил можно командой:
$ fail2ban-client status
- Получить статистику заблокированных адресов можно следующей командой:
$ fail2ban-client status ssh `- action |- Currently banned: 2 | `- IP list: 31.207.47.55 10.212.245.29
Удаление адреса из списка
Формат команды:
fail2ban-client set <имя правила> unbanip
Пример:
$ fail2ban-client set ssh unbanip 31.207.47.55
Примеры
Блокировка доступа по SSH
[ssh-iptables] # 'enabled = true' означает что защита SSH включена. # Ее можно отключить с помощью 'enabled = false'. enabled = true # Использовать фильтр: /etc/fail2ban/filter.d/sshd.conf filter = sshd # Действия, выполняемые при блокировке IP адреса: action = iptables[name=SSH, port=ssh, protocol=tcp] # Отправлять уведомления на admin@example.com sendmail-whois[name=SSH, dest=admin@example.com, sendername="Fail2Ban"] # Файл с логами, которые будет отслеживать Fail2Ban: logpath = /var/log/secure # если в течение 1 часа findtime = 3600 # произведено 5 неудачных попыток залогиниться maxretry = 5 # IP адрес будет забанен на 24 часа bantime = 86400
NGINX DDoS (req limit)
Данное правило поможет защитить веб-сервер nginx от DDoS-атак. В некоторых сборках, для данного правила может не оказаться готового фильтра, поэтому в данном примере, мы его создадим вручную.
- Создаем фильтр:
vi /etc/fail2ban/filter.d/nginx-limit-req.conf
[Definition] ngx_limit_req_zones = [^"]+ failregex = ^\s*\[error\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone "(?:%(ngx_limit_req_zones)s)", client: ignoreregex =
- Создаем правило в fail2ban:
vi /etc/fail2ban/jail.d/nginx-ddos.conf
[nginx-ddos] enabled = true port = http,https filter = nginx-limit-req action = iptables-multiport[name=nginxddos, port="http,https", protocol=tcp] logpath = /var/log/nginx/error.log