Настройка Fail2Ban для Nginx

Как правильно настроить Fail2Ban для Nginx. Настройка Fail2Ban для мониторинга журналов Nginx. Здесь описаны все необходимые фильтры для Nginx.

Настройка Fail2Ban для Nginx
3 мин
Автор PINTA IT

Настройка Fail2Ban для Nginx

Как правильно настроить Fail2Ban для Nginx. Настройка Fail2Ban для мониторинга журналов Nginx. Здесь описаны все необходимые фильтры для Nginx.

Настройка Fail2Ban для мониторинга Nginx

Все необходимые фильтры для Nginx

[nginx-http-auth] Определяет неудачные попытки ввода пароля
[nginx-noscript] Блокируем доступ к определенным скриптам
[nginx-badbots] Определяем ботов которые ищут email адреса
[nginx-botsearch] Сопоставление веб-запросов для URL-адресов, которые не существуют
[nginx-noproxy] Блокирует клиентов которые пытаются использовать Nginx как прокси-сервер
[nginx-noconnect] Блокирует IP которые используют метод Connect
[nginx-nohome] Блокируем неудачные попытки поиска домашней директории
[nginx-limit-req] Защита веб-сервера от DDoS-атак

Конфигурационные файлы Nginx существующие по умолчанию

  • nginx-botsearch.conf
  • nginx-http-auth.conf
  • nginx-limit-req.conf

Важно! Следите за тем, чтобы путь к файлу хранения логов logpath был указан корректно. Обязательно назначьте ему необходимые права доступа командой chmod 755 /var/log/XXX.log


* Конфигурация Fail2ban настраивается
--- $ sudo nano /etc/fail2ban/jail.local

* Управление активными фильтрами
--- $ cd /etc/fail2ban/filter.d

* Файлы логов Nginx
--- $ sudo nano /var/log/nginx/error.log
--- $ sudo nano /var/log/nginx/access.log

Мониторинг журналов для попыток входа в Nginx

--- jail.local --------------------------------------------------------------
-----------------------------------------------------------------------------
[nginx-http-auth]

enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
-----------------------------------------------------------------------------
--- nginx-http-auth.conf ----------------------------------------------------
-----------------------------------------------------------------------------
[Definition]

failregex  = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
             ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

ignoreregex =

datepattern = {^LN-BEG}
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
* Проверка срабатывания правил
--- $ fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/nginx-http-auth.conf

Остановить шаблоны запросов вредоносных ботов

--- jail.local -------------------------------------------------------------------
----------------------------------------------------------------------------------
[nginx-badbots]

enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /var/log/nginx/access.log
-----------------------------------------------------------------------------------
--- nginx-badbots.conf ------------------------------------------------------------
-----------------------------------------------------------------------------------
* Копируем фильтр для Apache
--- $ cp apache-badbots.conf nginx-badbots.conf
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
*** Проверка срабатывания правил
--- $ fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-badbots.conf

Блокировать клиентов которые пытаются использовать Nginx как открытый прокси-сервер

----------------------------------------------------------------------------------
--- jail.local -------------------------------------------------------------------
----------------------------------------------------------------------------------
[nginx-noproxy]

enabled  = true
port     = http,https
filter   = nginx-noproxy
logpath  = /var/log/nginx/access.log
-----------------------------------------------------------------------------------
--- nginx-noproxy.conf ------------------------------------------------------------
-----------------------------------------------------------------------------------
[Definition]

failregex   = ^<HOST> -.*GET http.*

ignoreregex =
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
*** Проверка срабатывания правил
--- $ fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-noproxy.conf

Фильтр блокирует IP которые используют метод Connect

----------------------------------------------------------------------------------
--- jail.local -------------------------------------------------------------------
----------------------------------------------------------------------------------
[nginx-noconnect]

enabled  = true
port     = http,https
filter   = nginx-noconnect
logpath  = /var/log/nginx/access.log
-----------------------------------------------------------------------------------
--- nginx-noconnect.conf ----------------------------------------------------------
-----------------------------------------------------------------------------------
[Definition]

failregex   = ^<HOST> -.*CONNECT

ignoreregex =
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
*** Проверка срабатывания правил
--- $ fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-noconnect.conf

