Введение
SSH является фактическим методом подключения к облачному серверу. Он надежен и расширяем: с разработкой новых стандартов шифрования можно создавать новые ключи SSH, что обеспечивает безопасность основного протокола. Однако ни один протокол или стек программного обеспечения не является абсолютно надежным, и то, что SSH настолько широко развернут в интернете, означает, что он представляет собой очень предсказуемую поверхность атаки или вектор атаки, через который люди могут пытаться получить доступ.
Любая служба, которая доступна в сети, потенциально может быть целью атаки таким образом. Если вы проанализируете журналы вашей службы SSH, работающей на широко используемом сервере, вы часто увидите повторяющиеся систематические попытки входа, представляющие собой атаки методом грубой силы как со стороны пользователей, так и со стороны ботов. Хотя вы можете сделать некоторые оптимизации для вашей службы SSH, чтобы снизить вероятность успешных атак почти до нуля, например, отключение аутентификации по паролю в пользу ключей SSH, они все равно могут представлять собой небольшую, непрерывную уязвимость.
Крупномасштабные производственные развертывания, для которых эта ответственность совершенно неприемлема, обычно реализуют VPN, такой как WireGuard, перед своим службой SSH, чтобы было невозможно подключиться напрямую к стандартному порту SSH 22 извне Интернета без дополнительной абстракции программного обеспечения или шлюзов. Эти решения VPN широко доверяются, но добавляют сложности и могут нарушить некоторые автоматизации или другие небольшие программные крючки.
Перед тем как полностью перейти к настройке VPN, вы можете реализовать инструмент под названием Fail2ban. Fail2ban может значительно смягчить атаки методом перебора паролей, создавая правила, которые автоматически изменяют конфигурацию вашего брандмауэра, чтобы заблокировать определенные IP-адреса после определенного числа неудачных попыток входа в систему. Это позволит вашему серверу укрепиться против этих попыток доступа без вашего вмешательства.
В этом руководстве вы увидите, как установить и использовать Fail2ban на сервере Debian 11.
Предварительные требования
Для выполнения этого руководства вам понадобится:
-
Сервер Debian 11 и обычный пользователь с правами sudo. Вы можете узнать больше о том, как настроить пользователя с этими правами, в нашем руководстве Начальная настройка сервера с Debian 11.
-
По желанию, второй сервер, к которому вы можете подключиться с вашего первого сервера, который вы будете использовать для тестирования намеренной блокировки.
Шаг 1 — Установка Fail2ban
Fail2ban доступен в репозиториях программного обеспечения Debian. Для начала выполните следующие команды от имени обычного пользователя, чтобы обновить списки пакетов и установить Fail2ban:
После установки Fail2ban автоматически настраивает фоновый сервис. Вы можете проверить его статус, используя команду systemctl
:
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled
Active: active (running) since Tue 2022-06-28 16:23:14 UTC; 17s ago
Docs: man:fail2ban(1)
Process: 1942 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS
Main PID: 1943 (fail2ban-server)
Tasks: 5 (limit: 1132)
Memory: 15.8M
CPU: 280ms
CGroup: /system.slice/fail2ban.service
└─1943 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Вы можете продолжить использовать Fail2ban с его настройками по умолчанию, но сначала вы рассмотрите некоторые из его функций.
Шаг 2 – Настройка Fail2ban
Служба fail2ban хранит свои файлы конфигурации в каталоге /etc/fail2ban
. Там есть файл с настройками по умолчанию под названием jail.conf
. Перейдите в этот каталог и выведите первые 20 строк этого файла, используя команду head -20
:
Output#
# ПРЕДУПРЕЖДЕНИЕ: значительно переработано в релизе 0.9.0. Пожалуйста, просмотрите и
# настройте параметры под свою конфигурацию.
#
# Изменения: в большинстве случаев вам не следует изменять этот
# файл, а предоставлять настройки в файле jail.local,
# или в отдельных .conf файлах в каталоге jail.d/, например:
#
# КАК АКТИВИРОВАТЬ ТЮРЬМЫ:
#
# ВЫ НЕ ДОЛЖНЫ ИЗМЕНЯТЬ ЭТОТ ФАЙЛ.
#
# Вероятно, он будет перезаписан или улучшен при обновлении дистрибутива.
#
# Предоставьте настройки в файле jail.local или в jail.d/customisation.local.
# Например, чтобы изменить время блокировки по умолчанию для всех тюрем и включить
# тюрьму ssh-iptables, следующее (раскомментированное) должно появиться в .local файле.
# См. man 5 jail.conf для дополнительной информации.
#
# [DEFAULT]
Как видно, первые несколько строк этого файла закомментированы – они начинаются с символов #
, указывающих, что они должны читаться как документация, а не как настройки. Как вы также увидите, эти комментарии указывают вам не изменять этот файл напрямую. Вместо этого у вас есть два варианта: либо создать отдельные профили для Fail2ban в нескольких файлах в каталоге jail.d/
, либо создать и собрать все ваши локальные настройки в файле jail.local
. Файл jail.conf
будет периодически обновляться при обновлении самого Fail2ban и будет использоваться в качестве источника настроек по умолчанию, для которых вы не создали никаких переопределений.
В этом руководстве вы создадите файл jail.local
. Для этого скопируйте файл jail.conf
:
Теперь вы можете приступить к внесению изменений в конфигурацию. Откройте файл в nano
или вашем любимом текстовом редакторе:
Пока вы прокручиваете файл, это руководство рассмотрит некоторые параметры, которые вы можете захотеть обновить. Настройки, находящиеся в разделе [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_)
выше:
…
# заблокировать и отправить электронное письмо с отчетом whois на destemail.
action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
# заблокировать и отправить электронное письмо с отчетом whois и соответствующими строками журнала
# на destemail.
action_mwl = %(action_)s
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
# См. ВАЖНУЮ заметку в action.d/xarf-login-attack о том, когда использовать это действие
#
# заблокировать и отправить электронное письмо xarf контакту по адресу IP и включить соответствующие строки журнала
# на destemail.
action_xarf = %(action_)s
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
# заблокировать IP на CloudFlare и отправить электронное письмо с отчетом whois и соответствующими строками журнала
# на 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
, который будет использоваться для определения, является ли строка в журнале неудачной попыткой аутентификации, и logpath
, который сообщает fail2ban, где находятся журналы для этой конкретной службы.
Значение filter
на самом деле является ссылкой на файл, расположенный в каталоге /etc/fail2ban/filter.d
, с удаленным расширением .conf
. Эти файлы содержат регулярные выражения (общий сокращенный вариант для разбора текста), которые определяют, является ли строка в журнале неудачной попыткой аутентификации. Мы не будем подробно рассматривать эти файлы в этом руководстве, потому что они довольно сложны, и предопределенные настройки хорошо соответствуют соответствующим строкам.
Однако вы можете увидеть, какие фильтры доступны, посмотрев в этот каталог:
Если вы видите файл, который кажется связанным с используемой вами службой, вы должны открыть его с помощью текстового редактора. Большинство файлов довольно хорошо прокомментированы, и вы должны хотя бы понять, какого типа условие предназначено для защиты. Большинство этих фильтров имеют соответствующие (отключенные) разделы в файле jail.conf
, которые мы можем включить в файле jail.local
, если это необходимо.
Например, представьте себе, что вы обслуживаете веб-сайт с использованием Nginx и понимаете, что защищенная паролем часть вашего сайта получает множество попыток входа. Вы можете сказать fail2ban использовать файл nginx-http-auth.conf
для проверки этого условия в файле /var/log/nginx/error.log
.
Это на самом деле уже настроено в разделе под названием [nginx-http-auth]
в вашем файле /etc/fail2ban/jail.conf
. Вам просто нужно добавить параметр enabled
:
. . .
[nginx-http-auth]
enabled = true
. . .
Когда вы закончите редактирование, сохраните и закройте файл. Если вы внесли какие-либо изменения, вы можете перезапустить службу Fail2ban, используя systemctl
:
На следующем этапе вы продемонстрируете работу Fail2ban.
Шаг 3 — Проверка политик блокировки (необязательно)
С другого сервера, который не потребуется для входа на ваш Fail2ban сервер в будущем, вы можете проверить правила, забанив этот второй сервер. После входа на ваш второй сервер, попробуйте подключиться к Fail2ban серверу через SSH. Вы можете попробовать подключиться, используя несуществующее имя:
Введите случайные символы в окно запроса пароля. Повторите это несколько раз. В какой-то момент ошибка, которую вы получаете, должна измениться с Permission denied
на Connection refused
. Это сигнализирует о том, что ваш второй сервер был заблокирован на Fail2ban сервере.
На вашем Fail2ban сервере вы можете увидеть новое правило, проверив вывод вашей команды iptables
. iptables
— это команда для взаимодействия с низкоуровневыми портами и правилами брандмауэра на вашем сервере. Если вы следовали руководству DigitalOcean по начальной настройке сервера, вы будете использовать ufw
для управления правилами брандмауэра на более высоком уровне. Запуск команды iptables -S
покажет вам все правила брандмауэра, которые уже создал ufw
:
Output-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N f2b-sshd
-N ufw-after-forward
-N ufw-after-input
-N ufw-after-logging-forward
-N ufw-after-logging-input
-N ufw-after-logging-output
-N ufw-after-output
-N ufw-before-forward
-N ufw-before-input
-N ufw-before-logging-forward
-N ufw-before-logging-input
-N ufw-before-logging-output
…
Если вы направите вывод команды iptables -S
на grep
, чтобы искать строки с f2b
в этих правилах, вы сможете увидеть правила, добавленные fail2ban:
Output-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -j RETURN
Строка, содержащая REJECT --reject-with icmp-port-unreachable
, будет добавлена fail2ban и должна отражать IP-адрес вашего второго сервера.
Вывод
Теперь вы должны иметь возможность настроить некоторые политики блокировки для ваших служб. Fail2ban – это полезный способ защиты любого вида служб, использующих аутентификацию. Если вы хотите узнать больше о том, как работает fail2ban, вы можете посмотреть наш учебник о том, как работают правила и файлы fail2ban.
Для получения информации о том, как использовать fail2ban для защиты других служб, вы можете прочитать о Как защитить сервер Nginx с помощью Fail2Ban и Как защитить сервер Apache с помощью Fail2Ban.
Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-debian-11