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

Nov 10, 2016 09:59 · 586 words · 3 minute read apache fail2ban

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

Считаем, что в вашей системе уже установлен и нормально функционирует Apache. Установка fail2ban не должна вызывать трудностей:

apt-get update && apt-get install 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             = sendmail
action    = %(action_mwl)s #выполнить действие banaction и отправить email-уведомление, включающее "whois"-информацию и строки из log-файла, которые привели к бану
banaction       = iptables-multiport #заблокировать IP-адрес в iptables при помощи модуля multiports 
findtime  = 60 #интервал в секундах, за которое событие должно повториться определённое количество раз
bantime   = 3600 #время бана в секундах
maxretry  = 60 #количество подозрительных совпадений, после которых применяется правило

После изменения параметров по умолчанию, можно приступать непосредственно к настройке jail’ов — секций, которые мы намерены защищать. В данном примере это будут [apache], [apache-noscript], [apache-overflows] и [apache-badbots], которые выглядят так:

[apache]
# блокировка ошибки basic authentication 
enabled = true
port  = http,https
filter = apache-auth
logpath = /var/log/apache*/*error.log #следует изменить, если log-файл находится в другом месте
maxretry = 3 #переопределяем значение, определенное в секции [DEFAULT]
findtime = 600 #переопределяем значение, определенное в секции [DEFAULT]
[apache-noscript]
# следует использовать, если у вас статический сайт
enabled = true
port  = http,https
filter = apache-noscript
logpath = /var/log/apache*/*error.log #следует изменить, если log-файл находится в другом месте
maxretry = 3 #переопределяем значение, определенное в секции [DEFAULT]
[apache-overflows]
# блокировка на основании слишком длинных URL
enabled = true
port  = http,https
filter = apache-overflows
logpath = /var/log/apache*/*error.log #следует изменить, если log-файл находится в другом месте
maxretry = 2 #переопределяем значение, определенное в секции [DEFAULT]
[apache-badbots]
# блокировка "плохих" ботов
enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/apache*/*error.log
maxretry = 2

Для применения внесенных изменений следует перезапустить fail2ban:

/etc/init.d/fail2ban restart

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

fail2ban-client status
Status
|- Number of jail:	5
`- Jail list:		apache-overflows, apache-noscript, ssh, apache-badbots, apache

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

iptables -S

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-apache
-N fail2ban-apache-badbots
-N fail2ban-apache-noscript
-N fail2ban-apache-overflows
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-badbots
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-noscript
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-apache -j RETURN
-A fail2ban-apache-badbots -j RETURN
-A fail2ban-apache-noscript -j RETURN
-A fail2ban-apache-overflows -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

На этом все, в следующей статье рассмотрим настройку связки Nginx + Fail2ban.

tweet Share