Использование fail2ban в Linux
fail2ban
/etc/fail2ban/fail2ban.conf - основной конфигурационный файл
Изменять его не рекомендуется. Для переопределения существующих правил и параметров лучше создать файл в каталоге /etc/fail2ban/jail.d
Фильтры должны храниться в каталоге /etc/fail2ban/filter.d/
По умолчанию в каталоге /etc/fail2ban/filter.d/ уже существуют фильтры, которые можно редактировать и использовать в своих целях
#Установка
apk add fail2ban
#Автозапуск
rc-update add fail2ban
#Запуск
/etc/init.d/fail2ban start
#После изменений правил в конфигурации
/etc/init.d/fail2ban restart
Пример 1
Параметры правил определяются из настроек по умолчанию. Если их нужно переопределить, просто добавляем их при создании правила, например создадим правило /etc/fail2ban/jail.d/example.conf
[DEFAULT]
maxretry = 4
findtime = 480
bantime = 720
action = iptables
ignoreip = 127.0.0.1/8
maxretry — количество действий, которые разрешено совершить до бана
findtime — время в секундах, в течение которого учитывается maxretry
bantime — время, на которое будет блокироваться IP-адрес
action — действия, которое будет выполняться, если Fail2ban обнаружит активность, соответствующую критериям поиска
ignoreip — игнорировать защиту, если запросы приходят с перечисленных адресов
В данном примере, если в течение 8 минут (480) будет найдено 5 строк (maxretry = 4), содержащих критерий фильтра, Fail2ban заблокирует IP-адрес, с которого идет подключение на 12 минут (720);
В секции [DEFAULT] файла /etc/fail2ban/fail2ban.conf хранятся общие настройки для всех правил. Каждую из настроек можно переопределить при создании своего правила
Пример 2
Создадим правило, например /etc/fail2ban/jail.d/service-ssh.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
ssh — название для правила;
enabled позволяет быстро включать (true) или отключать (false) правило;
port — порт целевого сервиса. Принимается буквенное или цифирное обозначение;
filter — фильтр (критерий поиска), который будет использоваться для поиска подозрительных действий. По сути, это имя файла из каталога /etc/fail2ban/filter.d без .conf на конце;
action — действие, совершаемое в случае срабатывания правила. В квадратных скобках указаны название для правила, сетевой порт и протокол для блокирования;
logpath — расположение лог-файла, в котором фильтр будет искать подозрительную активность на основе описанных критериев.
В данной конфигурации переопределили параметры по умолчанию maxretry, findtime и action
Исключения
Для гарантии, что fail2ban не заблокирут компьютер администратора или другой важный узел, предусмотрена настройка исключений с помощью опции ignoreip. Опция может быть применена как на глобальном уровне (default), так и для конкретного правила
Для того, чтобы задать общую настроку, откроем /etc/fail2ban/jail.conf и добавим строку для конкретной секции:
[ssh]
#Добавим ip администратора в исключение
ignoreip = 127.0.0.1/8 192.168.0.0/24 95.95.95.95
Действия
Файлы с настройкой действий находятся в каталоге /etc/fail2ban/action.d. Чтобы блокировать адрес, Fail2ban создает правило в брандмауэре netfilter. Для этого, чаще всего, используются утилиты iptables или firewall-cmd
iptables — создание простого правила в netfilter с помощью одноименной утилиты;
iptables-multiport — использование модуля multiports, позволяющий добавлять диапазоны портов для блокировки;
iptables-ipset — использование ipset для придания более лаконичного вида правилам;
iptables-allports — блокирует для адреса все порты;
Фильтры
Фильтры, в основном, представляют набор регулярных выражений для поиска ключевых слов в log-файлах. Они находятся в каталоге /etc/fail2ban/filter.d.
Для создания и настройки своих фильтров, можно использовать имеющиеся файлы в качестве шпаргалки.
Например отредактируем существующий фильтр /etc/fail2ban/filter.d/alpine-sshd.conf, здесь только расширим набор регулярных выражений в директиве failregex, по которым будет осуществляться поиск событий в указанном логе
failregex = Failed [-/\w]+ for .* from port \d* ssh2
sshd\[.*\]: Invalid user .* from port \d*
sshd\[.*\]: banner exchange: Connection from port \d*
sshd\[.*\]: ssh_dispatch_run_fatal: Connection from port \d*
sshd\[.*\]: Failed password for invalid user .* port \d*
sshd\[.*\]: Connection closed by port \d*
sshd\[.*\]: Connection reset by port \d*
sshd\[.*\]: Received disconnect from port \d*:[0-9]+: \[preauth\]
sshd\[.*\]: Disconnected from invalid user .* port \d* \[preauth\]
По умолчанию для данного фильтра уже создано правило /etc/fail2ban/jail.d/alpine-ssh.conf
В настройках правила sshd, в директиве filter указывается название фильтра, поиск которого будет осуществляться в директории /etc/fail2ban/filter.d/*
В данном правиле добавлю только ip-адреса, которые не должны попадать в черный список:
/etc/fail2ban/jail.d/alpine-ssh.conf
[sshd]
enabled = true
filter = alpine-sshd
port = ssh
logpath = /var/log/messages
maxretry = 5
bantime = 1w
findtime = 1w
ignoreip = 127.0.0.1/8 192.168.0.0/16
Полезные команды
Для примера использупется правило sshd и случайный ip-адрес 223.178.96.155
#Получить список правил
sudo fail2ban-client status
#Заблокировать ip вручную
fail2ban-client set sshd banip 223.178.96.155
#Статистика заблокированных адресов для конкретного правила
fail2ban-client status sshd
#Чтобы получить весь список заблокированных адресов
fail2ban-client banned
#Список заблокированных адресов через iptables
iptables -L -n --line
#Удаление адреса из списка
fail2ban-client set sshd unbanip 223.178.96.155
#Удаление адреса из списка через iptables
iptables -D <цепочка правил> -s IP-адрес
Использование fail2ban c другими утилитами linux
В следующем примере в сочетании с другими утилитами linux, используется утилита fail2ban-client, которая добавляет найденные ip-адреса в логе /var/log/php-access.log в черный список
for a in `seq 1000`;do sleep 10; for i in `tail -n 1000 /var/log/php-access.log | grep POST | grep " 401 1133 "| awk '{print $1}' |sort -n|uniq `; do fail2ban-client set recidive banip ${i};
Посмотреть или удалить заблокированный ip-адрес, можно будет используя название правила recidive
#Удаление адреса из списка
fail2ban-client set recidive unbanip 223.178.96.155
Создание своего правила и фильтра
Создадим простой фильтр в файле /etc/fail2ban/filter.d/alpine-syn-recv.conf
Добавим в него содержимое:
[Definition]
failregex = SYN_RECV$
ignoreregex =
Далее создадим файл /etc/fail2ban/jail.d/alpine-syn-recv.conf
Добавим в него содержимое:
[syn_recv]
enabled = true
filter = alpine-syn-recv
logpath = /tmp/syn-recv.log
maxretry = 3
ignoreip = 127.0.0.1/8 185.217.198.212 195.91.200.167 80.87.198.154 128.0.137.65
В этом правиле, в качестве логов для поиска событий, будет использоваться файл /tmp/syn-recv.log
В качестве фильтра будет использоваться фильтр: alpine-syn-recv
В данный лог Я буду вручную добавлять строку: 192.168.2.8 SYN_RECV более 3-х раз (maxretry = 3), чтобы наглядно убедиться, что данный ip-будет заблокирован
#Без лога для поиска событий fail2ban не запустится
touch /tmp/syn-recv.log
#Перезапуск конфигурации
/etc/init.d/fail2ban restart
#Убедимся, что ip 192.168.2.8 еще не заблокирован
# fail2ban-client status syn_recv
Status for the jail: syn_recv
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /tmp/syn-recv.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
#Имитируем создание логов некоторым сервисом, который проверят состояние соединений
echo "192.168.2.8 SYN_RECV" >> /tmp/syn-recv.log
echo "192.168.2.8 SYN_RECV" >> /tmp/syn-recv.log
echo "192.168.2.8 SYN_RECV" >> /tmp/syn-recv.log
echo "192.168.2.8 SYN_RECV" >> /tmp/syn-recv.log
#Проверим еще раз список заблокированных ip для правила syn_recv
fail2ban-client status syn_recv
Status for the jail: syn_recv
|- Filter
| |- Currently failed: 0
| |- Total failed: 3
| `- File list: /tmp/syn-recv.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.2.8
Возможные ошибки
ERROR Failed during configuration: Have not found any log file for recidive jail
В данном случае необходимо вручную создать файл для логов
touch /var/log/fail2ban.log
Источники
Связанные темы
Использование hydra для тестирования
Поиск уязвимостей и следов взлома в Linux
Использование iptables в linux
Базовые понятие о настройках и безопасности в сети
Саздание сертификатов SSL (TLS) для сайта
Мониторинг событий в linux с помощью auditd