Всем привет!
Решил рассказать о Fail2Ban в операционной системе FreeBSD.
В этой заметке рассмотрим установку и базовую настройку Fail2Ban в связке с брандмауэром IPFW, с помощью которого мы защитим sshd от попыток подбора паролей.
Fail2Ban — это программный комплекс для предотвращения вторжений, который защищает серверы от брутфорса.
Написан на языке Python, для блокировки использует штатные механизмы операционной системы, в нашем случае файрвол IPFW
Устанавливаем Fal2Ban, установку будем делать из портов, не забываем обновить порты:
# portsnap fetch update # cd /usr/ports/security/py-fail2ban && make install clean
Создаем локальный конфигурационный файл Fail2Ban:
# cp /usr/local/etc/fail2ban/jail.conf /usr/local/etc/fail2ban/jail.local
Редактируем его:
# vi /usr/local/etc/fail2ban/jail.local [DEFAULT] #Ваш белый список IP адресов, которые будут игнорироваться fail2ban ignoreip = 127.0.0.1/8 10.10.10.0/24 [sshd] # Включаем правило enabled = true port = ssh # auth.log (переменная определена в paths-common.conf), можно явно указать файл лога logpath = %(sshd_log)s backend = %(sshd_backend)s # Указываем что делать с нарушителями (добавить IP в таблицу "sshd" IPFW ) action = bsd-ipfw[table=sshd] # Количество попаданий maxretry = 3 # Время бана в секундах (10800/3600(сек. в часе)= 3 часа) bantime = 10800
Включим файрвол и разрешим запуск fail2ban:
# vi /etc/rc.conf firewall_enable="YES" firewall_logging="YES" firewall_script="/etc/fw.sh" fail2ban_enable="YES"
Сделаем IPFW открытым по умолчанию:
# vi /boot/loader.conf net.inet.ip.fw.default_to_accept=1
# kenv net.inet.ip.fw.default_to_accept=1
Создадим файл конфигурации ipfw:
# vi /etc/fw.sh #!/bin/sh ipfw="/sbin/ipfw -q" # Сбрасываем все правила: ${ipfw} -f flush ${ipfw} add allow ip from any to any via lo0 ${ipfw} add deny ip from any to 127.0.0.0/8 ${ipfw} add deny ip from 127.0.0.0/8 to any #Fail2Ban ${ipfw} add deny ip from table'(sshd)' to any #All for all ${ipfw} add allow ip from any to any
Сделаем файл исполняемым:
# chmod +x /etc/fw.sh
Запускаем ipfw:
# /etc/rc.d/ipfw start
Проверяем все ли правила ipfw у нас загрузились:
# ipfw show 00100 0 0 allow ip from any to any via lo0 00200 0 0 deny ip from any to 127.0.0.0/8 00300 0 0 deny ip from 127.0.0.0/8 to any 00400 0 0 deny ip from table(sshd) to any 00500 20 1876 allow ip from any to any 65535 154 14173 allow ip from any to any
Видим, что у нас есть таблица «sshd«, которую fail2ban будет заполнять ip адресами нарушителей.
Запускаем Fail2Ban:
# /usr/local/etc/rc.d/fail2ban start Server ready
В поставке fail2ban есть утилита контроля и управления — fail2ban-client.
С ее помощью проверим какие правила у нас обрабатываются:
# fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshd
Так же можем посмотреть статус любого загруженного правила:
# fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:
Попробуем подключится с удаленного хоста к ssh, указав 3 раза неправильный пароль.
Удалось ввести только два раза, вот лог подключения:
Feb 5 15:28:39 free12 sshd[3283]: error: PAM: Authentication error for vladimir from 10.200.200.35 Feb 5 15:28:39 free12 sshd[3283]: Failed keyboard-interactive/pam for vladimir from 10.200.200.35 port 42847 ssh2 Feb 5 15:28:39 free12 sshd[3283]: Failed unknown for vladimir from 10.200.200.35 port 42847 ssh2
Посмотрим лог fail2ban:
less /var/log/fail2ban.log | grep Ban 2020-02-05 15:28:40,081 fail2ban.actions [3265]: NOTICE [sshd] Ban 10.200.200.35
Так же можем посмотреть с помощью fail2ban-client:
# fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 3 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 10.200.200.35 root@free12:/usr/local/etc/fail2ban #
Давайте вытащим IP из бана:
# fail2ban-client set sshd unbanip 10.200.200.35 1
Собственно все.