Применим удобное и эффективное средство для защиты сайта от подбора паролей с помощью популярного сервиса Fail2ban. Помогает для защиты от ботов и очень любопытных товарищей. Заблокируем назойливых роботов на уровне VDS хостинга.

Введение

Рано или поздно ваш сайт будут пробовать на прочность всякие роботы. Если движок сайта свободный, то роботы начинают проверять вас на прочность сразу.

Все бесплатные движки всегда надо обновлять и внимательно относиться ко всем дополнениям что устанавливайте. Обязательно держите резервные копии и тогда даже взлом не страшен.

Меня начали проверять почти сразу. Пользуясь случаем хочу передать привет товарищу Токарчуку Александру Степановичу с IP адреса которого упорно хотели попасть в админку моего сайта. Почему то пытаются войти, в моем случае, как правило с Украины.

Советую сразу смените путь к админке сайта с помощью iThemes Security. По умолчанию путь в WordPress домен/wp-admin и именно сюда все боты и лезут… Поленился я сразу сменить и боты стали ломится каждую минуту и причем в своем большинстве используя Российские ip адреса. Путь сменил, но они всё равно ломятся по стандартному пути…

f2b защита сайта

Ошибка входа в админку

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

Посмотрим как выглядит лог неудачной попытки авторизации на популярном движке WordPress:

91.200.12.91 - - [10/Apr/2017:10:02:22 +0300] "POST /wp-login.php HTTP/1.1" 200 2884 "https://sevo44.ru/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36" "2.79"
91.200.12.91 - - [10/Apr/2017:10:02:23 +0300] "POST /wp-login.php HTTP/1.1" 200 2884 "https://sevo44.ru/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36" "2.79"

Согласно этим строчкам 2 раза неудачно авторизовались.

iThemes Security для WordPress

Для популярного движка WordPress существует свободный плагин iThemes Security для защиты сайта. Не буду останавливаться на рассмотрении настройки, покажу лишь как он показывает ошибки авторизации.

f2b защита сайта4

Согласно этих данных видим что регулярно производится по 2 попытки авторизации к административной панели сайта.

При нажатии на ip мы увидим информацию о координатах этого адреса:

f2b защита сайта3

У меня как обычно Украина. Нажмем на ISP: PP SKS-Lugan и увидим более детальную информацию:

f2b защита сайта2

Можно делать с этой информацией всё что угодно и тут всё в вашей власти.

Моя задача сделать так чтобы данные пользователи блокировались для всего моего VDS хостинга, а не только для сайта работающего на WordPress c защитой iThemes Security. Для этого и надо настроить Fail2ban.

Настройка Fail2ban

Установка

Устанавливать и настраивать будем для системы CentOS 7, хотя и для других систем, с учетом специфики операционной системы, данное описание подойдёт.

Установим:

yum install fail2ban

Конфигурационный файл настройки находится здесь — /etc/fail2ban/jail.conf, но, как сказано в комментариях файла, данный файл рекомендуется не изменять.

Чтобы при обновлении Fail2ban не удалялись наши настройки создадим локальную копию файла, именно с него и будет работать наша система защиты.

Отправка почты на внешний e-mail адрес

Настроим чтобы письма root пересылались на нужную нам внешнюю e-mail почту.

Открываем файл /etc/aliases и внесем изменения:

mcedit /etc/aliases
=необходимые изменения=
# Person who should get root's mail
root:info@sevo44.ru

Применим изменения выполнив команду:

newaliases

Отправим тестовое сообщение выполнив команду:

echo «test» | mail -s Testmail root

Если в выводе будет -bash: mail: команда не найдена то надо установить пакет:

= Для CentOS = 
yum install mailx
= Для Debian =
apt-get install mailutils

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

Обязательно проверьте спам почты. Если в спаме нет то смотрите логи отправки почты. Всегда использую почтовый сервис yandex.ru и проблем с ними нет.

В случае если письмо не пришло то надо идти в файл лога и смотреть что там не так. В моем случае лог выглядит так:

