Top.Mail.Ru
OSEN-НИЙ SAAALEСкидка 50% на виртуальный хостинг и VDS
до 30.11.2025 Подробнее
Выберите продукт

CrowdSec на VDS: поведенческий антибот и защита от брутфорса для Nginx и SSH

Разбираем, как защитить VDS от bruteforce и ботов с CrowdSec: архитектура, установка, коллекции для SSH и Nginx, firewall-блокировщик, nginx bouncer, whitelists, бан по репутации, cscli, работа за CDN и типичные ошибки.
CrowdSec на VDS: поведенческий антибот и защита от брутфорса для Nginx и SSH

Если вы привыкли к классической связке «лог-фильтр + firewall» для SSH и веба, то CrowdSec — это следующий шаг. Он анализирует логи, использует поведенческие сценарии и коллективную репутацию источников атак, а затем применяет решения (ban, captcha/throttle для HTTP) через «bouncers». В итоге безопасность на VDS перестает зависеть от ручных regex и устаревших шаблонов: система развивается вместе с атакующей экосистемой.

Что такое CrowdSec и чем он отличается от fail2ban

Идеология CrowdSec — не просто искать повторяющиеся ошибки аутентификации, а оценивать поведение. Для SSH это распознавание bruteforce через поддерживаемые сценарии. Для веба — обнаружение сканеров, парсеров, грубых переборов форм и других подозрительных паттернов. Главное отличие от классических инструментов вроде fail2ban — централизованный «хаб» сценариев, автоматические обновления и механизм обмена репутацией IP (бан по репутации). В результате вы получаете удобную альтернативу, которая проще поддерживается и лучше масштабируется.

Архитектура: агент читает логи и выносит решения, а «bouncer» их применяет — в firewall (nftables/iptables), на уровне Nginx (nginx bouncer), в приложении или на внешнем уровне. Управление — через консольный инструмент cscli.

Архитектура на практике

Роли компонентов простые:

  • Агент CrowdSec анализирует логи (SSH, Nginx, почта, БД, системные), держит локальный API (LAPI), хранит парсеры/сценарии и отдает решения.
  • Bouncers применяют решения: firewall-блокировщик добавляет IP в наборы nftables/iptables, а nginx bouncer может возвращать бан/капчу/троттлинг в реальном времени.
  • Hub/репутация: можно включить подписку на community blocklist, чтобы заранее отсекать регулярно замеченные в атаках адреса.

Firewall-блокировщик CrowdSec с nftables на сервере Linux

Целевой план для VDS

Настроим связку: анализ логов SSH и Nginx, принятие решений агентом, мгновенные блокировки на уровне firewall для SSH bruteforce и поведенческую защиту HTTP (через детектирование по access.log). При желании позже добавим nginx bouncer, чтобы выдавать капчу/бан-страницы без ожидания firewall-триггера.

Предпосылки

  • Linux на VDS (Debian/Ubuntu или RHEL-класс).
  • Nginx с access.log и error.log (по умолчанию — /var/log/nginx/access.log).
  • SSH пишет в journald или /var/log/auth.log.
  • Права root/sudo.

Если вы управляете сервером через панель, посмотрите свежий обзор, чтобы понимать ограничения и интеграции: панели управления для VDS в 2025.

FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Установка CrowdSec

На большинстве систем достаточно поставить агент из официального репозитория. Быстрый способ — установщик, который сам добавит репозиторий и ключи. После установки появятся бинарь cscli, служба crowdsec и дефолтная конфигурация.

curl -s https://install.crowdsec.net | sudo bash
sudo apt-get update
sudo apt-get install crowdsec

Для RHEL/AlmaLinux/Rocky используйте менеджер пакетов дистрибутива:

curl -s https://install.crowdsec.net | sudo bash
sudo dnf install crowdsec

Запускаем и добавляем в автозапуск:

sudo systemctl enable --now crowdsec

Проверяем статус и метрики:

sudo systemctl status crowdsec
sudo cscli metrics

Подключение логов: SSH и Nginx

По умолчанию агент на Debian/Ubuntu уже читает системные журналы и распознает попытки входа по SSH. Убедитесь, что journalctl показывает события авторизации.

Для Nginx создадим файл в acquis.d, указав путь к access.log и тип источника. Это подключит стандартные парсеры HTTP.

sudo mkdir -p /etc/crowdsec/acquis.d
sudo tee /etc/crowdsec/acquis.d/nginx.yaml > /dev/null <<'EOF'
filenames:
  - /var/log/nginx/access.log
labels:
  type: nginx
EOF
sudo systemctl restart crowdsec
sudo cscli metrics

Важно: если перед вашим Nginx стоит обратный прокси или CDN, включите восстановление реального адреса клиента (real_ip в Nginx). Иначе в логах вместо IP атакующего окажется адрес прокси, и firewall может заблокировать не того. Сначала исправляем real_ip, потом включаем детектирование.

Сценарии и коллекции: что включить

