Настройка 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
- У вас должны быть определены базовые параметры [DEFAULT] в jail.local читайте статью Fail2ban Основные понятия и базовые настройки
- Если вы используете Cloudflare то читайте статью Fail2ban и Cloudflare Настройка Nginx и Apache
- Для подключения оповещений в Telegram читайте Как подключить Telegram к Fail2Ban
* Конфигурация 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
- Узнайте как можно защитить ваш WordPress с Fail2Ban. Читайте статью Fail2Ban Защита WordPress
- Изучите Дополнительные фильтры Fail2Ban которые помогут защитить ваш сервер Linux