Описание:
1 2 3 4 5 6 7 |
Fail2ban — простой в использовании локальный сервис, который отслеживает log–файлы запущенных программ, и на основании различных условий блокирует по IP найденных нарушителей. Программа умеет бороться с различными атаками на все популярные *NIX–сервисы, такие как Apache, Nginx, ProFTPD, vsftpd, Exim, Postfix, named, и т.д. Но в первую очередь Fail2ban известен благодаря готовности «из коробки» к защите SSH–сервера от атак типа «bruteforce», то есть к защите SSH от перебора паролей. |
Установка:
1 |
apt-get install fail2ban |
Конфигурация Fail2ban:
1 2 |
/etc/fail2ban/fail2ban.conf — отвечает за настройки запуска процесса Fail2ban. /etc/fail2ban/jail.conf — содержит настройки защиты конкретных сервисов, в том числе sshd. |
Файл jail.conf поделён на секции, так называемые «изоляторы» (jails), каждая секция отвечает за определённый сервис и тип атаки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
----------------------------------------------------------------- [DEFAULT] ignoreip = 127.0.0.1/8 bantime = 600 maxretry = 3 banaction = iptables-multiport ----------------------------------------------------------------- [ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 6 ----------------------------------------------------------------- Параметры из секции [DEFAULT] применяются ко всем остальным секциям, если не будут переопределены. Секция [ssh] отвечает за защиту SSH от повторяющихся неудачных попыток авторизации на SSH–сервере, проще говоря, «brute–force». |
Подробнее по каждому из основных параметров файла jail.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
----------------------------------------------------------------- ignoreip — IP–адреса, которые не должны быть заблокированы. Можно задать список IP-адресов разделённых пробелами, маску подсети, или имя DNS–сервера. ----------------------------------------------------------------- bantime — время бана в секундах, по истечении которого IP–адрес удаляется из списка заблокированных. ----------------------------------------------------------------- maxretry — количество подозрительных совпадений, после которых применяется правило. В контексте [ssh] — это число неудавшихся попыток логина, после которых происходит блокировка. ----------------------------------------------------------------- enabled — значение true указывает что данный jail активен, false выключает действие изолятора. ----------------------------------------------------------------- port — указывает на каком порту или портах запущен целевой сервис. Стандартный порт SSH–сервера — 22, или его буквенное наименование — ssh. ----------------------------------------------------------------- filter — имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса. Фильтру sshd соответствует файл /etc/fail2ban/filter.d/sshd.conf. ----------------------------------------------------------------- logpath — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в log–файл /var/log/auth.log. ----------------------------------------------------------------- findtime — определяет длительность интервала в секундах, за которое событие должно повториться определённое количество раз, после чего санкции вступят в силу. Если специально не определить этот параметр, то будет установлено значение по умолчанию равное 600 (10 минут). Проблема в том, что ботнеты, участвующие в «медленном брутфорсе», умеют обманывать стандартное значение. Иначе говоря, при maxretry равным 6, атакующий может проверить 5 паролей, затем выждать 10 минут, проверить ещё 5 паролей, повторять это снова и снова, и его IP забанен не будет. В целом, это не угроза, но всё же лучше банить таких ботов. ----------------------------------------------------------------- |
Рекомендации по настройке Fail2ban:
1 2 3 4 5 6 7 8 9 |
----------------------------------------------------------------- Не рекомендуется оставлять параметр ignoreip со значением по умолчанию 127.0.0.1/8, это создаёт очевидную угрозу в многопользовательских системах — если злоумышленник получил доступ хотя–бы к одному shell–аккаунту, то он имеет возможность беспрепятственно запустить bruteforce–программу для атаки на root или других пользователей прямо с этого–же сервера. ----------------------------------------------------------------- Прежде чем вносить изменения следуя рекомендациям, отметим, что не стоит редактировать основной файл настроек jail.conf, для этого предусмотрены файлы с расширением *.local, которые автоматически подключаются и имеют высший приоритет. ----------------------------------------------------------------- |
Дополнительно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
nano /etc/fail2ban/jail.local ----------------------------------------------------------------- [DEFAULT] ## Постоянный IP-адрес. ## Если не переопределить ignoreip здесь, ## то стоит закомментировать этот параметр в jail.conf. ignoreip = 57.66.158.131 ----------------------------------------------------------------- [ssh] ## если в течении 1 часа: findtime = 3600 ## произведено 6 неудачных попыток логина: maxretry = 6 ## то банить IP на 24 часа: bantime = 86400 ----------------------------------------------------------------- [ssh-ddos] enabled = true port = ssh filter = sshd-ddos logpath = /var/log/auth.log maxretry = 2 ----------------------------------------------------------------- [ssh] - еще и отправка на email enabled = true port = ssh filter = sshd action = iptables[name=sshd, port=ssh, protocol=tcp] sendmail-whois[name=ssh, dest=****@yandex.ru, sender=fail2ban@***.ru] logpath = /var/log/auth.log maxretry = 3 bantime = 600 ----------------------------------------------------------------- [postfix] - Защита почтового сервера enabled = true port = smtp,ssmtp,submission action = iptables[name=Postfix-smtp, port=smtp, protocol=tcp] filter = postfix logpath = /var/log/mail.log bantime = 86400 maxretry = 3 findtime = 3600 ignoreip = 127.0.0.1 ----------------------------------------------------------------- [sasl] - Защита почтового сервера enabled = true port = smtp,ssmtp,submission,imap2,imap3,imaps,pop3,pop3s filter = postfix-sasl action = iptables[name=Postfix-smtp, port=smtp, protocol=tcp] logpath = /var/log/mail.log bantime = 86400 maxretry = 3 findtime = 3600 ----------------------------------------------------------------- [dovecot] - Защита почтового сервера enabled = true port = smtp,ssmtp,submission,imap2,imap3,imaps,pop3,pop3s filter = dovecot action = iptables-multiport[name=dovecot-pop3imap,port="pop3,pop3s,imap,imaps", protocol=tcp] logpath = /var/log/mail.log maxretry = 3 findtime = 3600 bantime = 86400 ----------------------------------------------------------------- [roundcube-auth] - Защита почтового сервера enabled = true filter = roundcube-auth port = http,https logpath = /var/log/mail.log action = iptables-multiport[name=roundcube, port="http,https"] bantime = 86400 maxretry = 3 findtime = 3600 ----------------------------------------------------------------- [apache] - Защита веб-сервера (apache) enabled = true port = http,https filter = apache-auth logpath = /var/log/apache2/error.log maxretry = 3 ----------------------------------------------------------------- [apache-multiport] - Защита веб-сервера (apache) enabled = true port = http,https filter = apache-auth logpath = /var/log/apache2/error.log maxretry = 3 ----------------------------------------------------------------- [apache-noscript] - Защита веб-сервера (apache) enabled = true port = http,https filter = apache-noscript logpath = /var/log/apache2/error.log maxretry = 3 ----------------------------------------------------------------- [apache-overflows] - Защита веб-сервера (apache) enabled = true port = http,https filter = apache-overflows logpath = /var/log/apache2/error.log maxretry = 2 ----------------------------------------------------------------- [vsftpd] - Защита FTP сервера enabled = true port = ftp,ftp-data,ftps,ftps-data filter = vsftpd logpath = /var/log/vsftpd.log action = iptables[name=VSFTPD, port=21, protocol=tcp] bantime = 600 maxretry = 3 findtime = 1800 ----------------------------------------------------------------- |
nginx:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[nginx-http-auth] enabled = true filter = nginx-http-auth port = http,https logpath = /var/log/nginx/error.log [nginx-noscript] enabled = true port = http,https filter = nginx-noscript logpath = /var/log/nginx/access.log maxretry = 6 [nginx-badbots] enabled = true port = http,https filter = nginx-badbots logpath = /var/log/nginx/access.log maxretry = 2 [nginx-404] enabled = true port = http filter = nginx-404 logpath = /var/log/nginx/access.log findtime = 600 maxretry = 5 |
Проверка работы фильтра:
1 2 |
fail2ban-regex /var/NAME_LOG.log /etc/fail2ban/filter.d/NAME_FILTER.conf fail2ban-regex /var/NAME_LOG.log /etc/fail2ban/filter.d/NAME_FILTER.conf --print-all-matched |
Выполнить разбан(unban ip):
1 2 3 4 5 |
iptables –L - ознакомится с правилами iptables iptables --list-rules - ознакомится с правилами iptables iptables -S - ознакомится с правилами iptables fail2ban-client set JAIL unbanip IP - разблокировать IP fail2ban-client set ssh-iptables unbanip 1.1.1.1 - разблокировать IP |
Файл логов (LOG):
1 2 3 4 |
cat /var/log/fail2ban.log - показать содержимое лог файла tail -f /var/log/fail2ban.log - наблюдать за файлом fail2ban-client status - посмотреть статус fail2ban fail2ban-client status NAME_JAIL - посмотреть статус NAME_JAIL |
Список забаненных:
1 |
cat /var/log/fail2ban.log |grep Ban |
Ручной бан:
1 2 |
fail2ban-client set [name-of-jail] banip [ip-address] - ручной бан fail2ban-client set NAME_JAIL banip 1.1.1.1 - ручной бан |
Разбан:
1 |
fail2ban-client set NAME_JAIL unbanip 1.1.1.1 - разбанить |
Пример разбана:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Первый вариант удаляем из iptables: ----------------------------------- iptables -L -n - проверяем фаервол (смотрим цепочки) fail2ban-client status - смотрим список правил fail2ban fail2ban-client status ssh - смотрим баны в списке iptables -D fail2ban-ssh -s xxx.yyy.zzz.www -j DROP - удалить из таблицы fail2ban-ssh ip ----------------------------------- Второй вариант удаляем из iptables: ----------------------------------- iptables -L -n --line-numbers iptables -D asterisk-iptables 3 ----------------------------------- Третий вариант удаляем из fail2ban: ----------------------------------- fail2ban-client status ssh - смотрим баны в списке fail2ban-client set ssh unbanip 192.168.15.50 - разбанить #fail2ban-client get ssh actionunban 192.168.15.50 - разбанить ----------------------------------- |
Добавить игнорирование IP
1 2 3 |
fail2ban-client get JAIL_NAME ignoreip - показать игнорируемые IP в JAIL_NAME fail2ban-client set JAIL_NAME addignoreip 10.14.16.10 - добавить в список игнорируемых ip (10.14.16.10) в JAIL_NAME fail2ban-client set JAIL_NAME unbanip 10.14.16.10 - разблокировать ip (10.14.16.10) из JAIL_NAME |
Свой фильтр:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
nano /etc/fail2ban/jail.conf ----------------------------------------------------------------- [redmine] enabled = true filter = redmine port = 80,443 #backend = polling action = iptables-allports[name=redmine] logpath = /var/log/redmine/default/production.log maxretry = 5 findtime = 7320 bantime = 7320 ----------------------------------------------------------------- nano /etc/fail2ban/filter.d/redmine.conf ----------------------------------------------------------------- # redmine configuration file # Author: David Siewert # $Revision$ [Definition] failregex = Failed [-/\w]+ for .* from <HOST> # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex = # Source: #http://www.fail2ban.org/wiki/index.php/MANUAL_0_8 ----------------------------------------------------------------- проверка синтаксиса: ----------------------------------------------------------------- fail2ban-regex /var/log/redmine/default/production.log /etc/fail2ban/filter.d/redmine.conf ----------------------------------------------------------------- |