Задача: Разобрать как настроить совместную работу fail2ban + firewall-cmd
Цель: обезопасить себя от подбора пароля к учетной записи root и любых других которые есть при использовании SSH
сервиса на Ubuntu 18.04 Server.
Всего это можно избежать если применять правил разрешающие взаимодействие с сервисом ssh
из указанной сети или же использовать авторизацию через публичный ключ.
ekzorchik@srv-bionic:~$ apt-cache show firewalld | grep Version Version: 0.4.4.6-1 ekzorchik@srv-bionic:~$ apt-cache show fail2ban | grep Version Version: 0.10.2-2 ekzorchik@srv-bionic:~$
Шаг №1:
Подготавливаю свежеустановленную систему к последующему использованию:
ekzorchik@srv-bionic:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject ekzorchik@srv-bionic:~$ sudo ./dproject/default
Шаг №2:
Мой совет сперва ознакомиться с заметкой
лишним не будет, а будет полезно для общего развития, т.к. в ниже указанных шагах есть нюанс почему я делаю именно так.
Шаг №3:
Устанавливаю firewall-cmd
и обязательно проверяю, что разрешено подключение по SSH
к серверу:
sudo ufw disable sudo apt-get install -y firewalld sudo systemctl enable firewalld sudo systemctl start firewalld sudo firewall-cmd --state ip r | awk '{print $5}' | head -n1 ens18 sudo firewall-cmd --zone public --change-interface=ens18 --permanent sudo firewall-cmd --reload sudo firewall-cmd --zone=public --list-all public (active) target: default icmp-block-inversion: no interfaces: ens18 sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ekzorchik@srv-bionic:~$
Шаг №4:
Устанавливаю fail2ban
из дефолтных репозитариев в текущую систему Ubuntu 18.04 Server:
На заметку: За основу настройки безопасности сервиса ssh
была взята ранее разобранная заметка, где я настраивал и связку ufw + fail2ban
https://www.ekzorchik.ru/2018/10/configure-the-fail2ban-ufw-bundle-is-not-iptables/
ekzorchik@srv-bionic:~$ sudo apt-get install -y fail2ban ekzorchik@srv-bionic:~$ sudo systemctl enable fail2ban
папка action.d — содержит файлы действий
папка filter.d — файлы фильтров
файл fail2ban.conf — основной файл конфигурации
файл jail.conf — файл настройки защиты конкретных сервисов
ekzorchik@srv-bionic:~$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Добавляю обработку защиты ssh
сервиса:
ekzorchik@srv-bionic:~$ sudo nano /etc/fail2ban/jail.local [ssh-firewalld] enabled = true filter = sshd action = firewallcmd-ssh logpath = /var/log/auth.log maxretry = 3 bantime = 600 ekzorchik@srv-bionic:~$ sudo nano /etc/fail2ban/jail.d/defaults-debian.conf [sshd] enabled = false
Создаю действия на обнаружение нарушителя и если он есть то заносится в зону:
drop — Все входящие сетевые пакеты сбрасываются, ответ на них недопустим. Возможны только исходящие сетевые соединения.
ekzorchik@srv-bionic:~$ sudo nano /etc/fail2ban/action.d/firewallcmd-ssh.conf [Definition] actionstart = actionstop = actioncheck = actionban = firewall-cmd --change-source=<ip> --zone=drop && firewall-cmd --runtime-to-permanent actionunban = firewall-cmd --remove-source=<ip> --zone=drop && firewall-cmd --runtime-to-permanent
После не забываем сохранить внесенные изменения и перезапускаем сервис fail2ban
:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --help | grep runtime --runtime-to-permanent Create permanent from runtime configuration ekzorchik@srv-bionic:~$ ekzorchik@srv-bionic:~$ sudo systemctl restart fail2ban && sudo systemctl status fail2ban | head -n5 ● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2020-04-15 22:15:26 MSK; 28ms ago Docs: man:fail2ban(1) Process: 19102 ExecStartPre=/bin/mkdir -p /var/run/fail2ban (code=exited, status=0/SUCCESS) ekzorchik@srv-bionic:~$ ls -l /var/run/fail2ban/ total 4 -rw------- 1 root root 6 Apr 15 22:15 fail2ban.pid srwx------ 1 root root 0 Apr 15 22:15 fail2ban.sock ekzorchik@srv-bionic:~$
Смотрю лог если что не так и что так «полезно для саморазвития»
ekzorchik@srv-bionic:~$ sudo tail -f /var/log/fail2ban.log 2020-04-16 09:09:47,870 fail2ban.jail [18901]: INFO Jail 'ssh-firewalld' uses pyinotify {} 2020-04-16 09:09:47,873 fail2ban.jail [18901]: INFO Initiated 'pyinotify' backend 2020-04-16 09:09:47,873 fail2ban.filter [18901]: INFO maxLines: 1 2020-04-16 09:09:47,897 fail2ban.server [18901]: INFO Jail ssh-firewalld is not a JournalFilter instance 2020-04-16 09:09:47,898 fail2ban.filter [18901]: INFO Added logfile: '/var/log/auth.log' (pos = 0, hash = 7651219bf4a00b4c22b15b947b5378d7bc66bd3b) 2020-04-16 09:09:47,901 fail2ban.filter [18901]: INFO encoding: UTF-8 2020-04-16 09:09:47,901 fail2ban.filter [18901]: INFO maxRetry: 3 2020-04-16 09:09:47,901 fail2ban.filter [18901]: INFO findtime: 600 2020-04-16 09:09:47,901 fail2ban.actions [18901]: INFO banTime: 600 2020-04-16 09:09:47,903 fail2ban.jail [18901]: INFO Jail 'ssh-firewalld' started ekzorchik@srv-bionic:~$ sudo fail2ban-client status Status |- Number of jail: 1 `- Jail list: ssh-firewalld ekzorchik@srv-bionic:~$
На заметку: я не описываю регулярными выражениями на основе которых идет проверка, что имеются некорректные попытки соединения, т.к. задействую уже предустановленное: /etc/fail2ban/filter.d/sshd.conf
Шаг №5:
Инициирую некорректные попытки соединения на порт ssh
с системы 172.35.35.4
ekzorchik@srv-nas:~$ hostname -I 172.35.35.4 ekzorchik@srv-nas:~$ ekzorchik@srv-nas:~$ ssh -l aaa 172.33.33.7 aaa@172.33.33.7's password: Permission denied, please try again. aaa@172.33.33.7's password: ekzorchik@srv-nas:~$ ssh -l adfaa 172.33.33.7 ^C ekzorchik@srv-nas:~$ ssh -l ekzorchik 172.33.33.7 ^C ekzorchik@srv-nas:~$
Шаг №6:
Проверяю, а отработала ли блокировка:
ekzorchik@srv-bionic:~$ sudo fail2ban-client status ssh-firewalld Status for the jail: ssh-firewalld |- Filter | |- Currently failed: 0 | |- Total failed: 3 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 172.35.35.4 ekzorchik@srv-bionic:~$
Блокировка отработала успешно.
Шаг №7:
Проверяю, какие зоны firewalld
сейчас активны и действительно ли нарушитель заблокирован:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --list-all-zones | grep -I 'active\|172.35.35.4' drop (active) sources: 172.35.35.4 public (active) ekzorchik@srv-bionic:~$
Все отработало, что и требовалось.
Шаг №8:
Если нужно вытащить IP
из блокировки:
ekzorchik@srv-bionic:~$ sudo fail2ban-client set ssh-firewalld unbanip 172.35.35.4 172.35.35.4 ekzorchik@srv-bionic:~$ sudo fail2ban-client status ssh-firewalld Status for the jail: ssh-firewalld |- Filter | |- Currently failed: 0 | |- Total failed: 3 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 0 |- Total banned: 1 `- Banned IP list: ekzorchik@srv-bionic:~$
Адрес удаленной системы вытащен и списка заблокированных.
Шаг №9:
Если нужно добавить IP
в блокировку:
ekzorchik@srv-bionic:~$ sudo fail2ban-client set ssh-firewalld banip 172.35.35.4 172.35.35.4 ekzorchik@srv-bionic:~$ sudo fail2ban-client status ssh-firewalld Status for the jail: ssh-firewalld |- Filter | |- Currently failed: 0 | |- Total failed: 4 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 1 |- Total banned: 2 `- Banned IP list: 172.35.35.4 ekzorchik@srv-bionic:~$
Шаг №10:
Хотя, таким вот образом я и блокирую тот IP
который ломится, можно даже ограничить доступ множеству адресов, простым изменением:
ekzorchik@srv-bionic:~$ sudo nano /etc/fail2ban/action.d/firewallcmd-ssh.conf actionban = firewall-cmd --change-source=<ip>/24 --zone=drop && firewall-cmd --runtime-to-permanent ekzorchik@srv-bionic:~$ sudo systemctl restart fail2ban && sudo systemctl status fail2ban | head -n5 ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=drop --list-all drop (active) target: DROP icmp-block-inversion: no interfaces: sources: 172.35.35.4/24 services: ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ekzorchik@srv-bionic:~$
Тем самым блокирую всю подсеть атакующего. Да я понимаю риски, что из-за одного страдают другие, но в крайнем случае даже такой вариант лучше. Стоит конечно же потестировать.
Шаг №11:
Пробую вытащить из блокировки адрес из этой /24
подсети и сталкиваюсь:
ekzorchik@srv-bionic:~$ sudo fail2ban-client set ssh-firewalld unbanip 172.35.35.8 NOK: ('172.35.35.8 is not banned',) 172.35.35.8 is not banned ekzorchik@srv-bionic:~$ ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=drop --remove-source="172.35.35.4/24" --permanent success ekzorchik@srv-bionic:~$ ekzorchik@srv-bionic:~$ sudo firewall-cmd --reload
Ну конечно, тут забанен не конкретный адрес, а вся подсеть. Так что нет, лучше блокировать не маску подсети атакующего, а по одному IP-адресу.
Шаг №12:
Если у Вас порт на системе для SSH
подключения на нестандартном порту, к примеру SSH Listen Port 22222
тогда в брандмауэер добавляем разрешенный порт для зоны public
и в /etc/fail2ban/jail.local
в [ssh-firewalld]
добавляем port = 22222
после перезапускаем
sudo firewall-cmd --reload sudo systemctl restart fail2ban
Ниже полный цикл действий:
sudo ufw disable sudo apt-get install -y firewalld sudo systemctl enable firewalld sudo systemctl start firewalld sudo firewall-cmd --state ip r | awk '{print $5}' | head -n1 ens18 sudo firewall-cmd --zone public --change-interface=ens18 --permanent sudo firewall-cmd --add-rich-rule 'rule family="ipv4" port port="22222" protocol="tcp" accept' --permanent sudo firewall-cmd --reload ekzorchik@srv-bionic:~$ sudo nano /etc/fail2ban/jail.local #172.33.33.16 - это система с которой я настраиваю, так что пока исключу ее из действия отслеживания ignoreip = 127.0.0.1/8 172.33.33.16 [ssh-firewalld] enabled = true port = 22222 filter = sshd action = firewallcmd-ssh logpath = /var/log/auth.log maxretry = 3 bantime = 600 ekzorchik@srv-bionic:~$ sudo systemctl restart fail2ban ekzorchik@srv-bionic:~$ sudo nano /etc/ssh/sshd_config Port 22222 ekzorchik@srv-bionic:~$ sudo systemctl restart ssh ekzorchik@navy:~$ ssh -l ekzorchik 172.33.33.7 -p 22222 ekzorchik@srv-bionic:~$ sudo firewall-cmd --remove-service=ssh --permanent sudo firewall-cmd --reload ekzorchik@srv-bionic:~$ sudo fail2ban-client status ssh-firewalld Status for the jail: ssh-firewalld |- Filter | |- Currently failed: 2 | |- Total failed: 9 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 1 |- Total banned: 2 `- Banned IP list: 172.35.35.8 - А вот и заблокированный который ломился на порт 22222 сервиса SSH текущей системы Ubuntu 18.04 Server ekzorchik@srv-bionic:~$
Работает.
Итого я практически составил себе пошаговую заметку, как настроить защиту от возможности подобрать пароль на учетные записи сервиса SSH
с применением надстройки над iptables - firewalld
через Fail2ban
. Пока на этом всё, с уважением автор блога Олло Александр aka ekzorchik.