Введение
SSH – это фактический метод подключения к облачному серверу. Он надежен и расширяем, поскольку с разработкой новых стандартов шифрования можно использовать их для создания новых ключей SSH, обеспечивая сохранение безопасности основного протокола. Однако ни один протокол или стек программного обеспечения не является абсолютно непроницаемым, а то, что SSH настолько широко развернут в интернете, означает, что он представляет собой очень предсказуемую поверхность атаки или вектор атаки, через который люди могут пытаться получить доступ.
Любой сервис, который выставлен в сеть, потенциально подвержен таким атакам. Если вы просмотрите журналы своего службы SSH, работающей на любом широко используемом сервере, вы часто увидите повторяющиеся, систематические попытки входа, представляющие собой атаки методом перебора паролей как со стороны пользователей, так и со стороны ботов. Хотя вы можете сделать некоторые оптимизации для вашего службы SSH, чтобы уменьшить вероятность успешных атак практически до нуля, например, отключив аутентификацию по паролю в пользу ключей SSH, они все равно могут представлять собой небольшую, но продолжающуюся уязвимость.
Масштабные развертывания, для которых такая ответственность абсолютно неприемлема, обычно используют VPN, такой как WireGuard, перед своим службой SSH, чтобы невозможно было подключиться напрямую к стандартному порту SSH 22 извне интернета без дополнительной абстракции программного обеспечения или шлюзов. Эти решения VPN широко доверяются, но добавляют сложности и могут нарушить некоторые автоматизации или другие небольшие программные хуки.
Перед тем как полностью внедрить настройку VPN, вы можете использовать инструмент под названием Fail2ban. Fail2ban может значительно смягчить атаки методом перебора паролей, создавая правила, которые автоматически изменяют конфигурацию вашего брандмауэра, чтобы блокировать определенные IP-адреса после определенного количества неудачных попыток входа. Это позволит вашему серверу укрепиться против этих попыток доступа без вашего вмешательства.
В этом руководстве вы узнаете, как установить и использовать Fail2ban на сервере Ubuntu 20.04.
Предварительные требования
Для выполнения этого руководства вам понадобится:
-
Сервер Ubuntu 20.04 и не-root пользователь с правами sudo. Вы можете узнать больше о том, как настроить пользователя с этими привилегиями, в нашем руководстве Начальная настройка сервера с Ubuntu 20.04.
-
По желанию, второй сервер, к которому вы можете подключиться с первого сервера, который вы будете использовать для тестирования намеренного блокирования.
Шаг 1 — Установка Fail2ban
Fail2ban доступен в репозиториях программного обеспечения Ubuntu. Начните с выполнения следующих команд от имени обычного пользователя, чтобы обновить список пакетов и установить 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/, например:
#
# КАК АКТИВИРОВАТЬ JAILS:
#
# ВЫ НЕ ДОЛЖНЫ ИЗМЕНЯТЬ ЭТОТ ФАЙЛ.
#
# Возможно, его перезапишут или улучшат в обновлении дистрибутива.
#
# Предоставьте настройки в файле jail.local или jail.d/customisation.local.
# Например, чтобы изменить значение по умолчанию для всех jails и включить
# jail 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 на адрес назначения.
action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
# Запретить и отправить электронное письмо с отчетом whois и соответствующими строками журнала
# на адрес назначения.
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-адресом и включить соответствующие строки журнала
# на адрес назначения.
action_xarf = %(action_)s
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
# Запретить IP на CloudFlare и отправить электронное письмо с отчетом whois и соответствующими строками журнала
# на адрес назначения.
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 включена, а все остальные отключены.
.
Некоторые другие параметры, установленные здесь, – это фильтр
, который будет использоваться для определения, является ли строка в журнале признаком неудачной аутентификации, и logpath
, который сообщает fail2ban, где находятся журналы для этой конкретной службы.
Значение фильтра
фактически является ссылкой на файл, расположенный в каталоге /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 Tue 2022-06-28 19:29: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 28 19:29:15 fail2ban20 systemd[1]: Started Fail2Ban Service.
Jun 28 19:29:15 fail2ban20 fail2ban-server[39396]: Server ready
На следующем этапе вы продемонстрируете действие Fail2ban.
Шаг 3 — Проверка политик блокировки (необязательно)
С другого сервера, который в будущем не будет нуждаться в входе на ваш сервер Fail2ban, вы можете протестировать правила, чтобы этот второй сервер был заблокирован. После входа на ваш второй сервер, попробуйте подключиться по SSH к серверу Fail2ban. Вы можете попытаться подключиться, используя несуществующее имя:
Введите случайные символы в поле запроса пароля. Повторите это несколько раз. В какой-то момент ошибка, которую вы получаете, должна измениться с 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 на Ubuntu 14.04 и Как защитить сервер Apache с помощью Fail2Ban на Ubuntu 14.04.
Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-20-04