защита_ssh_с_помощью_fail2ban

Защита SSH с помощью Fail2Ban в Ubuntu 22.04

Fail2ban доступен в репозиториях программного обеспечения Ubuntu:

sudo apt update
sudo apt install fail2ban

После установки Fail2ban, автоматически будет создана фоновая служба. Однако по умолчанию она отключена, поскольку некоторые ее настройки по умолчанию могут вызвать нежелательные эффекты. Мы можем проверить это с помощью команды systemctl:

systemctl status fail2ban.service
 
○ fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enable>
     Active: inactive (dead)
       Docs: man:fail2ban(1)

Служба fail2ban хранит свои конфигурационные файлы в каталоге /etc/fail2ban. Там есть файл с настройками по умолчанию – jail.conf. Распечатаем первые 20 строк этого файла:

head -20 /etc/fail2ban/jail.conf
 
#
# WARNING: heavily refactored in 0.9.0 release.  Please review and
#          customize settings for your setup.
#
# Changes:  in most of the cases you should not modify this
#           file, but provide customizations in jail.local file,
#           or separate .conf files under jail.d/ directory, e.g.:
#
# HOW TO ACTIVATE JAILS:
#
# YOU SHOULD NOT MODIFY THIS FILE.
#
# It will probably be overwritten or improved in a distribution update.
#
# Provide customizations in a jail.local file or a jail.d/customisation.local.
# For example to change the default bantime for all jails and to enable the
# ssh-iptables jail the following (uncommented) would appear in the .local file.
# See man 5 jail.conf for details.
#
# [DEFAULT]

Как мы видим, первые несколько строк этого файла закомментированы – они указывают на то, что их следует читать как документацию, а не как настройки. Эти комментарии указывают нам не изменять этот файл напрямую. Вместо этого у нас есть два варианта: либо создать отдельные профили для Fail2ban в нескольких файлах в каталоге jail.d/, либо создать и собрать все ваши локальные настройки в файле jail.local. Файл jail.conf будет периодически обновляться по мере обновления самого Fail2ban и будет использоваться как источник настроек по умолчанию, для которых мы не создали никаких переопределений.

В этом руководстве мы создадим jail.local. Это можно сделать, скопировав jail.conf:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Далее, приступим к редактированию /etc/fail2ban/jail.local. Рассмотрим некоторые параметры. Настройки, расположенные в разделе [DEFAULT] в верхней части файла, будут применяться ко всем службам, поддерживаемым Fail2ban. В других местах файла есть заголовки для [sshd] и для других сервисов, содержащие специфические для конкретного сервиса настройки, которые будут применяться поверх настроек по умолчанию.

[DEFAULT]
[...]
bantime = 10m
[...]

Параметр bantime задает период времени, в течение которого клиент будет заблокирован, если ему не удалось правильно пройти аутентификацию. Это измеряется в секундах. По умолчанию установлено значение 10 минут.

[DEFAULT]
[...]
findtime = 10m
maxretry = 5
[...]

Следующие два параметра – findtime и maxretry. Они работают вместе, чтобы установить условие, при котором клиент, оказавшийся незаконным пользователем, должен быть забанен.

Переменная maxretry устанавливает количество попыток аутентификации клиента в течение окна времени, определяемого параметром findtime, прежде чем он будет заблокирован. С настройками по умолчанию, служба fail2ban забанит клиента, который безуспешно пытается войти в систему 5 раз в течение 10 минут.

[DEFAULT]
[...]
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
[...]

Если, нам нужно получать оповещения по электронной почте, когда Fail2ban предпринимает действия, то следует присмотреться к настройкам: destemail, sendername и mta. Параметр destemail задает адрес электронной почты, на который должны приходить сообщения о бане. Имя отправителя устанавливает значение sendername поля «От» в электронном письме. Параметр mta настраивает, какой почтовый сервис будет использоваться для отправки почты. По умолчанию это sendmail, но вы можете использовать Postfix или другое почтовое решение.

[DEFAULT]
[...]
action = $(action_)s
[...]

Этот параметр настраивает действие, которое Fail2ban предпринимает, когда хочет ввести запрет. Значение action_ определено в файле непосредственно перед этим параметром. Действие по умолчанию заключается в обновлении конфигурации брандмауэра, чтобы отклонить трафик от хоста-нарушителя до истечения времени запрета.

Существуют и другие action_ сценарии, предустановленные по умолчанию, которыми мы можем заменить приведенными выше $(action_):

[...]
# ban & send an e-mail with whois report to the destemail.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
 
# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
 
# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
#
# ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
# to the destemail.
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
 
# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
# to the destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
[...]

Где:

  • action_mw – принимает меры и отправляет электронное письмо;
  • action_mwl – принимает меры, отправляет электронное письмо и включает ведение журнала;
  • action_cf_mwl – в дополнение ко вышеперечисленному, отправляет обновления в API Cloudflare, связанный с нашей учетной записью, чтобы запретить нарушителя и там.

Далее, следует часть файла конфигурации, относящаяся к отдельным службам. Они указаны в заголовках разделов, например [sshd].

Каждый из этих разделов, включается отдельно, добавлением строки – enabled = true под шапкой, с другими настройками.

[jail_to_enable]
[...]
enabled = true
[...]

По умолчанию, все службы отключены, кроме ssh. Некоторые другие параметры, устанавливаемые здесь – это filter. filter используется для определения того, указывает ли строка в журнале на неудачную аутентификацию, и logpath, который указывает fail2ban, где находятся журналы для данной службы.

Значение filter фактически является ссылкой на файлы, расположенный в директории /etc/fail2ban/filter.d, с расширением .conf. Эти файлы содержат регулярные выражения, которые определяют, является ли строка в журнале неудачной попыткой аутентификации.

Для примера, предположим, что мы обслуживаем web-сервер Nginx. На сервере есть сайт, часть которого защищенная паролем, и эта часть подвергается несанкционированным попытками входа. Мы можем указать fail2ban использовать конфигуратор nginx-http-auth.conf для проверки этого условия в логе /var/log/nginx/error.log.

На самом деле, этот функционал уже настроен, в секции [nginx-http-auth] в нашем /etc/fail2ban/jail.conf. Нужно просто добавить параметр enabled:

[...]
[nginx-http-auth]
 
enabled = true
[...]

После внесения изменений, добавляем сервис в автозагрузку и запускаем:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Попробуем забанить хост, подключающийся по ssh с неверным логином:

ssh blah@your_server

Вводим случайные символы в запрос пароля. Повторите это несколько раз. В какой-то момент, сообщение об ошибке должно измениться с Permission denied на Connection refused. Это сигнализирует о том, что хост, с которого велись попытки подключения, был забанен Fail2ban-ом.

На хосте с Fail2ban-ом, мы можем увидеть новое правило, проверив вывод iptables:

sudo iptables -S
 
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A f2b-sshd -s 10.10.10.37/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -j RETURN

Либо, для упрощения поиска используем команду:

sudo iptables -S | grep f2b

Подробнее, о том как просматривать и удалять заблокированные адреса, можно прочесть здесь.

  • защита_ssh_с_помощью_fail2ban.txt
  • Последнее изменение: 2022/10/13 14:11
  • admin