Моя задача: Хочу чтобы защитой Webсервиса Apache2 (Auth Basic) занимался Fail2ban но правила блокирующие были не с использованием iptables, а с более привычным в понимании ufw.

Данная заметка важна тем, что я сейчас использую: Ubuntu 14.04.5 Server amd64 + OwnCloud 10 на HP MicroServer Gen8 и прежде чем обновляться или переустанавливать все с нуля, мне нужно быть уверенным во всех действиях, как обезопасить подключение к своему хранилищу.

ekzorchik@srv-bionic:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject

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

После был развернут собственный облачный сервис OwnCloud на базе Ubuntu 18.04 Server опираясь на данную заметку: tips_ubuntu_18_04_owncloud_install_new_v1.odt, а нет она оказывается еще не написана. Блин, а скорее всего это и к лучшему, есть над чем поразмышлять и собрать свой стенд.

На заметку: Последующие действия опираются на установленный OwnCloud 10 на Ubuntu 18.04 Server amd64 описанные в опубликованной заметке.

Теперь включаю ufw:

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

ekzorchik@srv-bionic:~$ sudo ufw enable

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y

Firewall is active and enabled on system startup

ekzorchik@srv-bionic:~$ sudo nano /etc/default/ufw

IPV6=no

ekzorchik@srv-bionic:~$ sudo ufw default deny incoming

ekzorchik@srv-bionic:~$ sudo ufw default allow outgoing

ekzorchik@srv-bionic:~$ sudo ufw allow ssh

ekzorchik@srv-bionic:~$ sudo ufw app info "Apache Secure"

Profile: Apache Secure

Title: Web Server (HTTPS)

Description: Apache v2 is the next generation of the omnipresent Apache web

server.

Port:

443/tcp

ekzorchik@srv-bionic:~$ sudo ufw allow "Apache Secure"

ekzorchik@srv-bionic:~$ sudo ufw status

Status: active

To Action From

-- ------ ----

22/tcp ALLOW Anywhere

Apache Secure ALLOW Anywhere

ekzorchik@srv-bionic:~$ sudo nano /var/www/owncloud/config/config.php

'logtimezone' => 'Europe/Moscow',

'loglevel' => '2',

'logfile' => '/var/www/owncloud/data/owncloud.log',

'log_authfaillip' => true,

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

ekzorchik@srv-bionic:~$ sudo apt-get install fail2ban -y
  • папка action.d — содержит файлы действий
  • папка filter.d — файлы фильтров
  • файл fail2ban.conf — основной файл конфигурации
  • файл jail.conf — файл настройки защиты конкретных сервисов
ekzorchik@srv-bionic:~$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

ekzorchik@srv-bionic:~$ sudo nano /etc/fail2ban/action.d/ufw-owncloud.conf

[Definition]

actionstart =

actionstop =

actioncheck =

actionban = ufw insert 1 deny from <ip> to any

actionunban = ufw delete deny from <ip> to any

ekzorchik@srv-bionic:~$ sudo nano /etc/fail2ban/filter.d/owncloud.conf

[Definition]

failregex = {"reqId":".*","level":2,"time":".*","remoteAddr":".*","user":"--","app":"core","method":".*","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)"}

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

[owncloud]

enabled = true

filter = owncloud

action = ufw-owncloud

logpath = /var/www/owncloud/data/owncloud.log

maxretry = 3

findtime = 5m

bantime = 300

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

Проверяю, что регулярное выражение анализа логов owncloud корректно и ищутся ошибки неавторизованного доступа:

Проверяем работает ли наш фильтр и может ли он найти в логе ownCloud нужные строки с попытками неудачного входа:

ekzorchik@srv-bionic:~$ sudo fail2ban-regex /var/www/owncloud/data/owncloud.log /etc/fail2ban/filter.d/owncloud.conf

или

sudo fail2ban-regex /var/www/owncloud/data/owncloud.log /etc/fail2ban/filter.d/owncloud.conf --print-all-missed

Если всё верно, то внизу выдачи будет строка вида:

Lines: 21 lines, 0 ignored, 19 matched, 2 missed

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

После пробую несколько раз указать неправильную связку Login&Pass на авторизацию в OwnCloud и получаю, что доступ с хоста который совершается неудачные попытки входа заблокирован:

ekzorchik@srv-bionic:~$ sudo ufw status

Status: active

To Action From

-- ------ ----

Anywhere DENY 172.33.33.7

22/tcp ALLOW Anywhere

Apache Secure ALLOW Anywhere

Чтобы вытащить IP адрес из блокировки:

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

Анализирую почему мой фильтр не отрабатывал попробовал не указывать метод POST:

Было ранее:

#failregex={"reqId":".*","level":2,"time":".*",remoteAddr":".*","user":".*","app":"core","method":"POST","url":"\/index.php\/login?user=*--","message":"Login failed: '.*' (Remote IP: '<HOST>')"

Изменил на:

failregex = {"reqId":".*","level":2,"time":".*","remoteAddr":".*","user":"--","app":"core","method":".*","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)"}

Отлично, правило блокировки присутствует. Из проделанной работы могу сделать вывод, что блокировка с использованием ufw работает. И заметка выполнена. Если что будет нужно дополнительно я дополню данную заметку. А пока у меня всё, с уважением автор блога Олло Александр aka ekzorchik.