Задача: Добавить защиту для сервера где работает 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
, ой как это было давно)
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.