cat /var/log/maillog
= вывод команды с необходимыми значениями =
Apr 10 22:57:03 ih378645 postfix/smtp[29844]: D56B64957: to=<info@sevo44.ru>, orig_to=<root>, relay=mx.yandex.ru[87.250.250.89]:25, delay=0.57, delays=0.02/0/0.03/0.52, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued on mxfront10g.mail.yandex.net as 1491854223-b3qP5cuV0Mf-v2CaUBlk)

Работа с почтой Postfix

Перестала приходить почта от f2b о блокировке желающих войти в админку сайта.

Вот количество ip которое стремительно увеличивалось:

fail2ban-client status sites-sevo44ru
= вывод команды =
Status for the jail: sites-sevo44ru
|- Filter
| |- Currently failed: 0
| |- Total failed: 11
| `- File list: /web/sites/sevo44.ru/log/access.log
`- Actions
 |- Currently banned: 207
 |- Total banned: 207
 `- Banned IP list: 109.105.190.219 109.124.100.250 109.126.225.137 109.162.93.73 109.171.22.62 109.172.55.2 109.188.64.73 109.188.85.234 109.195.183.85 109.198.171.226 109.60.155.212 109.75.193.0 109.75.202.103 128.74.71.66 145.255.3.225 145.255.3.243 145.255.3.39 159.224.11.242 173.232.219.176 173.236.184.110 173.236.184.142 173.236.184.143 176.49.40.127 176.59.41.30 176.62.69.118 177.204.153.95 177.207.148.119 178.122.111.64 178.129.238.101 178.155.4.80 178.161.237.69 178.205.188.253 178.207.227.23 178.252.205.27 178.57.63.25 178.65.133.157 178.67.130.123 178.68.173.206 178.72.91.190 185.180.229.142 185.25.19.134 185.3.35.46 185.30.88.107 185.30.88.76 185.41.212.207 185.71.82.158 188.0.188.181 188.115.138.206 188.123.230.206 188.126.38.199 188.134.15.152 188.16.110.197 188.162.229.113 188.162.40.42 188.232.43.178 188.235.141.43 188.254.110.230 188.254.43.218 188.255.13.56 188.32.71.98 188.43.36.22 188.52.174.121 193.107.0.34 193.107.151.221 193.169.32.59 194.135.247.146 194.15.117.19 195.191.83.66 195.3.245.253 195.93.144.120 2.36.191.127 2.60.185.142 212.116.102.42 212.164.46.108 212.175.77.165 212.20.45.184 213.138.90.164 213.155.204.122 213.87.137.135 213.87.224.201 213.87.224.214 213.87.96.210 216.185.103.189 217.118.91.62 217.150.50.69 217.23.186.38 222.149.235.211 31.130.91.37 31.131.85.19 31.132.160.196 31.132.183.250 31.47.116.134 31.6.119.56 31.7.224.10 31.7.237.76 36.73.140.126 37.113.130.68 42.145.226.174 46.0.106.28 46.164.199.44 46.172.208.41 46.236.129.182 46.242.14.3 46.36.18.111 46.39.230.246 46.39.244.115 46.39.49.133 46.47.7.2 46.99.3.32 5.18.172.193 5.206.236.28 5.228.255.64 5.76.127.100 62.109.179.58 62.112.118.38 62.183.86.39 64.111.127.38 64.34.217.217 67.234.216.197 69.163.216.123 77.222.100.87 77.246.225.66 77.34.10.29 77.40.56.179 77.51.62.109 77.66.146.104 77.72.121.70 78.106.172.62 78.107.234.199 78.153.25.244 78.159.238.91 78.24.5.142 78.36.120.180 79.122.230.190 79.165.123.222 80.251.112.200 80.67.249.55 80.80.162.44 81.1.212.101 81.20.199.41 81.28.176.111 82.114.68.235 83.167.101.207 83.174.223.180 84.22.36.50 84.234.50.77 85.175.143.185 85.95.191.186 86.62.123.82 87.117.26.218 88.147.152.131 88.147.152.7 88.147.231.208 88.205.217.250 89.106.198.59 89.188.124.197 89.237.29.174 90.188.6.161 90.189.223.253 91.144.149.126 91.205.46.26 91.207.245.253 91.229.204.2 93.157.168.19 93.185.17.122 93.185.30.26 93.78.108.179 93.94.234.110 94.180.44.52 94.228.207.139 94.233.62.22 94.24.244.182 94.25.176.210 94.25.177.184 94.25.179.100 94.29.124.183 94.29.124.189 94.50.197.139 94.75.60.240 95.106.193.177 95.137.159.251 95.141.233.82 95.152.4.216 95.153.132.246 95.159.138.245 95.159.164.155 95.188.128.213 95.190.112.163 95.24.6.152 95.30.25.120 95.32.12.236 95.32.123.249 95.71.51.84 95.72.22.198 95.78.113.238 95.78.19.212 5.138.196.107 176.8.76.170 178.75.42.126 83.149.44.111 46.61.76.189 5.76.199.41 82.138.49.236 85.234.6.34 178.205.122.253 79.120.80.50 77.222.99.126

В логах обнаружил сообщение о превышении лимита на отправку сообщений:

cat /var/log/maillog
= вывод команды с необходимыми значениями =
May 5 12:48:32 ih378656 postfix/smtp[12576]: 3111D5EE9: to=<dolotov44@yandex.ru>, orig_to=<root@localhost>, relay=mx.yandex.ru[93.158.134.89]:25, conn_use=23, delay=12862, delays=12859/3.1/0.07/0.06, dsn=4.5.1, status=deferred (host mx.yandex.ru[93.158.134.89] said: 451 4.5.1 The recipient <dolotov44@yandex.ru> has exceeded their message rate limit. Try again later. 1493977712-W6SydoLQur-mWE8thiK (in reply to end of DATA command))
May 5 12:48:32 ih378656 postfix/smtp[12563]: 2E9A05F20: host mx.yandex.ru[87.250.250.89] said: 451 4.5.1 The recipient <dolotov44@yandex.ru> has exceeded their message rate limit. Try again later. 1493977712-LwxkdR0eGu-mWD4A8YU (in reply to end of DATA command)

Посмотрим количество сообщений в очереди postfix:

mailq | grep Request
= вывод команды =
-- 5811 Kbytes in 1888 Requests.

Видим что 1888 писем в очереди на отправку.

Посмотрим с каких почтовых ящиков очередь:

mailq|grep ^[A-F0-9] |cut -c 42-80| sort | uniq -c| sort -n
= вывод команды =
1888 f2b@ih378656.vds.myihor.ru

Вся очередь состоит из писем с сервиса fail2ban.

Сбросим всю очередь:

postsuper -d ALL
= вывод команды =
postsuper: Deleted: 1888 messages

Основной файл настройки

Скопируем файл с нужным новым названием командой:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Файл настройки большой, поэтому я покажу только настройки что я менял. Откроем файл и внесем нужные исправления и добавления:

mcedit /etc/fail2ban/jail.local
= вывод команды с необходимыми изменениями =
# "bantime" это количество секунд запрета
# 1 week = 604800
bantime = 604800
# Время работы параметра "maxretry"
# seconds.
findtime = 600
# "maxretry" количество попыток до бана
maxretry = 3
#
# ACTIONS
#
# Действия при срабатывании правил.
# Адрес электронной почты получателя
destemail = root@localhost
# Адрес отправителя
sender = f2b
# Выбрать действие по умолчанию. Чтобы изменить, просто переопределить значение 'действие' s
# Всего 3 вида действия
# action_ только запрет
# action_mw запретить и отправить по электронной почте с whois доклад destemail 
# action_mwl запретить и отправить по электронной почте с whois отчет и соответствующие строки журнала
action = %(action_mwl)s

# Свои фильтры для защиты
# Название блока используемое при работе с сервисом
[sites-sevo44ru]
# Включение правила
enabled = true
# Какие порты блокируются
port = http,https
# Название файла фильтра
filter = sites-sevo44ru
# Путь до лог файла который анализируется
logpath = /web/sites/sevo44.ru/log/access.log
# Количество неудачных попыток до блокировки
maxretry = 3
# Период блокировки -- вечная. Иногда лучше использовать и такое :)
#bantime = -1

Обращаю особое внимание на строку action = %(action_mwl)s. Если хотите получать оповещения на почту обязательно правильно укажите этот параметр и настройте оповещение на необходимый почтовый ящик.

Мне пришлось отключить отправку сообщений на почту. Про перезагрузке сервиса на почту приходят сообщения о всех заблокированных ip. При большом количестве блокировок почтовый ящик на yandex отказывается их принимать. Если кто может подсказать как решить эту проблему подскажите.

Если укажите чтобы на почту приходила информация с whois докладом в письме можете увидеть missing whois program установите необходимое выполнив команду:

yum install jwhois

Теперь в сообщениях на почту будет приходить детальная информация об ip адресе блокируемого.

Файл фильтра

Создадим файл фильтра в необходимой папке с указанием нужных параметров:

mcedit /etc/fail2ban/filter.d/sites-sevo44ru.conf
= необходимые параметры =
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php

Можно в новой строчке перечислять любые необходимые параметры.

В одном из фильтров я использую код ^<HOST> .*base64_decode который блокирует всех кто пытается использовать эту кодировальную хренодрянь.

Проверим наш фильтр выполнив команду:

fail2ban-regex /web/sites/sevo44.ru/log/access.log /etc/fail2ban/filter.d/sites-sevo44ru.conf
= вывод информации =

Running tests
=============

Use failregex filter file : sites-wpsevo44ru, basedir: /etc/fail2bаn
Use log file : /web/sites/wp.sevo44.ru/log/access.log
Use encoding : UTF-8

Results
=======
Failregex: 309 total
|- #) [# of hits] regular expression
| 1) [309] ^<HOST> .* "POST /wp-login.php
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
| [77612] Day(?P<_sep>[-/])MON(?P=_sep)Year[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-

Lines: 77612 lines, 0 ignored, 309 matched, 77303 missed
[processed in 16.01 sec]
Missed line(s): too many to print. Use --print-all-missed to print all 77303 lines

Видим что в нашем логе 309 срабатываний правила.

Можно вывести информация обо всех этих строчках:

fail2ban-regex /web/sites/wp.sevo44.ru/log/access.log /etc/fail2ban/filter.d/sites-wpsevo44ru.conf --print-all-matched
= вывод информации =
Running tests
=============

Use failregex filter file : sites-wpsevo44ru, basedir: /etc/fail2ban
Use log file : /web/sites/sevo44.ru/log/access.log
Use encoding : UTF-8

Results
=======
Failregex: 309 total
|- #) [# of hits] regular expression
| 1) [309] ^<HOST> .* "POST /wp-login.php
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
| [77618] Day(?P<_sep>[-/])MON(?P=_sep)Year[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-
Lines: 77618 lines, 0 ignored, 309 matched, 77309 missed
[processed in 15.31 sec]

|- Matched line(s):
| 185.34.244.250 - - [05/Mar/2017:13:11:24 +0300] "POST /wp-login.php HTTP/2.0" 200 2208 "https://sevo44.ru/wp-login.php?redirect_to=https%3A%2F%2Fsevo44.ru%2Fwp-admin%2F&reauth=1" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "2.27"
| 185.34.244.250 - - [05/Mar/2017:13:11:30 +0300] "POST /wp-login.php HTTP/2.0" 302 955 "https://sevo44.ru/wp-login.php" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-"
= часть информации скрыта =

Автозагрузка и запуск сервиса

Добавим а автозагрузку и запустим сервис:

systemctl enable fail2ban
systemctl start fail2ban

После последующих необходимых изменениях перезагружаем стандартной для CentOS 7 командой:

systemctl restart fail2ban

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

Для полной уверенности посмотрим статус:

systemctl status fail2ban
● fail2bаn.service - Fail2Bаn Service
 Loaded: loaded (/usr/lib/systemd/system/fail2bаn.service; enabled; vendor preset: disabled)
 Active: active (running) since Пн 2017-04-10 23:23:47 MSK; 2min 20s ago
 Docs: man:fail2ban(1)
 Process: 30794 ExecStop=/usr/bin/fail2bаn-client stop (code=exited, status=0/SUCCESS)
 Process: 30830 ExecStart=/usr/bin/fail2bаn-client -x start (code=exited, status=0/SUCCESS)
 Main PID: 30834 (fail2ban-server)
 CGroup: /system.slice/fail2bаn.service
 └─30834 /usr/bin/python2 -s /usr/bin/fail2bаn-server -s /var/run/fail2ban/fail2bаn.sock -p /var/run/fail2ban/fail2bаn.pid -x -b

апр 10 23:23:46 ih378645.vds.myihor.ru systemd[1]: Starting Fail2Ban Service...
апр 10 23:23:47 ih378645.vds.myihor.ru fail2ban-client[30830]: 2017-04-10 23:23:47,141 fail2bаn.server [30832]: INFO Starting ...v12.45.668
апр 10 23:23:47 ih378645.vds.myihor.ru fail2ban-client[30830]: 2017-04-10 23:23:47,141 fail2bаn.server [30832]: INFO Starting ...n mode
апр 10 23:23:47 ih378645.vds.myihor.ru systemd[1]: Started Fail2Ban Service.
Hint: Some lines were ellipsized, use -l to show in full.

Всё у нас хорошо. Работает и стартует при перезагрузке сервера.

Главный файл настройки

В главном файле настройки указывается куда будут складываться логи и другие  параметры. Нам важно убедится в правильности пути до лог файлов. Откроем и посмотрим куда пишутся логи:

cat /etc/fail2ban/fail2ban.conf
= вывод команды с пояснениями =
# Где лежат логи 
logtarget = /var/log/fail2ban.log

Ротация логов сервиса

Откроем файл ротации сервиса и сделаем необходимые изменения:

mcedit /etc/logrotate.d/fail2ban.conf
= вывод команды с необходимыми изменениями =
/var/log/fail2bаn.log {
 daily
 rotate 30
 missingok
 compress
 postrotate
 /usr/bin/fail2ban-client flushlogs 1>/dev/null || true
 endscript
}

Мне удобней чтобы ротация проходила каждый день и хранилась 30 дней.

Сохраним и применим изменения без перезагрузки:

logrotate /etc/logrotate.conf

Работа с сервисом

Выведем информацию о работающих фильтрах:

fail2ban-client status
= вывод команды =
Status
|- Number of jail: 1
`- Jail list: sites-sevo44ru

