Как защитить сервер Nginx с помощью Fail2Ban в Rocky Linux 9
Введение
При настройке веб-сервера часто есть разделы сайта, к которым вы хотите ограничить доступ. Веб-приложения часто предоставляют свои собственные методы аутентификации и авторизации, но сам веб-сервер может использоваться для ограничения доступа, если они неадекватны или недоступны. Однако аутентификация веб-сервера также представляет собой очень предсказуемую поверхность атаки или вектор атаки, через которую люди могут попытаться получить доступ.
Таким образом, любая служба, доступная в сети, является потенциальной целью. Если вы просмотрите журналы любого широко используемого веб-сервера, вы часто увидите повторяющиеся систематические попытки входа в систему, которые представляют собой атаки методом перебора со стороны пользователей и ботов.
Крупномасштабные производственные развертывания, для которых эта ответственность совершенно неприемлема, обычно реализуют VPN, такую как WireGuard, перед любыми частными конечными точками, поэтому невозможно напрямую подключиться к этим URL-адресам из внешнего Интернета без дополнительных программных абстракций или шлюзов. Этим VPN-решениям доверяют многие, но они добавят сложности и могут сломать некоторые средства автоматизации или другие небольшие программные ловушки.
До или в дополнение к полной настройке VPN вы можете внедрить инструмент под названием Fail2ban. Fail2ban может значительно смягчить атаки грубой силы, создавая правила, которые автоматически изменяют конфигурацию вашего брандмауэра, чтобы запретить определенные IP-адреса после определенного количества неудачных попыток входа в систему. Это позволит вашему серверу защитить себя от этих попыток доступа без вашего вмешательства.
В этом руководстве вы узнаете, как установить fail2ban
на сервер Rocky Linux 9 и настроить его для отслеживания ваших журналов Nginx на предмет попыток вторжения.
Предпосылки
- Доступ к серверной среде Rocky Linux 9 от пользователя без полномочий root с привилегиями
sudo
для выполнения административных задач. Чтобы узнать, как создать такого пользователя, следуйте руководству по первоначальной настройке сервера Rocky Linux 9. - Nginx установлен в вашей системе, следуя шагам 1 и 2 этого руководства по установке Nginx в Rocky Linux 9.
- Nginx установлен и настроен для аутентификации по паролю в соответствии с инструкциями по настройке аутентификации по паролю с помощью Nginx в Rocky Linux 9.
Шаг 1 — Установка и настройка Fail2ban
Fail2ban недоступен в стандартных репозиториях программного обеспечения Rocky. Однако он доступен в репозитории EPEL или Enhanced Packages for Enterprise Linux, который обычно используется для сторонних пакетов в Red Hat и Rocky Linux. Если вы еще не добавили EPEL в исходники системных пакетов, вы можете добавить репозиторий с помощью dnf
, как если бы вы устанавливали любой другой пакет:
- sudo dnf install epel-release -y
Диспетчер пакетов dnf
теперь будет проверять EPEL в дополнение к источникам пакетов по умолчанию при установке нового программного обеспечения. Перейдите к установке Fail2ban:
- sudo dnf install fail2ban -y
Fail2ban автоматически настроит фоновую службу после установки. Однако по умолчанию он отключен, поскольку некоторые из его настроек по умолчанию могут вызывать нежелательные эффекты. Вы можете проверить это с помощью команды systemctl
:
- 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, но сначала вы ознакомитесь с некоторыми его функциями.
Служба fail2ban хранит файлы конфигурации в каталоге /etc/fail2ban
. Существует файл со значениями по умолчанию, который называется jail.conf
. Перейдите в этот каталог и напечатайте первые 20 строк этого файла, используя head -20
:
- cd /etc/fail2ban
- 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
:
- sudo cp jail.conf jail.local
Теперь вы можете начать вносить изменения в конфигурацию. Текстовый редактор по умолчанию, поставляемый с Rocky Linux 9, называется vi
. vi
— чрезвычайно мощный текстовый редактор, но он может быть несколько бестолковым для пользователей, не имеющих опыта работы с ним. Возможно, вы захотите установить более удобный редактор, такой как nano
, для редактирования файлов конфигурации на вашем сервере Rocky Linux 9:
- sudo dnf install nano -y
Теперь вы можете использовать nano
для редактирования файла конфигурации Nginx:
- sudo nano jail.local
Изменение значений по умолчанию
Вы начнете с оценки значений по умолчанию, установленных в файле. Их можно найти в разделе [DEFAULT]
файла. Эти элементы определяют общую политику и могут быть переопределены для каждого приложения. Если вы используете nano
, вы можете выполнить поиск в файле, нажав Ctrl+W
, введя строку поиска и нажав клавишу ввода.
Одним из первых элементов, на который следует обратить внимание, является список клиентов, на которых не распространяются политики fail2ban
. Это задается директивой ignoreip
. Иногда рекомендуется добавить свой собственный IP-адрес или сеть в список исключений, чтобы не заблокировать себя. Это менее проблематично для входа на веб-сервер, чем SSH, поскольку, если вы можете поддерживать доступ к оболочке, вы всегда можете отменить запрет. Вы можете раскомментировать эту строку и добавить дополнительные IP-адреса или сети, разделенные пробелом, в существующий список:
[DEFAULT]
. . .
#ignoreip = 127.0.0.1/8 your_home_IP
Еще один элемент, который вы можете настроить, — это bantime
, который определяет, на сколько секунд нарушитель будет забанен. Идеально установить это время на достаточно долгое, чтобы предотвратить вредоносные автоматизированные действия, и в то же время достаточно короткое, чтобы пользователи могли исправлять ошибки. По умолчанию установлено значение 10 минут. Вы можете увеличить или уменьшить это значение:
[DEFAULT]
. . .
bantime = 10m
Следующие два элемента определяют объем строк журнала, используемых для определения клиента-нарушителя. Директива findtime
указывает количество времени в секундах, а директива maxretry
указывает допустимое количество попыток в течение этого времени. Если клиент сделает больше попыток, чем maxretry
в течение времени, установленного findtime
, он будет забанен:
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
Параметр action
настраивает действие, которое Fail2ban предпринимает, когда хочет установить бан. Значение action_
определено в файле незадолго до этого параметра. Действие по умолчанию — обновить конфигурацию брандмауэра, чтобы отклонять трафик с хоста-нарушителя до истечения времени блокировки.
[DEFAULT]
. . .
action = $(action_)s
. . .
Существуют и другие сценарии 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"]
…
На следующем шаге вы перейдете к настройке Nginx.
Шаг 2. Настройка Fail2Ban для мониторинга журналов Nginx
Теперь, когда у вас есть некоторые общие настройки fail2ban
, вы можете включить некоторые специальные тюрьмы Nginx, которые будут отслеживать журналы вашего веб-сервера на наличие определенных шаблонов.
Каждый джейл в файле конфигурации отмечен заголовком, содержащим имя джейла в квадратных скобках — каждый раздел, кроме раздела [DEFAULT]
, указывает конкретную конфигурацию джейла. По умолчанию включена только тюрьма [ssh]
.
Чтобы включить мониторинг журналов попыток входа в Nginx, включите джейл [nginx-http-auth]
. Добавьте в этот раздел директиву enabled=true
:
…
[nginx-http-auth]
enabled = true
port = http,https
logpath = %(nginx_error_log)s
. . .
Когда вы закончите вносить изменения, сохраните и закройте файл. Если вы используете nano
, нажмите Ctrl+X
, затем, когда будет предложено, Y
, а затем Enter. Далее вы просмотрите конфигурацию фильтра для nginx-http-auth
.
Шаг 3. Просмотр фильтров для Nginx Jails
Вы могли заметить, что блок [nginx-http-auth]
в jail.local
не содержит никаких правил, специфичных для Nginx. Эти правила не запрограммированы автоматически внутри Fail2ban — на самом деле заголовок [nginx-http-auth]
напрямую соответствует имени файла внутри каталога Fail2ban filter.d
предварительно упакованных фильтров. . Если вы перечислите содержимое этого каталога, вы увидите другие доступные предварительно упакованные фильтры, если вам когда-нибудь понадобится их использовать:
- ls /etc/fail2ban/filter.d
Output3proxy.conf freeswitch.conf proftpd.conf
apache-auth.conf froxlor-auth.conf pure-ftpd.conf
apache-badbots.conf gitlab.conf qmail.conf
apache-botsearch.conf grafana.conf recidive.conf
apache-common.conf groupoffice.conf roundcube-auth.conf
apache-fakegooglebot.conf gssftpd.conf scanlogd.conf
apache-modsecurity.conf guacamole.conf screensharingd.conf
apache-nohome.conf haproxy-http-auth.conf selinux-common.conf
apache-noscript.conf horde.conf selinux-ssh.conf
apache-overflows.conf ignorecommands sendmail-auth.conf
apache-pass.conf kerio.conf sendmail-reject.conf
apache-shellshock.conf lighttpd-auth.conf sieve.conf
assp.conf mongodb-auth.conf slapd.conf
asterisk.conf monit.conf softethervpn.conf
bitwarden.conf murmur.conf sogo-auth.conf
…
А пока взгляните на nginx-http-auth.conf
:
- cat /etc/fail2ban/filter.d/nginx-http-auth.conf
Output# fail2ban filter configuration for nginx
[Definition]
failregex = ^ \[error\] \d+#\d+: \*\d+ user "(?:[^"]+|.*?)":? (?:password mismatch|was not found in "[^\"]*"), client: <HOST>, server: \S*, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"(?:, referrer: "\S+")?\s*$
ignoreregex =
datepattern = {^LN-BEG}
…
Эти файлы содержат регулярные выражения (обычное сокращение для анализа текста), которые определяют, является ли строка в журнале неудачной попыткой аутентификации. Они могут быть изменены непосредственно по мере необходимости.
На следующих шагах вы включите и протестируете Fail2ban.
Шаг 4 — Активация ваших джейлов Nginx
На этом этапе вы можете включить службу Fail2ban, чтобы с этого момента она работала автоматически. Сначала запустите systemctl enable
:
- sudo systemctl enable fail2ban
Затем запустите его вручную в первый раз с помощью systemctl start
:
- sudo systemctl start fail2ban
Вы можете убедиться, что он работает, с помощью systemctl status
:
- sudo systemctl status fail2ban
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled
Active: active (running) since Wed 2022-09-14 20:48:40 UTC; 22h ago
Docs: man:fail2ban(1)
Main PID: 5962 (fail2ban-server)
Tasks: 7 (limit: 2327)
Memory: 12.6M
CPU: 195ms
CGroup: /system.slice/fail2ban.service
└─5962 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Примечание. Чтобы реализовать любые будущие изменения конфигурации, вам потребуется перезапустить службу fail2ban
. Вы можете сделать это с помощью sudo systemctl restart fail2ban
Получение информации о включенных джейлах
Вы можете просмотреть все включенные джейлы с помощью команды fail2ban-client
:
- sudo fail2ban-client status
Вы должны увидеть список включенных джейлов:
OutputStatus
|- Number of jail: 2
`- Jail list: nginx-http-auth, sshd
Если вы хотите просмотреть подробную информацию о блокировках, применяемых какой-либо тюрьмой, снова используйте fail2ban-client
:
- sudo fail2ban-client status nginx-http-auth
OutputStatus for the jail: nginx-http-auth
|- filter
| |- File list: /var/log/nginx/error.log
| |- Currently failed: 0
| `- Total failed: 0
`- action
|- Currently banned: 0
| `- IP list:
`- Total banned: 0
На последнем шаге этого руководства вы намеренно протестируете блокировку, чтобы убедиться, что ваша конфигурация Fail2ban работает.
Шаг 5 – Тестирование политик Fail2Ban
Важно протестировать политики Fail2ban, чтобы убедиться, что они блокируют трафик должным образом. Для этого перейдите на свой сервер в локальном веб-браузере. В запросе аутентификации Nginx несколько раз введите неверные учетные данные. После нескольких попыток сервер должен полностью перестать отвечать вам, как будто ваше соединение не работает:
Если вы посмотрите на статус конфигурации nginx-http-auth
с помощью fail2ban-client
, вы увидите, что ваш IP-адрес забанен на сайте:
- sudo fail2ban-client status nginx-http-auth
OutputStatus for the jail: nginx-http-auth
|- Filter
| |- Currently failed: 0
| |- Total failed: 5
| `- File list: /var/log/nginx/error.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 108.172.85.62
Когда вы убедитесь, что ваши правила работают, вы можете вручную разблокировать свой IP-адрес с помощью fail2ban-client
, набрав:
- sudo fail2ban-client set nginx-http-auth unbanip 108.172.85.62
Теперь вы сможете повторить попытку аутентификации.
Заключение
Fail2ban обеспечивает большую гибкость для создания политик, которые будут соответствовать вашим конкретным потребностям безопасности. Просмотрев переменные и шаблоны в файле /etc/fail2ban/jail.local
и файлы, от которых он зависит, в /etc/fail2ban/filter.d
и /etc/fail2ban/action.d
, вы можете найти множество элементов, которые можно настраивать и изменять по мере развития ваших потребностей. Защита вашего сервера с помощью fail2ban
может дать вам полезную базу безопасности.
Чтобы узнать больше о способах использования fail2ban
, ознакомьтесь с Как защитить SSH с помощью Fail2Ban в Rocky Linux 9.