Настройка связки Nginx + Fail2ban в Debian
Dec 8, 2016 18:04 · 624 words · 3 minute read
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