Задача: Добавить защиту для сервера где работает CMS WordPress в роли Fail2ban для блокировки перебора паролей на доступ к административной панели и доступу к SSH сервису через firewalld

Я пока разбираю, что используется WordPress (порт 80/tcp, хотя не важно даже если он 443/tcp) и доступ к серверу по SSH (22/tcp)

Шаг №1: Полное руководство по настройке WordPress on Ubuntu 20.04 Server

Шаг №2: Настраиваю, что доступ к серверу будет по 22/tcp = SSH

ekzorchik@srv-us2004a:~$ sudo groupadd sshauth

ekzorchik@srv-us2004a:~$ sudo usermod -aG sshauth ekzorchik

ekzorchik@srv-us2004a:~$ sudo nano /etc/ssh/sshd_config

DebianBanner no

PrintLastLog no

PasswordAuthentication yes

AllowGroups sshauth

ekzorchik@srv-us2004a:~$ sudo service ssh restart

по правильному порт 22/tcp нужно изменить на любой другой выше 1024.

Шаг №3: Устанавливаю на сервер Fail2ban и обязательно проверяю, что разрешено подключение по SSH к серверу: – его цель анализ логов и на основе правил принимается решение о блокировки несанкционированного доступа к сервису. В качестве щита буду использовать надстройку над правилами iptables – firewalld: (ранее использовал ufw, ой как это было давно)

Настройка связки Fail2ban + firewalld на Ubuntu 18.04

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

ekzorchik@srv-us2004a:~$ sudo ufw disable

Firewall stopped and disabled on system startup

ekzorchik@srv-us2004a:~$ sudo systemctl enable firewalld

Synchronizing state of firewalld.service with SysV service script with /lib/systemd/systemd-sysv-install.

Executing: /lib/systemd/systemd-sysv-install enable firewalld

ekzorchik@srv-us2004a:~$ sudo systemctl start firewalld

ekzorchik@srv-us2004a:~$ sudo firewall-cmd --state

running

ekzorchik@srv-us2004a:~$ ip r | awk '{print $5}' | head -n1

ens18

ekzorchik@srv-us2004a:~$ sudo firewall-cmd --zone public --change-interface=ens18 --permanent

success

ekzorchik@srv-us2004a:~$ sudo firewall-cmd --reload

success

ekzorchik@srv-us2004a:~$ sudo firewall-cmd --zone=public --list-all

public (active)

target: default

icmp-block-inversion: no

interfaces: ens18

sources:

services: dhcpv6-client ssh

ports:

protocols:

masquerade: no

forward-ports:

source-ports:

icmp-blocks:

rich rules:

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

Для ssh:

ekzorchik@srv-us2004a:~$ 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-us2004a:~$ sudo nano /etc/fail2ban/jail.d/defaults-debian.conf

[sshd]

enabled = false

Создаю действия на обнаружение нарушителя и если он есть, то заносится в зону:

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

ekzorchik@srv-us2004a:~$ 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

На заметку: можно даже ограничить доступ множеству адресов, простым изменением:

actionban = firewall-cmd --change-source=<ip>/24 --zone=drop && firewall-cmd --runtime-to-permanent

После не забываем сохранить внесенные изменения и перезапускаем сервис fail2ban:

ekzorchik@srv-us2004a:~$ sudo systemctl restart fail2ban.service && sudo systemctl status fail2ban.service | head -n5

● fail2ban.service - Fail2Ban Service

Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)

Active: active (running) since Tue 2021-10-12 07:44:18 MSK; 15ms ago

Docs: man:fail2ban(1)

Process: 4015 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)

ekzorchik@srv-us2004a:~$

Узнать кто попал в блокировку:

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

Status

|- Number of jail: 1

`- Jail list: ssh-firewalld

ekzorchik@srv-us2004a:~$

Если нужно вытащить кого-то из блокировки:

ekzorchik@srv-us2004a:~$ sudo fail2ban-client set ssh-firewalld unbanip 172.35.35.4

Шаг №4: По такому же принципу выше проделываем и для Web сервиса nginx обслуживающего CMS систему WordPress:

ekzorchik@srv-us2004a:~$ cat /etc/nginx/sites-available/wordpress.conf | grep access_log | head -n1

access_log /var/log/access-wp.log;

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

[nginx-firewalld]

enabled = true

port = http,https

findtime = 3600

filter = wordpress-auth

action = firewallcmd-nginx

logpath = /var/log/access-wp.log

maxretry = 5

bantime = 86400

ekzorchik@srv-us2004a:~$ sudo nano /etc/fail2ban/filter.d/wordpress-auth.conf

[Definition]

failregex = <HOST> - - .* "POST.*(wp-login\.php|xmlrpc\.php).* 200

ignoreregex =

ekzorchik@srv-us2004a:~$ sudo nano /etc/fail2ban/action.d/firewallcmd-nginx.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

ekzorchik@srv-us2004a:~$ sudo systemctl restart fail2ban.service && sudo systemctl status fail2ban.service | head -n5

● fail2ban.service - Fail2Ban Service

Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)

Active: active (running) since Tue 2021-10-12 08:01:00 MSK; 13ms ago

Docs: man:fail2ban(1)

Process: 10770 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)

ekzorchik@srv-us2004a:~$ sudo fail2ban-client status nginx-firewalld

Status for the jail: nginx-firewalld

|- Filter

| |- Currently failed: 0

| |- Total failed: 0

| `- File list: /var/log/access-wp.log

`- Actions

|- Currently banned: 0

|- Total banned: 0

`- Banned IP list:

ekzorchik@srv-us2004a:~$

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

Status

|- Number of jail: 2

`- Jail list: nginx-firewalld, ssh-firewalld

ekzorchik@srv-us2004a:~$

Шаг №5: А теперь если кто-либо пытается зайти в админку блога и у него три раза не получается, fail2ban читает логи и со своим шаблоном анализа анализирует и затем блокирует особо настырного на 1 день (86400/3600 = 24 часа)

ekzorchik@srv-us2004a:~$ sudo fail2ban-client status nginx-firewalld

Status for the jail: nginx-firewalld

|- Filter

| |- Currently failed: 1

| |- Total failed: 7

| `- File list: /var/log/access-wp.log

`- Actions

|- Currently banned: 1

|- Total banned: 1

`- Banned IP list: 172.33.33.108

ekzorchik@srv-us2004a:~$

И после данный IP не сможет вообще в браузере открыть или через ICMP проверить Online ли хост или нет, он заблокирован.

Все действия выше опираются на ранее опубликованную: Настройка связки Fail2ban + firewalld на Ubuntu 18.04 Вот что значит разобрать один раз и в последствии дополнять и использовать собственные заготовки.

Итого я подготовил заметку по практической защите сервера Ubuntu 20.04 Server и сервиса CMS WordPress на нем и могу смело развернуть/перевести свои ресурсы на него. На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.