Введение
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
, так же, как вы бы установили любой другой пакет:
Теперь менеджер пакетов dnf
будет проверять EPEL в дополнение к вашим стандартным источникам пакетов при установке нового программного обеспечения. Продолжайте устанавливать Fail2ban:
Fail2ban будет автоматически устанавливать фоновый сервис после установки. Однако он отключен по умолчанию, потому что некоторые из его настроек по умолчанию могут вызвать нежелательные эффекты. Вы можете проверить это, используя команду systemctl
:
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
:
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
:
Теперь вы можете начать вносить изменения в конфигурацию. Откройте файл в vi
или вашем любимом текстовом редакторе:
Пока вы просматриваете файл, в этом учебнике будут рассмотрены некоторые параметры, которые вы можете захотеть обновить. Настройки, расположенные в разделе [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. Она должна быть вверху индивидуальных настроек тюрьмы. В противном случае, параметры по умолчанию будут работать, но вам нужно добавить строку конфигурации, которая говорит enabled = true
под заголовком [sshd]
.
#
# 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
. Эти файлы содержат регулярные выражения (общепринятая аббревиатура для анализа текста), которые определяют, является ли строка в журнале попыткой неудачной аутентификации. Мы не будем подробно рассматривать эти файлы в данном руководстве, потому что они довольно сложны, и предопределенные настройки хорошо соответствуют соответствующим строкам.
Однако вы можете увидеть, какие фильтры доступны, посмотрев в этот каталог:
Если вы увидите файл, который кажется связанным с используемой вами службой, вы можете открыть его с помощью текстового редактора. Большинство файлов хорошо прокомментированы, и вы должны хотя бы понять, какой тип условия предназначен для защиты сценария. Большинство этих фильтров имеют соответствующие (отключенные) разделы в файле 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
:
Затем запустите ее вручную в первый раз с помощью systemctl start
:
Вы можете проверить, что она работает, с помощью systemctl status
:
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. Вы можете попытаться подключиться, используя несуществующее имя:
Введите случайные символы в окне запроса пароля. Повторите это несколько раз. В какой-то момент ошибка, которую вы получаете, должна измениться с Permission denied
на Connection refused
. Это сигнализирует о том, что ваш второй сервер был заблокирован на сервере Fail2ban.
На вашем сервере Fail2ban вы можете увидеть новое правило, проверив вывод команды fail2ban-client
. fail2ban-client
– это дополнительная команда, предоставляемая Fail2ban для проверки его текущей конфигурации.
OutputStatus
|- Number of jail: 1
`- Jail list: sshd
Если вы выполните fail2ban-client status sshd
, вы увидите список IP-адресов, которые были заблокированы для SSH:
OutputStatus 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