Как защитить Apache2 через Fail2Ban

Posted by

Цель которую я преследую, это будет сервис который смотрит в интернет и он защищен работая через https (самоподписанный сертификат) + Basic Auth, но дабы некто не перебирал пароли следует защитить от множественных попыток подобрать пароль к закрытой части настройкой сервиса Fail2ban который на основании часто повторяющихся ошибок в логах будет блокировать нарушителя.

ekzorchik@srv-bionic:~$ hg clone ssh://IP&DNS://home/ekzorchik/dproject

ekzorchik@srv-bionic:~$ sudo ./dproject/default

ekzorchik@srv-bionic:~$ sudo apt-get install apache2 apache2-utils -y

ekzorchik@srv-bionic:~$ echo "ServerName localhost" | sudo tee -a /etc/apache2/apache2.conf

ServerName localhost

ekzorchik@srv-bionic:~$ sudo apt-get install fail2ban -y

Для emailподдержки, устанавливаем Sendmail:

ekzorchik@srv-bionic:~$ sudo apt-get install sendmail-bin sendmail -y

ekzorchik@srv-bionic:~$ sudo htpasswd -c /var/www/html/.htpasswd ekzorchik

  • New password: 712mbddr@
  • Re-type new password: 712mbddr@

Adding password for user ekzorchik

ekzorchik@srv-bionic:~$ sudo nano /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>

ServerAdmin webmaster@localhost

DocumentRoot /var/www/html

ErrorLog ${APACHE_LOG_DIR}/error.log

CustomLog ${APACHE_LOG_DIR}/access.log combined

<Directory /var/www/html>

AuthType Basic

AuthName "Private zone Project"

AuthUserFile /var/www/html/.htpasswd

Require valid-user

</Directory>

</VirtualHost>

ekzorchik@srv-bionic:~$ sudo a2ensite 000-default.conf

Site 000-default already enabled

ekzorchik@srv-bionic:~$ sudo apache2ctl configtest

ekzorchik@srv-bionic:~$ sudo systemctl restart apache2

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

Так как этот файл может быть изменен с помощью обновлений пакетов, его редактирование не рекомендуется. Вносить изменения нужно в файле jail.local, который переопределяет все параметры по умолчанию из файла jail.conf и имеет высший приоритет в исполнении.

ekzorchik@srv-bionic:~$ sudo cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local

ekzorchik@srv-bionic:~$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

ekzorchik@srv-bionic:~$ sudo nano /etc/fail2ban/jail.local

внутри присутствуют секции (дефолтные) по работе с журналами Web-сервиса Apache2: — это [apache-auth],[apache-badbots],[apache-noscript],[apache-overflows],[apache-nohome],[apache-fakegooglebot],[apache-modsecurity],[apache-shellshock], но они не активированы, чтобы это дело поправить нужно в каждую секцию добавить параметр enabled = true. Ладно — это все по дефолту, а мне в первую очередь нужно только нужное:

[apache]

enabled = true

port = http,https

filter = apache-auth

logpath = /var/log/apache2/error.log

maxretry = 3

bantime = 600

[apache-multiport]

enabled = true

port = http,https

filter = apache-auth

logpath = /var/log/apache2/error.log

maxretry = 3

ekzorchik@srv-bionic:~$ sudo systemctl restart fail2ban

После проверяю, что сервис запустился

ekzorchik@srv-bionic:~$ sudo systemctl status fail2ban

если есть ошибки то смотрим логи:

ekzorchik@srv-bionic:~$ sudo tail -f /var/log/syslog

это может быть задвоенная секция или еще что.

ekzorchik@srv-bionic:~$ sudo fail2ban-client status

Status

|- Number of jail: 3

- Jail list: apache, apache-multiport, sshd

ekzorchik@srv-bionic:~$ sudo fail2ban-client status apache

Status for the jail: apache

|- Filter

| |- Currently failed: 0

| |- Total failed: 0

| - File list: /var/log/apache2/error.log

- Actions

|- Currently banned: 0

|- Total banned: 0

- Banned IP list:

если кто-то обращается к странице http://IP&DNS и там стоит страница запрашивающая ввод логина и пароля, а он не знает его и начинает перебирать

