Заметки по системному администрированию в основном пишу для себя, в интернете как говорится целее будет. Но вдруг кому-то пригодится.
Боты занимают немало траффика сервера, плюс лишняя нагрузка. Поэтому их нужно блокировать. Есть много способов блокировки. Желательно это делать до веб-сервера (не важно что там: Angie, Nginx, Apache или Nginx-Unit), чтобы блокировалось на уровне Iptables. Одним из инструментов является fail2ban, который работает следующим образом: анализирует логи приложения (например вебсервера или SSH), и только затем уже добавляет правила в iptables. Инструмент достаточно прост в настройке и использовании. От DDDoS не защитит, но от ботов вполне.
Установка в Ubuntu/Debian:
sudo apt install fail2ban
Затем
systemctl enable fail2ban
systemctl start fail2ban
Из коробки настроена блокировка SSH. Мы же будем настраивать блокировку форка NGINX: веб-сервер Angie, который я использую на всех своих проектах, т.к. больше возможностей + есть автоматическая поддержка выпуска сертификатов Lets Encryped. Не надо никаких certbot и пр., прописал три строчки в конфиге и сертификаты сами будут обновляться!
Создаем файл фильтра (я предпочитаю MC, поэтому в качестве редактора использую MCEDIT, но естественно можно использовать nano, vim и т.д.)
mcedit /etc/fail2ban/filter.d/angie-access.conf
У меня фильтры такие:
# Fail2Ban filter для анализа логов angie
[Definition]
failregex =
(?i)<HOST>.*"(GET|POST).*/wp-admin/setup-config\.php\?
(?i)<HOST>.*"(GET|POST).*/usr/local/lib/php/
(?i)<HOST>.*"(GET|POST).*/(ini|index-ajax|wso|xleet|system-log|shell|eval-stdin)\.php
(?i)<HOST>.*"(GET|POST).*/\.(asp|cgi|env|DS_Store|vs_code)
(?i)<HOST>.*"(GET|POST).*/cgi-bin/
(?i)<HOST>.*"(GET|POST).*/(config\.ini|php\.ini)
(?i)<HOST>.*"GET /(testing|backup|new|old|newsite).*" 404
(?i)<HOST>.*"(GET|POST).*(SemrushBot|yacybot|DataForSeoBot|DotBot)
Периодически анализирую логи (подробнее о скрипте, помогающим мне это: https://dzen.ru/a/Z0gN5kkmojfVcBzy), смотрю кто куда ломится и добавляю правила по мере необходимости.
Далее создаем экшен.
mcedit /etc/fail2ban/jail.d/angie.conf
Вставляем:
[angie-access]
enabled = true
port = http,https
filter = angie-access
logpath = /var/log/angie/access*.log
bantime = 84600
findtime = 1800
maxretry = 1
action = iptables-multiport[name=angie-access, port="http,https"]
Директивы легко гугляться. Если нужен вечный бан, то bantime=-1
Перезапускаем сервис:
systemctl restart fail2ban
Если используется Debian 12, то при запуске службы может возникнуть ошибка:
ERROR Failed during configuration: Have not found any log file for sshd jail
Тогда необходимо в файле /etc/fail2ban/jail.d/defaults-debian.conf добавить строку backend=systemd, т.е. должно получится так:
[sshd]
backend=systemd
enabled = true
В другой ОС, конфигурация sshd может распологаться в другом месте.
Чтобы посмотреть список забанненых IP, вводим команду:
fail2ban-client status angie-access
или
fail2ban-client banned
Удаление IP адреса из бана:
fail2ban-client set angie-access unbanip 8.8.8.8
Статистика fail2ban при входе в систему
При входе по SSH удобно видеть статистику fail2ban. Но если заходить не из под root, то fail2ban будет ругаться на права доступа. Поэтому сперва нужно добавить команду в правило SUDO.
Создаем файл с правилами для sudo (my_user заменить на своего пользователя):
mcedit /etc/sudoers.d/my_user
В него вставляем
Cmnd_Alias FAIL2BAN = /usr/bin/fail2ban-client *
my_user ALL=(root) NOPASSWD: FAIL2BAN
Файлу выставляем права 0440:
sudo chmod 0440 /etc/sudoers.d/my_user
Затем в конец ~/.bash_profile или ~/.bashrc добавляем команду, которая будет выполняться при входе:
# при логине сразу выводим статус jail angie-access
sudo -n fail2ban-client status angie-access
Можно добавить в sshd_config в раздел Match User , ForceCommand, но я бы не рекомендовал этот вариант. Т.к. если что-то пойдет не так, то войти не сможете.