Как защитить SSH с помощью Fail2Ban на Rocky Linux 8

Введение

SSH является фактическим методом подключения к облачному серверу. Он надежен и расширяем — с разработкой новых стандартов шифрования можно создавать новые SSH-ключи, обеспечивая безопасность основного протокола. Однако ни один протокол или программный стек не является абсолютно надежным, и поскольку SSH настолько широко распространен в Интернете, это представляет очень предсказуемую поверхность атаки или вектор атаки, через который люди могут попытаться получить доступ.

Любая служба, которая подвергается воздействию сети, может стать потенциальной целью таким образом. Если вы изучите журналы для вашей службы SSH, работающей на любом сервере с большим трафиком, вы часто увидите повторяющиеся, систематические попытки входа, представляющие собой атаки методом перебора паролей как со стороны пользователей, так и со стороны ботов. Хотя вы можете внести некоторые оптимизации в свою службу SSH, чтобы уменьшить вероятность успеха таких атак практически до нуля, например, отключение аутентификации по паролю в пользу SSH-ключей, они все равно могут представлять небольшую постоянную уязвимость.

Распространенные развертывания крупномасштабных производств, для которых это ответственное обязательство совершенно неприемлемо, обычно реализуют VPN, такой как WireGuard перед своим службой SSH, чтобы невозможно было подключиться напрямую к стандартному порту SSH 22 извне Интернета без дополнительной абстракции программного обеспечения или шлюзов. Эти решения VPN широко доверяются, но добавляют сложности и могут нарушить некоторые автоматизации или другие малые программные инструменты.

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

В этом руководстве вы увидите, как установить и использовать Fail2ban на сервере Rocky Linux 8.

Предварительные требования

Для выполнения этого руководства вам понадобятся:

  • Сервер Rocky Linux 8 и обычный пользователь с привилегиями sudo. Вы можете узнать больше о том, как настроить пользователя с этими привилегиями, в нашем руководстве Начальная настройка сервера с Rocky Linux 8. Также у вас должен быть firewalld, работающий на сервере, о чем говорится в нашем руководстве по начальной настройке сервера.

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

Шаг 1 — Установка Fail2ban

Fail2ban не доступен в стандартных репозиториях Rocky. Однако он доступен в репозитории EPEL, или Расширенные пакеты для Enterprise Linux, который обычно используется для сторонних пакетов в Red Hat и Rocky Linux. Если вы еще не добавили EPEL в источники пакетов вашей системы, вы можете добавить репозиторий, используя dnf, так же, как вы бы установили любой другой пакет:

  1. sudo dnf install epel-release -y

Теперь менеджер пакетов dnf будет проверять EPEL в дополнение к вашим стандартным источникам пакетов при установке нового программного обеспечения. Продолжайте устанавливать Fail2ban:

  1. sudo dnf install fail2ban -y

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

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

Вы можете сразу включить Fail2ban, но сначала вы рассмотрите некоторые из его функций.

Шаг 2 – Настройка Fail2ban

Сервис fail2ban хранит свои файлы конфигурации в каталоге /etc/fail2ban. Существует файл с настройками по умолчанию, называемый jail.conf. Перейдите в этот каталог и напечатайте первые 20 строк этого файла, используя head -20:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
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:

  1. sudo cp jail.conf jail.local

Теперь вы можете начать вносить изменения в конфигурацию. Откройте файл в vi или вашем любимом текстовом редакторе:

  1. sudo vi jail.local

Пока вы просматриваете файл, в этом учебнике будут рассмотрены некоторые параметры, которые вы можете захотеть обновить. Настройки, расположенные в разделе [DEFAULT] в верхней части файла, будут применяться ко всем сервисам, поддерживаемым Fail2ban. В других местах файла есть заголовки для [sshd] и для других служб, которые содержат специфические для службы настройки, которые будут применяться поверх стандартных.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 10m
. . .

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

/etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

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

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

/etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

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

/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = $(action_)s
. . .

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

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

/etc/fail2ban/jail.local
…
# блокировка и отправка электронного сообщения с отчетом 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 под заголовком со своими другими настройками.