[Sun Oct 07 11:23:57.849029 2018] [auth_basic:error] [pid 8015:tid 140267432691456] [client 172.33.33.7:48048] AH01618: user fjslfjsl not found: /

, то срабатывает Fail2ban и он оказывается заблокированным на срок указанный в секции под которую попадает, в моем случае — это

maxretry = 3

bantime = 600

т. е. На 600 секунд.

ekzorchik@srv-bionic:~$ sudo fail2ban-client status apache

Status for the jail: apache

|- Filter

| |- Currently failed: 0

| |- Total failed: 3

| - File list: /var/log/apache2/error.log

- Actions

|- Currently banned: 1

|- Total banned: 1

- Banned IP list: 172.33.33.7

Проверяю правила iptables:

ekzorchik@srv-bionic:~$ sudo iptables -L

Chain INPUT (policy ACCEPT)

target prot opt source destination

f2b-apache-multiport tcp -- anywhere anywhere multiport dports http,https

f2b-apache tcp -- anywhere anywhere multiport dports http,https

Чтобы разблокировать указанный IP:

ekzorchik@srv-bionic:~$ sudo fail2ban-client set apache unbanip 172.33.33.7

172.33.33.7

Чтобы заблокировать указанный IP указав вручную:

ekzorchik@srv-bionic:~$ sudo fail2ban-client set apache banip 172.33.33.7

172.33.33.7

Вот я наглядно и увидел как случилось попадание в block, а как поведет себя отработка если страница имеет URL доступа вида не http, а https.

ekzorchik@srv-bionic:~$ sudo nano /etc/apache2/sites-available/default-ssl.conf

ekzorchik@srv-bionic:~$ sudo a2ensite default-ssl.conf

ekzorchik@srv-bionic:~$ sudo systemctl reload apache2

Первое, что встречает посетивший страницу с URL адресом и настроенным самоподписанным сертификатом это уведомление от своего браузера (к примеру я провожу написание этой заметки используя Mozilla Firefox), что «Ваше соединение не защищено. Владелец 172.33.33.25 неправильно настроил свой веб-сайт. Чтобы защитить вашу информацию от кражи, Firefox не соединился с этим веб-сайтом.», далее он нажимаем «Дополнительно», снова уведомление от браузера 172.33.33.25 использует недействительный сертификат безопасности. К сертификату нет доверия, так как он является самоподписанным. Код ошибки: MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT

он нажимаем «Добавить исключении»… - «Подтвердить исключение безопасности» и только после этого ему разрешается доступ к сайту, но там Auth Basic связка на доступ, он пробует указывать различные логин и пароль и получает в конечном итоге — Fail2ban его заблокировал, а на URL адресе красуется сообщение от браузера вида:

Попытка соединения не удалась

При соединении с 172.33.33.25 произошла ошибка.

Возможно, сайт временно недоступен или перегружен запросами. Подождите некоторое время и попробуйте снова.

Если вы не можете загрузить ни одну страницу – проверьте настройки соединения с Интернетом.

Если ваш компьютер или сеть защищены межсетевым экраном или прокси-сервером – убедитесь, что Firefox разрешён выход в Интернет.

ekzorchik@srv-bionic:~$ sudo fail2ban-client status apache

Status for the jail: apache

|- Filter

| |- Currently failed: 0

| |- Total failed: 7

| - File list: /var/log/apache2/error.log

- Actions

|- Currently banned: 1

|- Total banned: 3

- Banned IP list: 172.33.33.7

Логи Webсервиса Apache2 показывают, то некто пытался авторизоваться:

[Sun Oct 07 11:30:58.444925 2018] [auth_basic:error] [pid 8327:tid 140267281622784] [client 172.33.33.7:53516] AH01618: user fdsdf not found: /

[Sun Oct 07 11:31:01.744511 2018] [auth_basic:error] [pid 8327:tid 140267273230080] [client 172.33.33.7:53516] AH01618: user admin not found: /

обработав эти логи и задействовав регулярные выражения обработки fail2ban заблокировал нарушителя. Работает.

Итого, даже страницу с самоподписанным сертификатом и настроенной базовой аутентификацией можно настроить дополнительную защиту от попыток подобрать пароль. Исходя из этого данную заметку я могу смело включить в еще один шаг по защите своей базы знаний DokuWiki: tips_ubuntu_18_04_dokuwiki_security_v1.odt

На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.