Блокировка домашних каталогов

Если в вашей настройке Nginx не предоставляет доступа к веб-контенту в домашних каталогах пользователей, вы можете заблокировать пользователей, которые запрашивают эти ресурсы

----------------------------------------------------------------------------------
--- jail.local --------------------------------------------------------------------
-----------------------------------------------------------------------------------
[nginx-nohome]

enabled  = true
port     = http,https
filter   = nginx-nohome
logpath  = /var/log/nginx/access.log
-----------------------------------------------------------------------------------
--- nginx-nohome.conf -------------------------------------------------------------
-----------------------------------------------------------------------------------
[Definition]

failregex   = ^<HOST> -.*GET .*/~.*

ignoreregex =
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
*** Проверка срабатывания правил
--- $ fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-nohome.conf

Сопоставление веб-запросов для URL-адресов, которые не существуют

----------------------------------------------------------------------------------
--- jail.local -------------------------------------------------------------------
----------------------------------------------------------------------------------
[nginx-botsearch]

enabled = true
port    = http,https
filter  = nginx-botsearch
logpath = /var/log/nginx/error.log
          /var/log/nginx/access.log
-----------------------------------------------------------------------------------
--- nginx-botsearch.conf ----------------------------------------------------------
-----------------------------------------------------------------------------------
Фильтр nginx-botsearch.conf существует по умолчанию в фильтрах
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
*** Проверка срабатывания правил
--- $ fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/nginx-botsearch.conf

NGINX DDoS  Данное правило поможет защитить веб-сервер nginx от DDoS-атак

* Для начала, необходимо настроить NGINX 
--- $ nano /etc/nginx/nginx.conf
* В раздел http добавим:
------------------------------------------------------------------------------
http {
    ...
    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
    ...
------------------------------------------------------------------------------
* данная настройка создает зону с интенсивностью запросов в 1 запрос в секунду
* После настраиваем лимит для конкретного виртуального домена в разделе server - location
-----------------------------------------------------------------------------------
server {
    ...
    location / {
        ...
        limit_req zone=one burst=5 nodelay;
        ...
-----------------------------------------------------------------------------------
* данная настройка вместе с предыдущей зоной, созданной в секции http, позволит лимитировать запросы - 1 запрос в секунду при всплеске 5 запросов.
* Проверяем конфигурационный файл nginx и перезапускаем сервис:
--- $ nginx -t

* Перезапускаем nginx
-- $ systemctl restart nginx

Создаем правило fail2ban

----------------------------------------------------------------------------------
--- jail.local -------------------------------------------------------------------
----------------------------------------------------------------------------------
[nginx-limit-req]

enabled = true
port    = http,https
filter  = nginx-limit-req
logpath = /var/log/nginx/error.log
-----------------------------------------------------------------------------------
--- nginx-limit-req.conf ----------------------------------------------------------
-----------------------------------------------------------------------------------
Фильтр nginx-limit-req.conf существует по умолчанию в фильтрах
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
*** Проверка срабатывания правил
--- $ fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/nginx-limit-req.conf

Если вы используете PHP, вы можете включить фильтр php-url-fopen который блокирует попытки использования определенного поведения PHP

----------------------------------------------------------------------------------
--- jail.local -------------------------------------------------------------------
----------------------------------------------------------------------------------
[php-url-fopen]

enabled  = true
port     = http,https
filter   = php-url-fopen
logpath  = /var/log/nginx/access.log
-----------------------------------------------------------------------------------
--- php-url-fopen.conf ------------------------------------------------------------
-----------------------------------------------------------------------------------
Фильтр php-url-fopen.conf существует по умолчанию в фильтрах
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------

--- Проверка срабатывания правил ---------------------------------------------
------------------------------------------------------------------------------
*** В случае проблем, логи можно посмотреть следующим образом
--- $ tail -F /var/log/fail2ban.log
--- $ Cntr + Z выйти

После внесения изменений

* Проверить состояние fail2ban
--- $ systemctl status fail2ban

* Перезапустить сервис
--- $ service fail2ban restart

* Получение информации о включенных фильтрах
--- $ fail2ban-client status

Похожие публикации