Видим что активен один фильтр.

Выведем детальную информацию о фильтре:

fail2ban-client status sites-sevo44ru
= вывод команды =
Status for the jail: sites-sevo44ru
|- Filter
| |- Currently failed: 0
| |- Total failed: 4
| `- File list: /web/sites/sevo44.ru/log/access.log
`- Actions
 |- Currently banned: 1
 |- Total banned: 4
 `- Banned IP list: 92.53.96.68

Видим что всего было 4 срабатывания и 1 IP что заблокирован.

Для ручного блокирования используем команду:

fail2ban-client set sites-sevo44ru banip 91.200.12.91
= вывод команды =
91.200.12.91

Для ручного разблокирование используем команду:

fail2ban-client set sites-sevo44ru unbanip 91.200.12.91
= вывод команды =
91.200.12.91

Осталось окончательно убедится что сервис работает. Посмотрим текущие правила iptables:

iptables -L -v -n
= вывод команды. только интересующая нас часть =
Chain f2b-sites-sevo44ru (1 references)
 pkts bytes target prot opt in out source destination 
 0 0 REJECT all -- * * 91.200.12.91 0.0.0.0/0 reject-with icmp-port-unreachable
 0 0 REJECT all -- * * 92.53.96.68 0.0.0.0/0 reject-with icmp-port-unreachable
18949 3413K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0

Всё отлично. В выводе команды видим заблокированные ip адреса.

Результат

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Хотите сказать денежное спасибо? Подарите денежку!