Задача: Разобрать как настроить совместную работу 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: Мой совет сперва ознакомиться с заметкой

 

Как настраивается firewall-cmd on Ubuntu 18.04

лишним не будет, а будет полезно для общего развития, т.к. в ниже указанных шагах есть нюанс почему я делаю именно так.

Шаг №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.