Установка и настройка Fail2Ban с firewalld на CentOS 7

Введение
Большинство Linux‑серверов открывают SSH на порту 22 для удалённого администрирования. Этот порт хорошо известен и часто подвергается перебору паролей (brute force). Fail2Ban — это фоновая утилита, которая в реальном времени сканирует журналы и блокирует IP‑адреса, демонстрирующие признаки атак, с помощью firewalld или iptables.
Коротко: Fail2Ban распознаёт нежелательные попытки доступа в заданном периоде и автоматически банит атакующих, что уменьшает шум в логах и снижает вероятность компрометации.
Важно: Fail2Ban — это средство защиты по поведению (behavioral). Оно не заменяет надёжные пароли, двухфакторную аутентификацию и ограничение доступа по сети.
Что нужно знать заранее
- Требования: CentOS 7, root‑доступ или sudo.
- Влияние на пользователей: неверная конфигурация может заблокировать администратора. Всегда добавляйте свой IP в ignoreip.
- Термин «jail» — правило защиты, объединяющее фильтр логов и действие (бан).
Установка Fail2Ban
Сначала установим репозиторий EPEL (Extra Packages for Enterprise Linux). Затем установим пакеты Fail2Ban.
Выполните команды от root:
yum install epel-releaseyum install fail2ban fail2ban-systemdЕсли у вас включён SELinux, обновите политики:
yum update -y selinux-policy*Примечание: пакеты устанавливают systemd unit для управления сервисом.
Настройка Fail2Ban — базовое понимание
Файл /etc/fail2ban/jail.conf — системный. Не редактируйте его напрямую. Создайте /etc/fail2ban/jail.local и поместите туда ваши изменения: файл jail.local переопределяет значения из jail.conf и сохраняется при обновлениях.
Создайте копию и откройте её в редакторе:
cp -pf /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
nano /etc/fail2ban/jail.localТипичный фрагмент конфигурации в jail.local и пояснения:
[DEFAULT]
# ignoreip — IP, CIDR или DNS-хосты, которые НЕ будут баниться
ignoreip = 127.0.0.1/8
# ignorecommand — произвольная команда, которая вернёт true для игнорируемого IP
ignorecommand =
# bantime — время бана в секундах (600 = 10 минут)
bantime = 600
# findtime — окно времени в секундах для подсчёта попыток (600 = 10 минут)
findtime = 600
# maxretry — число неудачных попыток до бана
maxretry = 5Краткие определения:
- ignoreip — список IP, которые исключены из блокировок (разделитель — пробел). Добавьте сюда свой фиксированный IP.
- bantime — длительность бана в секундах; указывайте в секундах или используйте понятные величины в комментарии (например, 86400 = 1 день).
- findtime — окно наблюдения в секундах; если за этот период IP превысил maxretry, он будет заблокирован.
- maxretry — число неудачных попыток входа, после которого следует бан.
Совет по локализации времени: при указании больших значений полезно оставлять комментарий с переводом в минуты/часы/дни.
Добавление правила (jail) для защиты SSH
Создайте файл конфигурации для sshd:
nano /etc/fail2ban/jail.d/sshd.localДобавьте в него:
[sshd]
enabled = true
port = ssh
#action = firewallcmd-ipset
logpath = %(sshd_log)s
maxretry = 5
bantime = 86400Пояснения:
- enabled = true — включить правило. Поставьте false, чтобы отключить.
- port = ssh — можно указать номер порта, например port = 1212, если SSH работает на нестандартном порту.
- action — действие; по умолчанию Fail2Ban использует action.d/* для коммутации с firewalld/iptables. Комментарий показывает альтернативу.
- logpath — путь к журналу SSH; шаблон %(sshd_log)s берётся из /etc/fail2ban/jail.conf или системных путей.
- bantime = 86400 — бан на 86400 секунд (1 день).
Фильтр sshd находится в /etc/fail2ban/filter.d/sshd.conf и определяет, какие строки логов считать неудачными попытками.
Запуск и автозапуск firewalld и Fail2Ban
Если firewalld ещё не включён, запустите и добавьте в автозагрузку:
systemctl enable firewalld
systemctl start firewalldЗатем включите Fail2Ban:
systemctl enable fail2ban
systemctl start fail2banПроверка состояния служб:
systemctl status firewalld
systemctl status fail2banОтслеживание неудачных попыток входа
Чтобы просмотреть строки с неудачными попытками через SSH:
cat /var/log/secure | grep 'Failed password'Пример вывода (формат):
Apr 4 17:05:12 htf sshd[4287]: Failed password for root from 108.61.157.25 port 23121 ssh2
Apr 4 17:05:15 htf sshd[3154]: Failed password for root from 108.61.157.25 port 14486 ssh2
Apr 4 17:05:16 htf sshd[3154]: Failed password for root from 108.61.157.25 port 24157 ssh2
Apr 4 17:05:18 htf sshd[3154]: Failed password for root from 108.61.157.25 port 24157 ssh2Совет: используйте journalctl для systemd-логов, если ваш SSH логируется через systemd: journalctl -u sshd.
Просмотр заблокированных IP
Если используется iptables, можно увидеть правила так:
iptables -L -nЕсли Fail2Ban использует firewalld, смотрите зоны и ipset:
firewall-cmd --list-all
firewall-cmd --permanent --zone=trusted --list-sourcesПроверка статуса Fail2Ban и списка jails
fail2ban-client statusОжидаемый вывод:
[root@htf ]# fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshdЧтобы получить статус конкретного jails, выполните:
fail2ban-client status sshdРазбан IP
Чтобы убрать IP из бана, замените IPADDRESS на адрес:
fail2ban-client set sshd unbanip IPADDRESSАльтернатива при использовании iptables: удалять правило вручную, но предпочтительнее пользоваться fail2ban-client.
Чек‑лист для внедрения (роли)
Сисадмин:
- Добавить свой публичный IP в ignoreip.
- Настроить bantime/findtime/maxretry под требования бизнеса.
- Тестировать на отдельном тестовом сервере перед продом.
DevOps:
- Интегрировать правила в автоматизацию (Ansible/Chef/Puppet).
- Мониторить логи и оповещения при массовых блокировках.
Инженер безопасности:
- Согласовать политику блокировок и процедуру разблокировки.
- Проверить совместимость с IDS/IPS и SIEM.
Лучшие практики и полезные советы
- Всегда добавляйте свои административные IP в ignoreip.
- Используйте нестандартный порт SSH + ключи вместо паролей + 2FA — это снижает нагрузку на Fail2Ban.
- Настройте оповещения при превышении порога заблокированных IP (интеграция с SIEM/ELK/Prometheus).
- Не ставьте слишком маленький findtime при большом числе легитимных попыток доступа: это может привести к ложным срабатываниям.
Отладка и распространённые проблемы
Ничего не банится:
- Проверьте, правильно ли Fail2Ban читает логи: убедитесь, что logpath указывает на актуальный файл.
- Посмотрите /var/log/fail2ban.log на предмет ошибок фильтра.
Вы случайно заблокировали себя:
- Если у вас есть доступ к консоли сервера (KVM/VM), выполните unban через fail2ban-client.
- Если доступ утерян, временно остановите fail2ban: systemctl stop fail2ban, затем исправьте конфигурацию.
Конфликт с firewalld:
- Убедитесь, что action в /etc/fail2ban/action.d/ выбран корректно для firewalld.
- При использовании ipset убедитесь, что ipset установлен и доступен.
Когда Fail2Ban может не помочь (ограничения)
- Массовые распределённые атаки (DDoS) с большого числа IP: Fail2Ban на хосте не справится с сетевыми атаками уровня провайдера.
- Атаки на приложенческом уровне, использующие легитимные учётные данные: Fail2Ban блокирует только по шаблону логов.
- Сложные шаблоны логов могут требовать кастомных фильтров в /etc/fail2ban/filter.d/.
В таких случаях используйте дополнительные средства: WAF, rate‑limiting на уровне балансировщика, сетевые решения DDoS‑провайдера.
Альтернативы и дополнения
- Конфигурация SSH: запрет входа по паролю (PasswordAuthentication no), разрешить только по ключам.
- Port knocking или TCP Wrappers для дополнительной защиты.
- Централизованные правила блокировки: использовать ipset + синхронизацию списков между серверами.
- Коммерческие/облачные решения: WAF, облачные брандмауэры, DDoS mitigation.
Мини‑методология внедрения (быстрый план)
- Подготовка: добавить admin IP в ignoreip и сделать бекап jail.local.
- Установка: epel-release + fail2ban + fail2ban-systemd.
- Настройка: отредактировать /etc/fail2ban/jail.local и создать /etc/fail2ban/jail.d/sshd.local.
- Тестирование: принудительно сгенерировать неудачные попытки (на тестовой системе) и проверить бан.
- Мониторинг: настроить оповещения и периодический аудит.
Быстрый справочник (cheat sheet)
- Установить: yum install epel-release; yum install fail2ban fail2ban-systemd
- Запустить firewalld: systemctl enable –now firewalld
- Запустить Fail2Ban: systemctl enable –now fail2ban
- Проверить статус: fail2ban-client status
- Статус jail: fail2ban-client status sshd
- Снять бан: fail2ban-client set sshd unbanip 1.2.3.4
- Просмотреть логи: tail -f /var/log/fail2ban.log
Пример диаграммы принятия решения
graph TD
A[Обнаружена неудачная попытка входа] --> B{Кол-во попыток за findtime > maxretry?}
B -- Да --> C[Заблокировать IP 'bantime']
B -- Нет --> D[Продолжать мониторинг]
C --> E{Используется firewalld?}
E -- Да --> F[Добавить в ipset / zone]
E -- Нет --> G[Добавить правило iptables]
F --> H[Оповестить администратора]
G --> HКритерии приёмки
- Fail2Ban успешно запускается и активен после перезагрузки.
- SSH‑jail отображается в списке: fail2ban-client status.
- При моделировании превышения maxretry IP попадает в блокируеющие правила.
- Администратор способен снять бан без просмотра low‑level iptables при помощи fail2ban-client.
Итог
Fail2Ban — простой и эффективный инструмент для снижения шума от перебора паролей и уменьшения числа автоматизированных атак на SSH. Он легко интегрируется с firewalld и iptables, но не заменяет надёжных практик безопасности: ключи SSH, 2FA, ограничение доступа по сети и мониторинг.
Важно: тестируйте на стенде, корректно указывайте ignoreip и документируйте политику банов для команды.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента