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

Как защитить сервер 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, как если бы вы устанавливали любой другой пакет:

  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, но сначала вы ознакомитесь с некоторыми его функциями.

Служба 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

Теперь вы можете начать вносить изменения в конфигурацию. Текстовый редактор по умолчанию, поставляемый с Rocky Linux 9, называется vi. vi — чрезвычайно мощный текстовый редактор, но он может быть несколько бестолковым для пользователей, не имеющих опыта работы с ним. Возможно, вы захотите установить более удобный редактор, такой как nano, для редактирования файлов конфигурации на вашем сервере Rocky Linux 9:

  1. sudo dnf install nano -y

Теперь вы можете использовать nano для редактирования файла конфигурации Nginx:

  1. 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 предварительно упакованных фильтров. . Если вы перечислите содержимое этого каталога, вы увидите другие доступные предварительно упакованные фильтры, если вам когда-нибудь понадобится их использовать:

  1. ls /etc/fail2ban/filter.d
Output
3proxy.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:

  1. 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:

  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: 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:

  1. sudo fail2ban-client status

Вы должны увидеть список включенных джейлов:

Output
Status |- Number of jail: 2 `- Jail list: nginx-http-auth, sshd

Если вы хотите просмотреть подробную информацию о блокировках, применяемых какой-либо тюрьмой, снова используйте fail2ban-client:

  1. sudo fail2ban-client status nginx-http-auth
Output
Status 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-адрес забанен на сайте:

  1. sudo fail2ban-client status nginx-http-auth
Output
Status 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, набрав:

  1. 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.