Введение
SSH является фактическим методом подключения к облачному серверу. Он надежен и расширяем: по мере разработки новых стандартов шифрования они могут использоваться для создания новых ключей SSH, обеспечивая безопасность основного протокола. Однако ни один протокол или программный стек не является абсолютно непроницаемым, и SSH, так широко развернутый в интернете, означает, что он представляет очень предсказуемую поверхность атаки или вектор атаки, через который люди могут пытаться получить доступ.
Любая служба, доступная из сети, может быть потенциальной целью такого рода атак. Если вы изучите журналы вашей службы SSH, работающей на любом широко посещаемом сервере, вы часто увидите повторяющиеся систематические попытки входа, которые представляют собой атаки методом перебора пользователей и ботов. Хотя вы можете внести некоторые оптимизации в вашу службу SSH, чтобы снизить вероятность успеха таких атак практически до нуля, например, отключив аутентификацию по паролю в пользу ключей SSH, они все равно могут представлять небольшую, постоянную уязвимость.
Производственные развертывания крупного масштаба, для которых это неприемлемо, обычно реализуют VPN, такой как WireGuard, перед своим службой SSH, чтобы нельзя было подключиться напрямую к стандартному порту SSH 22 извне интернета без дополнительной абстракции программного обеспечения или шлюзов. Эти решения VPN широко доверяются, но добавляют сложности и могут нарушить некоторые автоматизации или другие мелкие программные связки.
Перед тем как полностью переходить к настройке полного VPN, можно применить инструмент под названием Fail2ban. Fail2ban может значительно смягчить атаки методом перебора путем создания правил, которые автоматически изменяют конфигурацию вашего брандмауэра, чтобы заблокировать определенные IP-адреса после определенного количества неудачных попыток входа. Это позволит вашему серверу укрепить защиту от таких попыток доступа без вашего вмешательства.
В этом руководстве вы увидите, как установить и использовать Fail2ban на сервере Ubuntu 22.04.
Предварительные условия
Для выполнения этого руководства вам понадобится:
-
Сервер с Ubuntu 22.04 и пользователь с правами sudo, не являющийся root. Вы можете узнать больше о том, как создать пользователя с этими правами, в нашем руководстве по Начальной настройке сервера с Ubuntu 22.04.
-
По желанию, второй сервер, к которому вы можете подключиться с вашего первого сервера, который вы будете использовать для тестирования намеренного запрещения.
Шаг 1 — Установка Fail2ban
Fail2ban доступен в репозиториях программного обеспечения Ubuntu. Начните с выполнения следующих команд от имени пользователя без прав root для обновления списков пакетов и установки Fail2ban:
Fail2ban автоматически настраивает фоновый сервис после установки. Однако он отключен по умолчанию, потому что некоторые из его настроек по умолчанию могут вызывать нежелательные эффекты. Вы можете проверить это, используя команду systemctl
:
Output○ fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled
Active: inactive (dead)
Docs: man:fail2ban(1)
Вы могли бы сразу включить 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-письмо на контакт abuse по 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 enable
:
Затем запустите ее вручную в первый раз с помощью systemctl start
:
Вы можете проверить, что служба запущена, с помощью systemctl status
:
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>
Active: active (running) since Mon 2022-06-27 19:25:15 UTC; 3s ago
Docs: man:fail2ban(1)
Main PID: 39396 (fail2ban-server)
Tasks: 5 (limit: 1119)
Memory: 12.9M
CPU: 278ms
CGroup: /system.slice/fail2ban.service
└─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service.
Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready
В следующем шаге вы продемонстрируете работу Fail2ban.
Шаг 3 — Проверка политик блокировки (Необязательно)
С другого сервера, который в будущем не потребуется входить на ваш сервер Fail2ban, вы можете протестировать правила, чтобы заблокировать этот второй сервер. После входа на ваш второй сервер попробуйте выполнить SSH-подключение к серверу Fail2ban. Вы можете попробовать подключиться, используя несуществующее имя:
Введите случайные символы в окно запроса пароля. Повторите это несколько раз. В какой-то момент ошибка, которую вы получаете, должна измениться с Отказано в доступе
на Соединение отклонено
. Это сигнализирует о том, что ваш второй сервер был заблокирован сервером 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 на Ubuntu 14.04 и Как защитить сервер Apache с помощью Fail2Ban на Ubuntu 14.04.
Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-22-04