Каждый публичный Linux-сервер подвергается непрерывному сканированию: автоматизированные ботнеты перебирают пароли к SSH, ищут открытые административные панели и уязвимости в веб-серверах уже через несколько минут после запуска VDS. Десятилетиями стандартом защиты по умолчанию оставался Fail2ban. Однако в эпоху контейнеризации и распределенных атак классический Fail2ban упирается в серьезные архитектурные ограничения: высокое потребление ресурсов процессора при разборе больших объемов журналов, сложности интеграции с сетевым стеком Docker и локальный характер блокировок.
На смену устаревшим утилитам пришел CrowdSec — современный open-source движок безопасности, написанный на Go. CrowdSec совмещает локальный анализ поведения на базе декларативных YAML-сценариев с коллективным иммунитетом (Cyber Threat Intelligence, CTI): если IP-адрес атакующего заблокирован на тысячах серверов других участников сети, он автоматически блокируется и на вашем VDS еще до того, как совершит первую попытку взлома. В этой практической инструкции мы разберем развертывание CrowdSec в Docker Compose, интеграцию со сбором журналов контейнеров и подключение файрвол-баунсера к nftables.
1. Почему Fail2ban уступает CrowdSec в инфраструктуре с Docker
Fail2ban был разработан более 20 лет назад для монолитных серверов. При попытке защитить современный стек на базе Docker, Nginx и микросервисов администратор неизбежно сталкивается с рядом системных проблем:
- Тяжелые регулярные выражения: Fail2ban написан на Python и парсит строки логов через сложные Regex. При всплеске паразитного трафика (DDoS или агрессивный веб-сканер) процесс Fail2ban загружает ядро CPU на 100%, замедляя работу боевых сайтов.
- Проблема обхода UFW Docker-контейнерами: Docker публикует порты через собственную цепочку
PREROUTINGв обход стандартных пользовательских правил UFW. Традиционный Fail2ban, настроенный на стандартный файрвол, часто блокирует пакеты впустую, оставляя контейнеры открытыми для атак (подробнее этот механизм разобран в статье о том, как закрыть порты Docker от обхода файрвола). - Локальная изоляция: Fail2ban начинает реагировать только постфактум — после того, как злоумышленник уже совершил заданное количество неудачных попыток входа на вашем конкретном сервере.
| Критерий | Fail2ban | CrowdSec |
|---|---|---|
| Язык и производительность | Python (высокая нагрузка на CPU при больших логах) | Go (базовый процесс 35–60 МБ RAM; официально рекомендуется от 100–150 МБ при загрузке CTI-блоклистов) |
| Парсинг событий | Регулярные выражения (Regex) | Декларативные YAML-парсеры (Grok-паттерны) |
| Коллективный CTI-иммунитет | Отсутствует (каждый сервер защищается в одиночку) | Глобальная база репутации (превентивная блокировка известных ботнетов) |
| Сбор логов Docker | Требует монтирования файлов или сторонних драйверов | Прямой стриминг через Docker API сокет (директива source: docker) |
| Архитектура блокировок | Жестко привязана к локальным вызовам iptables | Модульная: отдельные Bouncers для nftables, Nginx, Caddy, Cloudflare |
| Мониторинг и дашборд | Только консоль CLI и текстовые файлы логов | Бесплатная облачная панель CrowdSec Console и метрики Prometheus |
2. Архитектура CrowdSec: Security Engine, LAPI и Remediation Bouncers
Для эффективного администрирования важно понимать разделение ответственности в архитектуре CrowdSec:
- Security Engine (Агент обнаружения): Читает потоки журналов (auth.log, syslog, журналы Docker, логи веб-серверов), нормализует строки с помощью парсеров и сопоставляет последовательности событий со сценариями атак (брутфорс, сканирование портов, перебор URL). Сам движок обнаружения не блокирует сетевые пакеты.
- Local API (LAPI): Внутренний REST API сервис, работающий по умолчанию на порту 8080. Движок обнаружения отправляет в LAPI сигнал о зафиксированной угрозе. LAPI сохраняет решение (Decision) в локальную базу данных (SQLite или PostgreSQL) и передает его компонентам исполнения.
- Remediation Components (Bouncers): Специализированные сервисы, которые опрашивают LAPI и физически применяют наказание. Для блокировки сетевого трафика на уровне ядра операционной системы используется
crowdsec-firewall-bouncer, взаимодействующий с подсистемойnftables. Существуют также баунсеры уровня приложений (AppSec/WAF) для Nginx, Caddy и Traefik, способные возвращать пользователю капчу вместо полного сброса соединения.
💡 Совет инженера: проверка чистоты IP-адреса перед запуском
Перед развертыванием сервисов и настройкой жестких правил безопасности убедитесь, что IP-адрес вашего нового VDS не числится в спам-базах из-за активности предыдущих арендаторов. Выполните быструю проверку через онлайн-чекер спам-баз DNSBL и проверьте закрытость портов через онлайн-сканер портов SysKit.
3. Подготовка Linux VDS: проверка nftables и устранение конфликтов
Современные дистрибутивы Linux (Ubuntu 24.04 / 22.04 LTS, Debian 12) используют nftables в качестве основной высокопроизводительной подсистемы пакетной фильтрации ядра. CrowdSec Firewall Bouncer создает в nftables отдельную изолированную таблицу crowdsec со значением приоритета по умолчанию -10 (директива nftables.ipv4.priority: -10), опережающим стандартные цепочки фильтрации (приоритет 0). При необходимости в конфигурации баунсера приоритет можно изменить вручную (например, выставить -100, если требуется опережать специфические raw-цепочки). Благодаря этому заблокированные хосты отсекаются ядром еще до анализа правил Docker или UFW.
Подключитесь к серверу по SSH и убедитесь в наличии установленного пакета nftables:
sudo apt update && sudo apt install -y nftables curl jq
sudo systemctl enable nftables
sudo systemctl start nftables
sudo nft list ruleset
Если на вашем сервере ранее был установлен и запущен Fail2ban, его необходимо остановить и отключить во избежание конфликтов и двойных блокировок одного и того же сетевого трафика:
sudo systemctl stop fail2ban
sudo systemctl disable fail2ban
4. Развертывание CrowdSec Security Engine в Docker Compose
Для максимальной изоляции и простоты обновлений сам движок CrowdSec запускается в Docker Compose. При этом каталоги конфигурации и базы данных монтируются в постоянные именованные тома. Начиная с версии CrowdSec 1.7+, сохранение каталога /var/lib/crowdsec/data/ является обязательным требованием.
Создайте рабочую директорию проекта, например /opt/crowdsec:
sudo mkdir -p /opt/crowdsec/config
cd /opt/crowdsec
Создайте файл манифеста docker-compose.yml:
services:
crowdsec:
image: crowdsecurity/crowdsec:latest
container_name: crowdsec
restart: unless-stopped
environment:
# Автоматическая установка базовых коллекций при первом запуске
COLLECTIONS: "crowdsecurity/linux crowdsecurity/sshd crowdsecurity/nginx crowdsecurity/http-cve"
GID: "1000"
CUSTOM_HOSTNAME: "vds-production-node"
ports:
# LAPI доступен локально для хоста и баунсера
- "127.0.0.1:8080:8080"
volumes:
# Конфигурация и сценарии
- crowdsec-config:/etc/crowdsec/
# Постоянное хранилище базы решений (SQLite)
- crowdsec-data:/var/lib/crowdsec/data/
# Локальный файл источников данных
- ./config/acquis.yaml:/etc/crowdsec/acquis.yaml:ro
# Логи хоста для анализа попыток входа по SSH
- /var/log:/var/log:ro
# Сокет Docker для прямого стриминга логов контейнеров
- /var/run/docker.sock:/var/run/docker.sock:ro
security_opt:
- no-new-privileges:true
volumes:
crowdsec-config:
crowdsec-data:
⚠️ Важное предупреждение: монтирование docker.sock
Монтирование /var/run/docker.sock:ro в режиме «только для чтения» позволяет CrowdSec автоматически обнаруживать запущенные веб-серверы и прокси, перехватывая события контейнеров без доступа к модификации или остановке контейнеров на хосте.
Для генерации эталонной защищенной конфигурации демона SSH воспользуйтесь нашим интерактивным инструментом:
💡 Рекомендация по оперативной памяти (RAM)
Сам скомпилированный бинарный процесс CrowdSec на Go в режиме ожидания потребляет всего 35–60 МБ RAM. Однако официальная документация CrowdSec рекомендует выделять не менее 100–150 МБ оперативной памяти под контейнер. Этот объем необходим при подписке на глобальные списки репутации CTI (содержащие десятки тысяч IP-адресов) и буферизации логов при резких всплесках сетевого трафика.
5. Настройка сбора логов (acquis.yaml) для SSH и Docker-контейнеров
Файл acquis.yaml (Acquisition) указывает CrowdSec, какие источники событий необходимо непрерывно отслеживать. Создайте файл /opt/crowdsec/config/acquis.yaml:
# 1. Сбор журналов авторизации хоста (SSH, sudo, system auth)
filenames:
- /var/log/auth.log
- /var/log/syslog
labels:
type: syslog
---
# 2. Автоматический перехват логов из контейнеров Docker по меткам
source: docker
use_container_labels: true
---
# 3. Прямой сбор логов веб-сервера Nginx (по имени контейнера)
source: docker
container_name:
- nginx
- reverse-proxy
labels:
type: nginx
Благодаря опции use_container_labels: true, вам не нужно вручную прописывать каждый новый сервис в acquis.yaml. Достаточно добавить в docker-compose.yml любого вашего контейнера (например, WordPress или кастомного API) специальные метки:
labels:
- "crowdsec.enable=true"
- "crowdsec.labels.type=nginx"
6. Установка и привязка Firewall Bouncer на уровне ядра Linux
Сам контейнер CrowdSec только анализирует события и принимает решения. Чтобы вредоносные сетевые пакеты физически сбрасывались файрволом, установим официальный компонент CrowdSec Firewall Bouncer прямо на хост-систему с бэкендом nftables.
Запустите контейнер CrowdSec:
cd /opt/crowdsec
sudo docker compose up -d
Сгенерируйте уникальный API-ключ для нового баунсера внутри контейнера:
sudo docker exec crowdsec cscli bouncers add host-nftables-bouncer
Команда выведет созданный API-ключ вида 4a8f9c1b2e3d4f5a6b7c8d9e0f1a2b3c. Сохраните его. Теперь подключим официальный репозиторий CrowdSec и установим баунсер на хосте:
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt install -y crowdsec-firewall-bouncer-nftables
Откройте конфигурационный файл баунсера /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml и укажите сгенерированный ключ и адрес локального API контейнера:
api_url: http://127.0.0.1:8080/
api_key: 4a8f9c1b2e3d4f5a6b7c8d9e0f1a2b3c
mode: nftables
update_frequency: 10s
blacklists_ipv4: crowdsec-blacklists
blacklists_ipv6: crowdsec6-blacklists
# Приоритет по умолчанию в nftables равен -10 (выше стандартного filter с 0):
# nftables:
# ipv4:
# priority: -10
Перезапустите службу баунсера и проверьте её статус:
sudo systemctl restart crowdsec-firewall-bouncer
sudo systemctl status crowdsec-firewall-bouncer
Убедитесь, что баунсер успешно зарегистрировался в LAPI:
sudo docker exec crowdsec cscli bouncers list
В выводе появится запись host-nftables-bouncer со статусом активного подключения и версией компонента.
7. Установка коллекций правил: SSH, Nginx, сканеры уязвимостей и CVE
Коллекция (Collection) в CrowdSec — это комплексный пакет, включающий в себя парсеры строк логов и готовые сценарии выявления аномалий. Управлять коллекциями можно «на лету» через CLI-утилиту cscli внутри контейнера.
Проверьте установленные коллекции:
sudo docker exec crowdsec cscli collections list
Установите дополнительные проверенные коллекции защиты для веб-серверов и популярных CMS:
# Защита от поиска уязвимостей и path traversal
sudo docker exec crowdsec cscli collections install crowdsecurity/http-cve
# Защита от сканеров веб-портов и ботов
sudo docker exec crowdsec cscli collections install crowdsecurity/web-scanners
# Блокировка попыток брутфорса WordPress (xmlrpc, wp-login)
sudo docker exec crowdsec cscli collections install crowdsecurity/wordpress
# Перезапуск движка для применения правил
sudo docker exec crowdsec cscli reload
8. Настройка белого списка (Whitelist) и защита от случайного самобана
Один из главных страхов системного администратора при настройке агрессивных IPS/IDS систем — случайно заблокировать собственный статический IP-адрес или офисную сеть при опечатке в пароле SSH или тестировании API.
Для создания гарантированного белого списка создайте файл описания парсера whitelist.yaml в каталоге парсеров enrichment. Узнайте свой текущий публичный IP-адрес с помощью сервиса определения IP SysKit и создайте файл на хосте:
sudo docker exec -it crowdsec mkdir -p /etc/crowdsec/parsers/s02-enrich/
Создайте файл /opt/crowdsec/config/my-whitelist.yaml со следующим содержимым:
name: syskit/admin-whitelist
description: "Исключение доверенных IP-адресов администратора и мониторинга"
whitelist:
reason: "Доверенный домашний/офисный статический IP"
ip:
- "198.51.100.42" # Замените на ваш фактический IP
cidr:
- "192.168.1.0/24" # Доверенные локальные подсети
- "10.0.0.0/8"
Скопируйте его в рабочий том контейнера и примените конфигурацию:
sudo docker cp /opt/crowdsec/config/my-whitelist.yaml crowdsec:/etc/crowdsec/parsers/s02-enrich/my-whitelist.yaml
sudo docker exec crowdsec cscli reload
Если блокировка вашего IP всё же произошла, снимите её мгновенно одной командой через аварийную веб-консоль хостера:
sudo docker exec crowdsec cscli decisions delete --ip 198.51.100.42
9. Подключение к бесплатной консоли CrowdSec Console и мониторинг
Одной из мощнейших возможностей CrowdSec является интеграция с SaaS-панелью CrowdSec Console (app.crowdsec.net). Она бесплатна для персонального использования и серверов небольших компаний.
Преимущества подключения к консоли:
- Наглядная статистика атак: География атакующих ботнетов, типы сценариев (брутфорс SSH, поиск эксплойтов), распределение по времени.
- Автоматическая подписка на Blocklists: Консоль позволяет в 1 клик подключить премиальные списки вредоносных IP (Tor exit nodes, известные сканеры Shodan/Censys, вредоносные прокси).
- Оповещения в реальном времени: Отправка уведомлений о массированных атаках в Telegram, Slack или Webhook.
Зарегистрируйтесь на app.crowdsec.net, нажмите «Enroll an Instance» и скопируйте предоставленный уникальный ключ регистрации. Привяжите ваш VDS:
sudo docker exec crowdsec cscli console enroll clx9876543210abcdef
Перейдите в веб-интерфейс консоли и подтвердите добавление экземпляра. В течение 2–3 минут в дашборде отобразится телеметрия вашего VDS и статус активности баунсеров.
Рекомендуемые VDS-провайдеры
Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с
Timeweb Cloud — Быстрые NVMe VDS
Надежная платформа для развертывания CrowdSec и Docker: высокая производительность дисков NVMe, защита от сетевого флуда и дата-центры в РФ и Европе.
Selectel — Надежность Tier III
Серверы корпоративного класса с гарантированной доступностью SLA 99.98% и выделенными портами для безопасного размещения продакшен-баз и сетевых шлюзов.
Beget — Простой старт
Удобные VDS с моментальной установкой Docker, чистыми статическими IPv4-адресами и бесплатным автоматическим резервным копированием.
10. Проверка защиты: симуляция атак, просмотр блокировок в cscli и nftables
После завершения настройки необходимо на практике убедиться, что связка работает: события фиксируются парсерами, решения регистрируются в LAPI, а баунсер оперативно добавляет IP в таблицы блокировки nftables.
Для просмотра текущих активных решений и заблокированных адресов выполните:
sudo docker exec crowdsec cscli decisions list
В выводе вы увидите список заблокированных IP, сработавший сценарий (например, crowdsecurity/sshd-bf), тип санкции (ban) и оставшееся время действия блокировки (по умолчанию 4 часа).
Проверьте наполнение наборов правил непосредственно в файрволе ядра Linux:
sudo nft list set ip crowdsec crowdsec-blacklists
Если набор содержит заблокированные IP-адреса, баунсер функционирует корректно. Любой пакет с этих адресов отбрасывается ядром на сетевой карте без передачи в стек пользовательских приложений.
Для просмотра детализированной аналитики по разобранным строкам логов и сработавшим триггерам запустите команду вывода метрик:
sudo docker exec crowdsec cscli metrics
Вывод покажет статистику по каждому источнику данных (файлы auth.log, сокет Docker), процент успешно сопоставленных строк и количество отброшенных событий. Если вы заметили подозрительную активность на сервере, ознакомьтесь также с практическим руководством по базовому харденингу Linux VDS для комплексного закрытия векторов атак.
Защитите инфраструктуру на надежном VDS
Разверните связку CrowdSec и Docker на скоростных серверах с чистыми IP-адресами, аппаратной защитой от DDoS и удобным управлением.