/etc/fail2ban/jail.local
[jail_to_enable]
. . .
enabled = true
. . .

Для этого урока вы включите тюрьму SSH. Она должна быть вверху индивидуальных настроек тюрьмы. В противном случае, параметры по умолчанию будут работать, но вам нужно добавить строку конфигурации, которая говорит enabled = true под заголовком [sshd].

/etc/fail2ban/jail.local
#
# JAILS
#

#
# Серверы SSH
#

[sshd]

# Для использования более агрессивных режимов sshd установите параметр фильтра "mode" в jail.local:
# нормальный (по умолчанию), ddos, extra или aggressive (комбинирует все).
# См. "tests/files/logs/sshd" или "filter.d/sshd.conf" для примера использования и подробностей.
#mode   = normal
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

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

Значение filter на самом деле является ссылкой на файл, расположенный в каталоге /etc/fail2ban/filter.d, с удаленным расширением .conf. Эти файлы содержат регулярные выражения (общепринятая аббревиатура для анализа текста), которые определяют, является ли строка в журнале попыткой неудачной аутентификации. Мы не будем подробно рассматривать эти файлы в данном руководстве, потому что они довольно сложны, и предопределенные настройки хорошо соответствуют соответствующим строкам.

Однако вы можете увидеть, какие фильтры доступны, посмотрев в этот каталог:

  1. ls /etc/fail2ban/filter.d

Если вы увидите файл, который кажется связанным с используемой вами службой, вы можете открыть его с помощью текстового редактора. Большинство файлов хорошо прокомментированы, и вы должны хотя бы понять, какой тип условия предназначен для защиты сценария. Большинство этих фильтров имеют соответствующие (отключенные) разделы в файле jail.conf, которые мы можем включить в файле jail.local, если это необходимо.

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

Это уже настроено в разделе [nginx-http-auth] вашего файла /etc/fail2ban/jail.conf. Вам просто нужно добавить параметр enabled:

/etc/fail2ban/jail.local
. . .
[nginx-http-auth]

enabled = true
. . .

Когда вы закончите редактирование, сохраните и закройте файл. Если вы используете vi, используйте :x для сохранения и выхода. На этом этапе вы можете включить службу Fail2ban, чтобы она автоматически запускалась в дальнейшем. Сначала выполните systemctl enable:

  1. sudo systemctl enable fail2ban

Затем запустите ее вручную в первый раз с помощью systemctl start:

  1. sudo systemctl start fail2ban

Вы можете проверить, что она работает, с помощью systemctl status:

  1. sudo systemctl status fail2ban
Output
● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled 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.6 -s /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, вы можете проверить правила, заблокировав этот второй сервер. После входа на второй сервер попробуйте подключиться к серверу Fail2ban по SSH. Вы можете попытаться подключиться, используя несуществующее имя:

  1. ssh blah@your_server

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

На вашем сервере Fail2ban вы можете увидеть новое правило, проверив вывод команды fail2ban-client. fail2ban-client – это дополнительная команда, предоставляемая Fail2ban для проверки его текущей конфигурации.

  1. sudo fail2ban-client status
Output
Status |- Number of jail: 1 `- Jail list: sshd

Если вы выполните fail2ban-client status sshd, вы увидите список IP-адресов, которые были заблокированы для SSH:

  1. sudo fail2ban-client status sshd
Output
Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 7 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 134.209.165.184

Содержимое списка заблокированных IP-адресов должно отражать IP-адрес вашего второго сервера.

Вывод

Теперь вы должны иметь возможность настроить некоторые политики блокировки для ваших сервисов. Fail2ban – полезный способ защиты любого вида служб, использующих аутентификацию. Если вы хотите узнать больше о том, как работает fail2ban, вы можете ознакомиться с нашим учебным пособием по правилам и файлам fail2ban.

Для получения информации о том, как использовать fail2ban для защиты других служб, вы можете прочитать о Как защитить сервер Nginx с помощью Fail2Ban и Как защитить сервер Apache с помощью Fail2Ban.

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-rocky-linux-8