Обновим хаб и добавим наиболее полезные коллекции под SSH и HTTP. Коллекции — это наборы парсеров и сценариев.

sudo cscli hub update
sudo cscli collections install crowdsecurity/linux
sudo cscli collections install crowdsecurity/ssh
sudo cscli collections install crowdsecurity/nginx
sudo cscli collections install crowdsecurity/http-cve
sudo cscli collections install crowdsecurity/community-blocklist
sudo systemctl restart crowdsec
sudo cscli hub list | grep -E 'ssh|nginx|http|community'

С этого момента агент начнет распознавать типовые веб- и SSH-атаки, а также применять бан по репутации из community-blocklist. Продолжительность и тип решений управляются профилями.

Профили решений (profiles.yaml)

Файл профилей определяет, какое решение выносится и на какой срок, исходя из уровня доверия и гравитации поведения. Например: SSH bruteforce — ban на 4 часа; агрессивный сканер HTTP — ban на 1 час; для слабых индикаторов — мягче. Проверьте и при необходимости подправьте дефолтный профиль под свои требования.

Firewall-блокировщик: мгновенные баны для SSH и HTTP

Для остановки bruteforce и шумных сканеров лучше всего подходит firewall-bouncer: он хранит актуальные IP-решения в наборах nftables/iptables и блокирует трафик до прикладного уровня.

sudo apt-get install crowdsec-firewall-bouncer-nftables
# Если nftables недоступен, установите bouncer для iptables
# sudo apt-get install crowdsec-firewall-bouncer-iptables
sudo systemctl enable --now crowdsec-firewall-bouncer
sudo systemctl status crowdsec-firewall-bouncer

Проверим, что санкции применяются. Внесем тестовый бан и посмотрим, как он попал в наборы firewall:

sudo cscli decisions add --ip 203.0.113.10 --duration 4h --reason test-block
sudo cscli decisions list
sudo nft list ruleset | grep -i crowdsec

После установки firewall-блокировщика SSH-брюты будут отстреливаться автоматически. Как только агент распознает шаблон bruteforce по логам SSH, IP попадет в сет блокировок и будет отрезан до истечения TTL решения. Это же касается и HTTP-источников при нарушении сценариев веб-коллекций.

Nginx bouncer: поведенческий антибот на уровне HTTP

Firewall отлично режет злонамеренные источники, но HTTP-уровень дает дополнительные опции: показать капчу или замедлить трафик до «жесткого» бана. Для этого используется nginx bouncer, который общается с локальным API агента и на каждый запрос определяет: обычный ответ, капчу или запрет.

  1. Установите nginx-bouncer из репозитория CrowdSec.
  2. Сгенерируйте API-ключ: sudo cscli bouncers add nginx-bouncer.
  3. Пропишите ключ и адрес LAPI в конфиге bouncer; подключите сниппет в Nginx для нужных локаций.
  4. Перезагрузите Nginx и проверьте журналы bouncer и access.log.

Начните с защиты «чувствительных» локаций (панели админок, формы логина, API-эндпойнты) и отладочного режима, чтобы убедиться, что легитимный трафик не страдает.

Схема работы nginx bouncer: LAPI, капча и запрет для нарушителей

Выбор между firewall-блокировщиком и nginx bouncer

  • SSH — всегда firewall. Это быстрее и надежнее.
  • Публичный HTTP без интерактива — firewall плюс детектирование на основе логов.
  • Нужны капчи/тонкая логика по путям/методам — добавляйте nginx bouncer поверх.

Проверка работы: быстрые тесты

SSH: несколько раз ошибитесь паролем по SSH с внешнего IP и наблюдайте за решениями.

ssh user@your-vds.example
# Несколько неправильных попыток
sudo cscli decisions list
sudo journalctl -u crowdsec -n 100 --no-pager

Nginx: сгенерируйте аномально высокую частоту запросов к одной локации или имитируйте «вредные» пути. Проверьте, появился ли IP в решениях и применился ли бан.

ab -n 1000 -c 50 https://site.example/
sudo cscli decisions list
sudo tail -n 100 /var/log/nginx/access.log

Тонкая настройка: whitelists, профили и исключения

Whitelists нужны, чтобы не банить офисные сети, мониторинговые узлы и доверенные бэкенды. На практике полезно иметь два уровня:

  • Белые адреса на уровне Nginx/сервера (allow для служебных сетей, запрет остальным на критичные локации).
  • Белые адреса внутри CrowdSec (исключения для источников, которые не нужно анализировать, или для которых решения не должны выноситься).

Профили решений позволяют варьировать длительность банов, в том числе в зависимости от повторности нарушений. Например, первый инцидент — 30 минут, повтор в течение суток — 12 часов. Сценарии и коллекции регулярно обновляются, поэтому разумно раз в неделю делать обновление хаба.

sudo cscli hub update
sudo cscli upgrade
sudo cscli hub list -a

