Рубрики
iptables \ Fail2ban

Fail2ban

Описание:

Fail2ban — простой в использовании локальный сервис, 
который отслеживает log–файлы запущенных программ, 
и на основании различных условий блокирует по IP найденных нарушителей.
Программа умеет бороться с различными атаками на все 
популярные *NIX–сервисы, такие как Apache, Nginx, ProFTPD, vsftpd, Exim, Postfix, named, и т.д.
Но в первую очередь Fail2ban известен благодаря готовности 
«из коробки» к защите SSH–сервера от атак типа «bruteforce», то есть к защите SSH от перебора паролей.

Установка:

apt-get install fail2ban

Конфигурация Fail2ban:

/etc/fail2ban/fail2ban.conf — отвечает за настройки запуска процесса Fail2ban.
/etc/fail2ban/jail.conf — содержит настройки защиты конкретных сервисов, в том числе sshd.

Файл jail.conf поделён на секции, так называемые «изоляторы» (jails), каждая секция отвечает за определённый сервис и тип атаки:

-----------------------------------------------------------------
[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:

-----------------------------------------------------------------
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:

-----------------------------------------------------------------
Не рекомендуется оставлять параметр ignoreip со значением по умолчанию 127.0.0.1/8, 
это создаёт очевидную угрозу в многопользовательских системах — если злоумышленник 
получил доступ хотя–бы к одному shell–аккаунту, то он имеет возможность беспрепятственно 
запустить bruteforce–программу для атаки на root или других пользователей прямо с этого–же сервера.
-----------------------------------------------------------------
Прежде чем вносить изменения следуя рекомендациям, отметим, что не стоит редактировать основной файл настроек jail.conf, 
для этого предусмотрены файлы с расширением *.local, которые автоматически подключаются и имеют высший приоритет.
-----------------------------------------------------------------

Дополнительно:

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:

[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

Проверка работы фильтра:

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):

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):

cat /var/log/fail2ban.log - показать содержимое лог файла 
tail -f /var/log/fail2ban.log - наблюдать за файлом 
fail2ban-client status - посмотреть статус fail2ban
fail2ban-client status NAME_JAIL  - посмотреть статус NAME_JAIL

Список забаненных:

cat /var/log/fail2ban.log |grep Ban

Ручной бан:

fail2ban-client set [name-of-jail] banip [ip-address] - ручной бан
fail2ban-client set NAME_JAIL banip 1.1.1.1 - ручной бан

Разбан:

fail2ban-client set NAME_JAIL unbanip 1.1.1.1 - разбанить

Пример разбана:

Первый вариант удаляем из 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

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

Свой фильтр:

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 
# 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 
-----------------------------------------------------------------