Fail2Ban — это инструмент, который проверяет логи сервера (файлы, где записываются действия, например, попытки входа), находит подозрительные действия, такие как многократный ввод неверного пароля, и блокирует IP-адреса атакующих.
Хотите разбирать реальные случаи взломов и разбираться в киберугрозах?
В своём Telegram-канале Security Controls я делюсь историями атак, методами защиты и разбором уязвимостей. Подписывайтесь, если тема безопасности вам интересна.
Установка Fail2Ban
Атака на сервер началась, и нужно быстро установить защиту. Fail2Ban устанавливается за несколько минут. Откройте терминал и выполните команду для вашей операционной системы. На Ubuntu или Debian:
sudo apt update && sudo apt install fail2ban
На CentOS 7 активируйте EPEL-репозиторий — это хранилище дополнительных пакетов, включая Fail2Ban:
sudo yum install epel-release sudo yum install fail2ban
На CentOS 8, RHEL 8 или новее используйте dnf — современный менеджер пакетов:
sudo dnf install epel-release
sudo dnf install fail2ban
Если вы работаете на Windows, установите WSL2 — подсистему, которая позволяет запускать Linux внутри Windows. Скачайте WSL2 через Microsoft Store, выберите Ubuntu и выполните команду для Ubuntu. После установки в папке /etc/fail2ban появится файл jail.conf — это шаблон настроек Fail2Ban.
Чтобы ваши изменения не удалились при обновлениях программы, создайте копию файла:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Теперь Fail2Ban установлен и готов к настройке. Вы сделали первый шаг к защите сервера. Какую систему вы используете — Linux или Windows с WSL2?
Настройка логов и параметров
Ваш сайт на WordPress стал медленно загружаться. Вы проверяете логи и видите тысячи запросов к странице /wp-login.php — это попытка взлома. Fail2Ban может остановить атаку, но нужно указать, где искать такие угрозы.
Логи — это файлы, в которых сервер записывает все действия, например, кто пытался войти или какие страницы запрашивали.
Откройте файл jail.local в текстовом редакторе, например, nano (это простой редактор для терминала):
sudo nano /etc/fail2ban/jail.local
Укажите пути к логам для сервисов, которые хотите защитить:
SSH (удалённый доступ к серверу): /var/log/auth.log на Ubuntu/Debian или /var/log/secure на CentOS/RHEL.
Nginx (веб-сервер): /var/log/nginx/access.log для анализа запросов или /var/log/nginx/error.log для ошибок.
Apache (другой веб-сервер): /var/log/apache2/error.log на Ubuntu/Debian или /var/log/httpd/error_log на CentOS/RHEL.
Настройте основные параметры в секции [DEFAULT]:
bantime = 600 — блокировать IP на 10 минут (600 секунд).
maxretry = 5 — разрешить 5 неудачных попыток входа перед блокировкой.
findtime = 600 — проверять попытки за последние 10 минут.
Иногда вы сами можете ошибиться, вводя пароль, и случайно заблокировать себя. Чтобы этого избежать, добавьте свой IP-адрес в список исключений. Узнайте ваш публичный IP (адрес, который сервер видит в интернете):
Добавьте его в jail.local:
ignoreip = 127.0.0.1 93.184.216.34 # Замените 93.184.216.34 на ваш IP
Это говорит Fail2Ban игнорировать ваши действия, даже если вы ошибётесь с паролем. Вот пример настройки для SSH:
[sshd] enabled = true port = 22 logpath = /var/log/auth.log maxretry = 5 bantime = 600 findtime = 600
Сохраните файл в nano (нажмите Ctrl+O, Enter, затем Ctrl+X) и перезапустите Fail2Ban, чтобы применить настройки:
sudo systemctl restart fail2ban
Проверьте, что защита активна:
sudo fail2ban-client status sshd
Теперь ваш WordPress-сайт защищён — Fail2Ban блокирует атакующие IP, и страницы снова загружаются быстро. Какой сервис вы хотите защитить первым?
Проверка фильтров
Ваш сервер хостит блог на WordPress, и вы замечаете, что кто-то пытается подобрать пароль к странице входа. Fail2Ban использует фильтры — это правила, которые ищут в логах признаки атак, например, многократные запросы с ошибками. Чтобы убедиться, что фильтр работает правильно, протестируйте его:
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-http-auth.conf
Эта команда проверяет, сколько записей в логе соответствуют правилу, и помогает избежать блокировки легитимных пользователей.
Для Nginx создайте фильтр /etc/fail2ban/filter.d/nginx-auth.conf, чтобы ловить попытки входа с ошибками:
[Definition] failregex = ^<HOST>.*"POST /login.* (401|403)
Для Apache создайте /etc/fail2ban/filter.d/apache-auth.conf:
[Definition] failregex = ^<HOST>.*"POST /login.* (401|403)
Для WordPress настройте фильтр /etc/fail2ban/filter.d/wordpress.conf, чтобы защитить страницу /wp-login.php:
[Definition] failregex = ^<HOST>.*"POST /wp-login.php.* (200|403|404)
Этот фильтр ловит запросы к странице входа, даже если сервер отвечает кодами 200 (успех), 403 (доступ запрещён) или 404 (страница не найдена). Активируйте фильтры в jail.local:
[nginx-auth] enabled = true logpath = /var/log/nginx/access.log maxretry = 5 bantime = 600 findtime = 600 [apache-auth] enabled = true logpath = /var/log/apache2/error.log maxretry = 5 bantime = 600 findtime = 600 [wordpress] enabled = true logpath = /var/log/nginx/access.log maxretry = 5 bantime = 600 findtime = 600
Будьте осторожны с кодом 403, чтобы не заблокировать обычных посетителей, например, тех, кто ошибся в URL. Теперь ваш блог защищён от атак на страницу входа, и вы можете сосредоточиться на создании контента. Какие фильтры вы хотите настроить?
Настройка уведомлений
Сколько времени вы готовы тратить на проверку логов вручную — полчаса в день или больше? Fail2Ban может автоматически сообщать вам о заблокированных IP, чтобы вы всегда знали, что происходит. Для отправки уведомлений на почту настройте действие action_mwl в jail.local. Сначала установите почтовую программу:
Postfix — это сервер для отправки писем, который Fail2Ban использует, чтобы слать вам отчёты. Если вы предпочитаете Telegram, настройте уведомления так:
Откройте Telegram, найдите @botfather (это сервис для создания ботов) и напишите /start. Следуйте инструкциям, чтобы создать бота, и сохраните токен (это строка вроде 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11).
Узнайте ID вашего чата через @userinfobot. Напишите ему любое сообщение, и он ответит номером, например, 123456789.
Создайте файл /etc/fail2ban/action.d/telegram.conf:
[Definition] actionban = curl -s -X POST "https://api.telegram.org/bot<ТОКЕН>/sendMessage" -d "chat_id=<ID_чата>&text=Заблокирован IP: <IP>"
Замените <ТОКЕН> и <ID_чата> на ваши значения. Добавьте действие в jail.local, например, для SSH:
[sshd] enabled = true port = 22 logpath = /var/log/auth.log maxretry = 5 bantime = 600 findtime = 600 action = %(action_)s telegram
sudo systemctl restart fail2ban
Теперь ваш телефон получает сообщение: «Заблокирован IP: 203.0.113.1». Вы сразу знаете об атаке, не заходя в терминал. Какие уведомления вам удобнее — почта или Telegram?
Геофильтрация для защиты
Вы видите в логах, что атаки идут из определённой страны, и хотите их ограничить. Геофильтрация блокирует IP из выбранных регионов, уменьшая количество угроз. Установите инструменты:
sudo apt install jq geoip-bin
jq — это утилита для работы с данными, а geoip-bin — инструмент для определения страны по IP. Зарегистрируйтесь на сайте MaxMind, чтобы получить базы GeoIP — они содержат информацию о географии IP-адресов.
Регулярно обновляйте базы:
Создайте скрипт /usr/local/bin/geoip-check для блокировки IP, например, из Китая:
#!/bin/bash country=$(geoiplookup $1 | awk -F ', ' '{print $2}') [[ "$country" == "CN" ]] && exit 0 || exit 1
Сделайте скрипт исполняемым:
chmod +x /usr/local/bin/geoip-check
В jail.local настройте действие, например, для SSH:
[sshd] enabled = true port = 22 logpath = /var/log/auth.log maxretry = 5 bantime = 600 findtime = 600 actionban = /usr/local/bin/geoip-check <ip> && iptables -A INPUT -s <ip> -j DROP
iptables — это инструмент для управления сетевыми правилами, здесь он блокирует IP. Проверяйте настройки, чтобы не заблокировать пользователей с VPN, иначе ваши клиенты могут потерять доступ. После настройки геофильтрации атаки из выбранного региона прекращаются, и сервер работает стабильнее.
Защита контейнеров
Вы запустили приложение в Docker, но заметили подозрительные запросы. Fail2Ban может защитить контейнеры, такие как Docker или Kubernetes. Контейнеры — это изолированные среды для приложений, которые часто используются для веб-серверов или баз данных. Если Docker пишет логи в syslog (системный журнал хоста), укажите в jail.local:
logpath = /var/log/syslog
syslog — это стандартный файл, куда сервер записывает системные события, включая действия контейнеров.
Если контейнер выводит логи в stdout (стандартный вывод, который можно перенаправить), настройте JSON-драйвер логов:
sudo mkdir /var/log/docker sudo docker run --log-driver=json-file --log-opt max-size=10m -v /var/log/docker:/var/log your-container
JSON-драйвер сохраняет логи в формате JSON, который Fail2Ban может читать. В jail.local укажите путь:
logpath = /var/log/docker/*.log
Для Kubernetes, где имена логов сложные, используйте шаблон:
logpath = /var/log/containers/*_namespace_app*.log
Убедитесь, что SELinux или AppArmor не блокируют доступ к логам. SELinux и AppArmor — это системы безопасности, которые ограничивают действия программ. Для тестирования временно отключите SELinux:
Предупреждение: Отключение SELinux снижает безопасность. Вместо этого настройте политики SELinux с помощью semanage (для управления правилами) или AppArmor с помощью aa-genprof (для создания профилей). Теперь ваш Docker-контейнер защищён, и приложение работает без сбоев.
Защита от атак и мониторинг
Атаки на серверы, особенно DDoS (массированные запросы, перегружающие сервер), становятся всё более частыми, затрагивая многие облачные сервисы. Fail2Ban эффективно останавливает брутфорс — попытки подбора пароля, но не справляется с DDoS, так как работает только на вашем сервере. Для защиты от брутфорса настройте в jail.local:
bantime = 600 bantime.increment = true bantime.multiplier = 2 # 10m -> 20m -> 40m при повторных атаках
Эти настройки увеличивают время блокировки для повторных атак: первая блокировка — 10 минут, вторая — 20 минут, третья — 40 минут. Если пользователь успешно входит, счётчик сбрасывается. Для атак с множеством IP используйте ipset — инструмент для хранения списков IP:
action = %(action_)s ipset
Для защиты от DDoS подключите WAF (например, ModSecurity) или CDN. WAF (Web Application Firewall) — это фильтр, который проверяет запросы к вашему сайту и блокирует вредоносные. CDN (Content Delivery Network) — это сеть серверов, распределяющая трафик, чтобы снизить нагрузку. Для примера, если вы используете Cloudflare, настройте интеграцию:
Добавьте API-ключ Cloudflare в конфигурацию скрипта, следуя инструкциям репозитория. CrowdSec дополнит защиту, позволяя обмениваться списками опасных IP с другими серверами. CrowdSec — это инструмент, который собирает данные об атаках и делится ими для коллективной защиты.
Следите за работой Fail2Ban, проверяя логи:
tail -f /var/log/fail2ban.log
Эта команда показывает логи в реальном времени. Узнайте, какие IP заблокированы:
sudo fail2ban-client status
Ваш сервер переживает атаку, но Fail2Ban останавливает брутфорс, а дополнительные инструменты, такие как WAF, помогают справиться с DDoS. Пользователи даже не заметили проблем. Какой тип атак вы хотите предотвратить?
Вы защитили свой сервер. Fail2Ban работает в фоновом режиме, блокируя угрозы, а вы получаете уведомления в Telegram о каждой попытке атаки. Теперь можно сосредоточиться на развитии проекта, не беспокоясь о хакерах. Какие шаги вы применили первыми? Делитесь своим опытом в комментариях — расскажите, как Fail2Ban помог вашему серверу! 🚀
#Fail2Ban #SysAdmin #Cybersecurity #Linux #DevOps #ServerSecurity #NetworkSecurity #CloudSecurity #Docker #Kubernetes