Работа за обратным прокси/CDN

Это частая причина ложных банов. Прежде чем включать детектирование по access.log, убедитесь, что в логе пишется реальный клиентский IP. Для этого настройте real_ip в Nginx под ваш CDN/прокси и проверьте, что в access.log виден ваш настоящий адрес, а не IP CDN. Только после этого подключайте acquis для Nginx и сценарии HTTP.

Если вы сначала включили CrowdSec, а потом real_ip, агент мог временно забанить адреса прокси. Восстановить доступ поможет удаление решений и очистка наборов firewall.

sudo cscli decisions delete --all
sudo systemctl restart crowdsec-firewall-bouncer

При переходе на HTTPS и ужесточении политики HSTS дополнительно пригодится чек-лист: перенос сайта на новый домен без потери SEO: 301 редиректы, HSTS и SSL.

Наблюдаемость и аудит

Команды для повседневной диагностики:

  • Список инцидентов и решений: cscli alerts list, cscli decisions list.
  • Статус парсеров/сценариев: cscli metrics.
  • Версии и обновления: cscli hub update, cscli upgrade.
  • Отладка источников логов: временно включайте повышенную детализацию логирования в конфиге CrowdSec и смотрите journalctl.

Безопасные практики эксплуатации

  • Синхронизируйте время (chrony/systemd-timesyncd), иначе TTL решений будет работать непредсказуемо.
  • Следите за логротейтом: access.log и auth.log должны ротироваться без потери чтения. При смене inode перезапускайте агент, если логридер не подхватил новый файл.
  • Периодически обновляйте хаб и сам софт, так как сценарии быстро эволюционируют.
  • Не включайте слишком агрессивные сценарии на старте. Начните с дефолтных SSH и базовых HTTP и постепенно расширяйте.
  • Храните ключи bouncer в отдельных файлах с ограниченными правами и не допускайте их утечки.

Сравнение с классическими подходами

В роли защиты от bruteforce SSH и простого веб-шумоподавления CrowdSec работает похоже на fail2ban, но выигрывает за счет централизованного хаба, стандартизированных сценариев и механизма репутации. Для HTTP у него есть плюс — интеграции уровня приложения (nginx bouncer), где можно не только банить, но и предъявлять капчу/замедлять. Это делает набор инструментов гибким для публичных сервисов и API.

Чек-лист внедрения на VDS

  • Установить агент CrowdSec, запустить и проверить метрики.
  • Подключить источники логов SSH и Nginx через acquis.d.
  • Включить коллекции: linux, ssh, nginx, community-blocklist.
  • Поставить firewall-bouncer (по возможности nftables).
  • Проверить бан: тестовый decision и наборы firewall.
  • Настроить real_ip, если есть прокси/CDN, и только потом включать HTTP-сценарии.
  • Опционально: внедрить nginx bouncer для капчи/троттлинга.
  • Настроить whitelists для доверенных сетей и мониторинга.
  • Включить регулярные обновления хаба и мониторинг журнала CrowdSec.

Итоги

CrowdSec закрывает две важные задачи на VDS: мгновенная и автоматическая ssh защита от переборов паролей с помощью firewall-блокировщика и поведенческий антибот для веба (через HTTP-детектирование и при необходимости nginx bouncer). Добавьте к этому бан по репутации, регулярные обновления сценариев и стандартизованный cscli — и вы получите «щит», который работает не только по шаблонам, но и по реальной динамике злоумышленников. Начните с базовой схемы, аккуратно включайте дополнительные сценарии и не забывайте про whitelists и real_ip — такой подход дает максимальный эффект без ложных срабатываний.

Поделиться статьей

Вам будет интересно

Hardening сервисов на VDS: sandbox опции systemd — ProtectSystem, PrivateTmp, CapabilityBoundingSet OpenAI Статья написана AI Fastfox

Hardening сервисов на VDS: sandbox опции systemd — ProtectSystem, PrivateTmp, CapabilityBoundingSet

Как ограничить права Linux‑сервисов на VDS с помощью sandbox‑опций systemd. Разбираем ProtectSystem, PrivateTmp, CapabilityBoundin ...
Память на малом VDS без сюрпризов: swap, zram, vm.overcommit и OOM‑killer на практике OpenAI Статья написана AI Fastfox

Память на малом VDS без сюрпризов: swap, zram, vm.overcommit и OOM‑killer на практике

Малый VDS часто упирается в память: PHP‑FPM, базы, кэш и воркеры делят считанные гигабайты. Ошибка Killed в логах и зависания — пр ...
Wildcard DNS и превью‑стенды: поддомены на каждую ветку Git через Nginx map на VDS OpenAI Статья написана AI Fastfox

Wildcard DNS и превью‑стенды: поддомены на каждую ветку Git через Nginx map на VDS

Показываю рабочую схему превью‑стендов: одна VDS, wildcard DNS на dev‑домен, Nginx с map и скрипты, поднимающие приложения на уник ...