Настройка связки Nginx + Fail2ban в Debian

Dec 8, 2016 18:04 · 624 words · 3 minute read nginx fail2ban

Fail2ban — сервис, отслеживающий log–файлы запущенных программ, и на основании указанных условий блокирующий нарушителей по IP-адресу.

Ранее мы уже рассматривали настройку связки Apache + Fail2ban в ОС Debian, теперь давайте разберемся с защитой от атак web-сервера Nginx!

Считаем, что в вашей системе уже установлен и нормально функционирует Nginx и Fail2ban.

Как мы знаем, настройки для защиты конкретных служб по умолчанию находятся в конфигурационном файле /etc/fail2ban/jail.conf. Копируем эти настройки в новый файл, с которым и будем работать:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Теперь необходимо отредактировать параметры по умолчанию (общие для всех цепочек), которые находятся в секции [DEFAULT]:

[DEFAULT]
destemail = admin@example.com #email, на который присылать уведомления
ignoreip  = 127.0.0.0/8 192.168.0.0/16 92.29.98.235 #IP–адреса, которые не должны быть заблокированы
mta   = mail
action    = %(action_mwl)s #выполнить действие banaction и отправить email-уведомление, включающее "whois"-информацию и строки из log-файла, которые привели к бану
banaction = iptables-multiport #заблокировать IP-адрес в iptables при помощи модуля multiports 
findtime  = 60 #интервал в секундах, за которое событие должно повториться определённое количество раз
bantime   = 3600 #время бана в секундах
maxretry  = 6 #количество подозрительных совпадений, после которых применяется правило

После изменения параметров по умолчанию, можно приступать непосредственно к настройке jail‘ов — специфических для web-сервера Nginx секций. Здесь рассмотрим [nginx-http-auth], [nginx-noscript], [nginx-badbots] и [nginx-404], из которых только первая устанавливается «из коробки», а остальные будем создавать самостоятельно. Настроенные секции будут выглядеть следующим образом:

[nginx-http-auth]
enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
[nginx-noscript]
enabled  = true
port     = http,https
filter   = nginx-noscript
logpath  = /var/log/nginx/access.log
maxretry = 6
[nginx-badbots]
enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /var/log/nginx/access.log
maxretry = 2
[nginx-404]
enabled  = true
port   = http
filter   = nginx-404
logpath  = /var/log/nginx/access.log
findtime = 600
maxretry = 5

Приступаем к созданию файлов-фильтров, которые будут использоваться только что настроенными jail‘ами. Переходим в каталог с фильтрами:

cd /etc/fail2ban/filter.d

и создаем недостающие фильтры. Фильтр 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 =

Фильтр nginx-noscript.conf копируем из apache-noscript.conf и приводим к виду:

[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)
ignoreregex =

Фильтр nginx-badbots.conf также копируем из apache-badbots.conf и оставляем без изменений.

Фильтр nginx-404.conf будет выглядеть так:

[Definition]
failregex = <HOST> - - \[.*\] "(GET).*(\/edit\/|function).*HTTP.* 404
ignoreregex =

Для применения изменений перезапускаем fail2ban:

/etc/init.d/fail2ban restart

Просмотреть какие jail‘ы запущены в данный момент можно с помощью следующей команды:

fail2ban-client status
Status
|- Number of jail:	5
`- Jail list:		nginx-http-auth, nginx-noscript, ssh, nginx-badbots, nginx-404

Также можно проверить состояние правил в файрволле командой iptables --list-rules или iptables -S:

iptables -S

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-http-auth
-N fail2ban-nginx-badbots
-N fail2ban-nginx-noscript
-N fail2ban-nginx-404
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-badbots
-A INPUT -p tcp -m multiport --dports 80 -j fail2ban-nginx-404
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noscript
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-nginx-badbots -j RETURN
-A fail2ban-nginx-noscript -j RETURN
-A fail2ban-nginx-404 -j RETURN
-A fail2ban-ssh -s 116.31.116.10/32 -j DROP
-A fail2ban-ssh -j RETURN

Больше информации о работе конкретного jail‘а можно передав в качестве параметра его имя, например так:

fail2ban-client status ssh
Status for the jail: ssh
|- filter
|  |- File list:	/var/log/auth.log
|  |- Currently failed:	0
|  `- Total failed:	12086
`- action
   |- Currently banned:	1
   |  `- IP list:	116.31.116.10
   `- Total banned:	1002

IP-адрес нарушителя разблокируется автоматически по истечению времени указанного в bantime, но можно разблокировать его вручную используя следующую команду:

fail2ban-client set ssh unbanip 116.31.116.10
tweet Share