Поиск по сайту:

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


Введение

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

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

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

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

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

Предпосылки

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

  • Сервер Rocky Linux 9 и пользователь без полномочий root с привилегиями sudo. Вы можете узнать больше о том, как настроить пользователя с этими привилегиями, в нашем руководстве Initial Server Setup with Rocky Linux 9. У вас также должен быть запущен firewalld на сервере, что описано в нашем руководстве по первоначальной настройке сервера.
  • При желании второй сервер, с которого вы можете подключиться к вашему первому серверу, который вы будете использовать для проверки намеренного бана.

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

Fail2ban недоступен в стандартных репозиториях программного обеспечения Rocky. Однако он доступен в репозитории EPEL или Enhanced Packages for 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
# # 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:

  1. sudo cp jail.conf jail.local

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

  1. sudo vi 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 устанавливает значение поля \From в электронном письме. Параметр 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. Он должен быть в верхней части индивидуальных настроек джейла. В противном случае параметры по умолчанию будут работать, но вам нужно будет добавить строку конфигурации с надписью enabled=true под заголовком [sshd].

#
# JAILS
#

#
# SSH servers
#

[sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#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:

. . .
[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 Wed 2022-09-14 20:48:40 UTC; 2s 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 Sep 14 20:48:40 rocky9-tester systemd[1]: Starting Fail2Ban Service... Sep 14 20:48:40 rocky9-tester systemd[1]: Started Fail2Ban Service. Sep 14 20:48:41 rocky9-tester fail2ban-server[39396]: Server ready

На следующем этапе вы продемонстрируете Fail2ban в действии.

Шаг 3 — Тестирование политик запрета (необязательно)

С другого сервера, которому в будущем не нужно будет входить на ваш сервер Fail2ban, вы можете проверить правила, заблокировав этот второй сервер. После входа на второй сервер попробуйте подключиться по SSH к серверу Fail2ban. Вы можете попробовать подключиться, используя несуществующее имя:

  1. ssh blah@your_server

Введите случайные символы в запрос пароля. Повторите это несколько раз. В какой-то момент сообщение об ошибке должно измениться с Отказано в доступе на Отказано в подключении. Это сигнализирует о том, что ваш второй сервер был забанен на сервере 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.