Всем привет!
В прошлой заметке я описал установку личного облачного хранилища Nextcloud в операционной системе Ubuntu.
Пора настроить защиту Nextcloud от брутфорса (попытке подобрать пароль путем перебора).
Для этого есть многим известный инструмент Fail2Ban, в рамках своего блога я уже описывал базовую настройку его в операционной системе FreeBSD.
В этой заметке мы с вами установим Fail2Ban и создадим фильтр для защиты нашего облачного хранилища.
Немного вводных данных:
- OS Ubuntu 20.04
- FireWall — Iptables
- IP атакующего — 111.111.111.111
- Наши сети: 222.222.222.0/24, 192.168.1.0/24
Установим Fail2Ban:
sudo apt-get install fail2ban
После установки Fail2Ban имеет рабочий фильтр ssh.
Создадим лог-файл для Nextcloud:
sudo touch /var/log/nextcloud.log sudo -u www-data chown www-data:www-data /var/log/nextcloud.log
Настроим логирование в Nextcloud:
sudo -u www-data php occ log:file --file /var/log/nextcloud.log --rotate-size 20M --enable sudo -u www-data php occ log:manage --level 2 --timezone Europe/Moscow
Либо правкой конфигурационного файла Nextcloud:
sudo vi /var/www/nextcloud/config/config.php 'logtimezone' => 'Europe/Moscow', 'log_type' => 'file', 'logfile' => '/var/log/nextcloud.log', 'log_rotate_size' => 20971520, 'loglevel' => '2',
Создадим фильтр для Fail2Ban:
sudo vi /etc/fail2ban/filter.d/nextcloud.conf [INCLUDES] before = common.conf [Definition] _groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*) failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed: datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"
Где мы ищем вхождение по фразе «Login failed» и забираем IP адрес «<HOST>»
Подключим фильтр:
sudo vi /etc/fail2ban/jail.local [DEFAULT] ignoreip = 222.222.222.0/24 192.168.1.0/24 [nextcloud] enabled = true port = http,https filter = nextcloud logpath = /var/log/nextcloud.log findtime = 600 maxretry = 3 bantime = 24h
В секции DEFAULT мы описали наши IP адреса, которые будут игнорироваться Fail2Ban (по сути белый список).
В секции nextcloud мы указали:
- enabled = true #фильтр включен
- port = http,https #Порты блокировки
- filter = nextcloud #Название фильтра (filter.d/nextcloud.conf)
- logpath = /var/log/nextcloud.log #Анализируемый лог
- findtime = 600 #В секундах — время поиска повторяющихся событий
- maxretry = 3 #Количество повторов (после третьей попытки неудачной авторизации, IP атакующего попадает в Бан)
- bantime = 24h # Сколько держать нарушителя в бане, можно в минутах -m, в часах -h, либо в секундах — без префикса
Передергиваем Fail2Ban:
sudo service fail2ban restart
Посмотрим лог Fail2Ban:
tail -11 /var/log/fail2ban.log 2020-06-24 12:26:23,349 fail2ban.jail [109392]: INFO Creating new jail 'nextcloud' 2020-06-24 12:26:23,349 fail2ban.jail [109392]: INFO Jail 'nextcloud' uses pyinotify {} 2020-06-24 12:26:23,355 fail2ban.jail [109392]: INFO Initiated 'pyinotify' backend 2020-06-24 12:26:23,358 fail2ban.datedetector [109392]: INFO date pattern `',?\\s*"time"\\s*:\\s*"%Y-%m-%d[T ]%H:%M:%S(%z)?"'`: `,?\s*"time"\s*:\s*"Year-Month-Day[T ]24hour:Minute:Second(Zone offset)?"` 2020-06-24 12:26:23,358 fail2ban.filter [109392]: INFO maxRetry: 3 2020-06-24 12:26:23,358 fail2ban.filter [109392]: INFO findtime: 600 2020-06-24 12:26:23,358 fail2ban.actions [109392]: INFO banTime: 86400 2020-06-24 12:26:23,358 fail2ban.filter [109392]: INFO encoding: UTF-8 2020-06-24 12:26:23,359 fail2ban.filter [109392]: INFO Added logfile: '/var/log/nextcloud.log' (pos = 8919, hash = 03a4a57013be97f0bc9f0e00bed2f23034d14779) 2020-06-24 12:26:23,362 fail2ban.jail [109392]: INFO Jail 'sshd' started 2020-06-24 12:26:23,363 fail2ban.jail [109392]: INFO Jail 'nextcloud' started
Видим, что наш созданный фильтр подцепился, попробуем провести «атаку» с адреса не входящего в ignoreip, параллельно запустим вывод лога Fail2Ban:
sudo tail -f /var/log/fail2ban.log 2020-06-24 12:31:29,737 fail2ban.filter [109392]: INFO [nextcloud] Found 111.111.111.111 - 2020-06-24 12:31:29 2020-06-24 12:32:15,484 fail2ban.filter [109392]: INFO [nextcloud] Found 111.111.111.111 - 2020-06-24 12:32:15 2020-06-24 12:32:46,076 fail2ban.filter [109392]: INFO [nextcloud] Found 111.111.111.111 - 2020-06-24 12:32:46 2020-06-24 12:32:46,136 fail2ban.actions [109392]: NOTICE [nextcloud] Ban 111.111.111.111
Проверим iptables:
sudo iptables -L Chain f2b-nextcloud (1 references) target prot opt source destination REJECT all -- 111.111.111.111 anywhere reject-with icmp-port-unreachable RETURN all -- anywhere anywhere
Ну и принтсткин с заблокированной машины:
На этом все, всем пока!