Fail2ban - популярный сервис защиты серверов от атак на уязвимые сетевые сервисы. Позволяет анализировать логи и блокировать подозрительные IP-адреса. В статье мы подробно разберем установку и настройки Fail2ban с использованием практических примеров. Рассмотрим особенности основных правил и реальные кейсы защиты SSH, Apache, Nginx, почтовых сервисов.
Основные понятия и принципы работы Fail2ban
Fail2ban работает путем анализа лог-файлов различных сервисов и приложений, таких как SSH, Apache, Postfix и других. Он ищет в логах определенные шаблоны, соответствующие потенциальным атакам или подозрительной активности. Например, множественные неудачные попытки входа по SSH могут указывать на атаку перебором паролей.
Когда Fail2ban обнаруживает подозрительную активность от какого-то IP-адреса, он может выполнить различные действия, такие как блокировка этого IP-адреса с помощью iptables или firewalld на определенное время.
Как Fail2ban анализирует логи
Анализ логов происходит с помощью набора регулярных выражений и фильтров. Каждый фильтр настроен на поиск шаблонов для конкретного сервиса или приложения в соответствующих лог-файлах.
Например, фильтр sshd ищет строки вида:
Jun 6 11:07:53 myserver sshd[1231]: Failed password for root from 192.168.0.14 port 55916 ssh2
Такая строка указывает на неудачную попытку входа по SSH с указанного IP-адреса. Если таких попыток будет больше определенного порога за установленный промежуток времени, то сработает соответствующее правило Fail2ban и заблокирует этот IP.
Пример блокировки подозрительного IP
Допустим, мы настроили Fail2ban так, что он будет блокировать IP-адреса, с которых было более 5 неудавшихся попыток входа по SSH за последние 10 минут.
Тогда процесс блокировки может выглядеть так:
- Злоумышленник с IP-адреса 85.195.111.26 делает 3 неудачные попытки входа по SSH за 2 минуты
- Через 5 минут следуют еще 2 попытки
- Fail2ban регистрирует более 5 неудавшихся попыток входа по SSH с одного IP за последние 10 минут
- Включается правило для блокировки IP 85.195.111.26 через iptables
- Доступ к серверу по SSH с IP 85.195.111.26 блокируется на указанное время, например, на 30 минут
Действия при блокировке IP в Fail2ban
Когда Fail2ban блокирует IP-адрес, он по умолчанию выполняет следующие действия:
- Добавляет новое правило в iptables (например, iptables -I f2b-ssh 2 -s 85.195.111.26 -j DROP), которое отбрасывает (блокирует) весь трафик с этого адреса
- Записывает информацию о заблокированном IP в отдельный файл
- По истечении установленного времени блокировки (bantime) автоматически удаляет добавленное правило из iptables и информацию из файла блокировок
Таким образом "подозреваемый" IP-адрес разблокируется автоматически.
Установка Fail2ban в Linux (CentOS 7)
Для работы Fail2ban требуются утилиты iptables и некоторые другие компоненты, которые устанавливаются из репозитория EPEL. Поэтому первым делом подключим этот репозиторий:
sudo yum install epel-release
После этого устанавливаем пакет Fail2ban:
sudo yum install fail2ban
Чтобы Fail2ban запускался автоматически при загрузке системы, добавим его в автозагрузку:
sudo systemctl enable fail2ban
После установки можно проверить статус службы командой:
sudo systemctl status fail2ban
По умолчанию Fail2ban уже имеет базовую настройку для защиты SSH от брутфорса. Чтобы посмотреть список защищаемых сервисов, используем:
sudo fail2ban-client status
Файлы и директории Fail2ban
Основные конфигурационные файлы Fail2ban располагаются в директории /etc/fail2ban/. Рассмотрим структуру основных директорий:
- /etc/fail2ban/ - корневая директория с конфигурационными файлами
- /etc/fail2ban/jail.d/ - здесь хранятся отдельные конфиги для каждого защищаемого сервиса
- /etc/fail2ban/filter.d - набор фильтров для различных сервисов и приложений
- /etc/fail2ban/action.d - файлы с описанием действий при блокировке
jail.conf - базовая конфигурация
Основной конфигурационный файл Fail2ban - /etc/fail2ban/jail.conf. В нем описываются параметры для всех защищаемых сервисов. Файл разделен на секции:
[DEFAULT] - параметры по умолчанию [ssh] - настройки для защиты SSH [ssh-ddos] и т.д. - секции для других сервисов
jail.local - пользовательские правила
Для изменения параметров по умолчанию используется конфиг /etc/fail2ban/jail.local. Этот файл подключается автоматически и имеет более высокий приоритет.
Порядок обработки конфигурации
Файлы обрабатываются в следующем порядке:
- Сначала /etc/fail2ban/jail.conf - базовая конфигурация
- Затем /etc/fail2ban/jail.d/*.conf - расширенные правила для отдельных сервисов
- И в конце /etc/fail2ban/jail.local - пользовательские определения
Таким образом, jail.local имеет самый высокий приоритет и может переопределять любые параметры.
Назначение основных параметров
Рассмотрим назначение наиболее важных опций конфигурации:
ignoreip | Список IP-адресов, которые никогда не блокируются |
bantime | Время блокировки IP-адреса в секундах |
maxretry | Максимальное число ошибок или нарушений до блокировки IP |
Более подробно значения других опций описаны в официальной документации Fail2ban.
После установки Fail2ban готов к использованию и уже имеет ряд правил для различных сервисов. Однако лучше изменить некоторые опции.
Установка ignoreip
Список исключений из блокировок задается параметром ignoreip. Рекомендуется указать здесь IP-адреса администраторов, чтобы не заблокировать случайно себя.
Для этого создаем конфиг /etc/fail2ban/jail.local и прописываем там:
ignoreip = 127.0.0.1/8 192.168.0.*
Изменение времени блокировки
По умолчанию Fail2ban разблокирует IP через 600 секунд или 10 минут (параметр bantime равен 600). Увеличим это время:
bantime = 86400
Теперь блокировка будет действовать 24 часа (86400 секунд).
Для повышения эффективности можно задать дополнительные опции:
findtime = 600 backend = systemd
Параметр findtime определяет интервал для подсчета количества ошибок. А backend указывает использовать systemd для анализа журналов вместо файлов.
Применение изменений и перезапуск
После внесения правок перезапускаем службу для их применения:
sudo systemctl restart fail2ban
Защита SSH с помощью Fail2ban
Одна из основных задач Fail2ban - защита SSH сервера от атак типа "bruteforce", то есть от множественных попыток подбора паролей. Рассмотрим более детально настройки для SSH.
Анализ секции [ssh] в конфигурации
В файле jail.conf имеется секция [ssh], в которой заданы параметры для защиты SSH от брутфорса:
[ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 6
Здесь видно, что проверяется лог /var/log/auth.log с помощью фильтра sshd. IP будет заблокирован после 6 неудачных попыток входа.
Изменение параметров для SSH jail
По умолчанию настройки довольно мягкие. Ужесточим их, создав отдельный конфиг /etc/fail2ban/jail.d/ssh.local:
[ssh] enabled = true bantime = 86400 findtime = 300 maxretry = 3
Теперь блокировка будет на 1 день после 3 неудачных попыток за 5 минут.
Пример блокировки brute-force атаки на SSH
Предположим, злоумышленник пытается подобрать пароль к пользователю admin на нашем сервере. В логе /var/log/auth.log будут появляться строки типа:
Jun 7 13:21:54 myserver sshd[29189]: Failed password for admin from 192.168.0.55 port 42156 ssh2 Jun 7 13:22:01 myserver sshd[29205]: Failed password for admin from 192.168.0.55 port 42240 ssh2 Jun 7 13:22:08 myserver sshd[29216]: Failed password for admin from 192.168.0.55 port 42369 ssh2
Как видно, было 3 неудачные попытки входа за 5 минут с IP 192.168.0.55. Сработает наше правило SSH из Fail2ban и заблокирует этот адрес на сутки.
Настройка защиты веб-серверов
Помимо SSH, Fail2ban может защитить также веб-серверы и сайты от различных атак, сканирования уязвимостей, подбора паролей в панели администратора и других несанкционированных действий.
Пример для Apache httpd
Чтобы включить фильтрацию подозрительных запросов к Apache, добавляем в jail.local:
[apache-auth] enabled = true
Это активирует готовый шаблон для HTTP Basic authentication. IP будут блокироваться при неудачном вводе логина/пароля на защищенные страницы.
Fail2ban для nginx
Для nginx тоже есть несколько готовых правил, например, для защиты phpMyAdmin:
[nginx-http-auth] enabled = true
Это заблокирует IP после 5 неудачных попыток авторизации подряд. Время блокировки по умолчанию - 10 минут.
Включение защиты по умолчанию
Другие готовые правила для веб-сервисов:
[apache-overflows] [nginx-botsearch] [nginx-nohome]
Детальное описание действия каждого правила есть в конфиге jail.conf
Рассмотрим использование Fail2ban для защиты некоторых других распространенных сервисов.
Защита MySQL от перебора паролей
Создадим правило для блокировки брутфорса пароля пользователя MySQL root:
[mysqld-auth] enabled = true port = 3306 filter = mysqld-auth logpath = /var/log/mysql/error.log maxretry = 5
После 5 неверных попыток входа за любой промежуток времени IP будет заблокирован на 24 часа.
Настройка правил для Exim
Добавим защиту почтового сервера Exim от перебора паролей:
[exim] enabled = true port = smtp,465,submission filter = exim action = iptables-allports[name=exim-spam]
Здесь при обнаружении атаки будут блокироваться все порты, не только 25, 465 и 587.
Для управления и мониторинга Fail2ban предназначена утилита fail2ban-client. Рассмотрим наиболее полезные команды.
Получить список всех правил
fail2ban-client status
Это выведет статус каждого jail - включен он или нет.
Посмотреть заблокированные IP
sudo fail2ban-client status sshd
Здесь sshd - имя тюрьмы. Можно указать другие, например, nginx-http-auth.
Разблокировка IP вручную
fail2ban-client set sshd unbanip 192.168.0.123
Удаляет IP 192.168.0.123 из списка заблокированных правилом sshd в Fail2ban.