Traefik — 7. как подключить защиту CrowdSec
7 января 2026
CrowdSec (Crowd Security) — это система для защиты серверов и контейнеров от сетевых атак (Web Application Firewall, WAF, файрвол веб-приложений). Она использует коллективный разум сообщества для обнаружения и предотвращения угроз. CrowdSec анализирует сетевой трафик и поведение системы, чтобы выявить подозрительные действия, которые могут указывать на атаку. Система использует алгоритмы машинного обучения и статистические методы для обнаружения аномалий в поведении сети.
Одним из главных преимуществ CrowdSec является возможность быстрого обнаружения и реагирования на новые и неизвестные угрозы. Это достигается благодаря тому, что система опирается на данные и опыт сообщества, которое делится информацией о подозрительных действиях и атаках.
Установка
Плагин для Traefik
Для начала подключим плагин «Crowdsec Bouncer Traefik plugin» к Traefik. Для этого добавляем в файл data/traefik.yml следующие строки:
experimental: plugins: crowdsec-bouncer-traefik-plugin: moduleName: "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin" version: "v1.5.0-beta1"
Также, я решил объединить все контейнеры за Traefik'ом в отдельную сеть proxy-net, для чего добавляем соответствующую информацию в docker-compose.yml Traefik (приведены только значащие строки):
services: traefik: image: traefik:v3 ... networks: proxy-net: ... networks: proxy-net: name: proxy-net driver: bridge
Обновляем:
sudo docker-compose up -d
CrowdSec
Теперь развернём сам CrowdSec в Docker-контейнере.
Создаём каталог куда будем помещать docker-compose файл, а в нём ещё два каталога: config и db.
mkdir db config
Здесь же создаём два файла: acquis.yaml (файл с путями до логов Traefik) и appsec.yaml (настройки AppSec компонента).
- acquis.yaml
filenames: - /var/log/traefik/* labels: type: traefik
- appsec.yaml
appsec_config: crowdsecurity/appsec-default labels: type: appsec listen_addr: 0.0.0.0:7422 source: appsec
В данном файле мы указали порт 7422 - именно сюда будет обращаться Traefik для запроса информации о разрешении или блокировке.
Теперь файл docker-compose.yml
- docker-compose.yml
services: crowdsec: image: crowdsecurity/crowdsec:latest container_name: crowdsec environment: - 'COLLECTIONS=crowdsecurity/traefik crowdsecurity/appsec-virtual-patching crowdsecurity/appsec-generic-rules crowdsecurity/base-http-scenarios crowdsecurity/appsec-crs-exclusion-plugin-dokuwiki crowdsecurity/http-cve' volumes: - ./acquis.yaml:/etc/crowdsec/acquis.yaml:ro - ./appsec.yaml:/etc/crowdsec/acquis.d/appsec.yaml - crowdsec-db:/var/lib/crowdsec/data/ - crowdsec-config:/etc/crowdsec/ - /var/log/traefik/:/var/log/traefik/:ro networks: proxy-net: restart: unless-stopped volumes: crowdsec-db: crowdsec-config: networks: proxy-net: external: true
Запускаем:
sudo docker-compose up -d
CrowdSec начнёт загружать правила (это может занять некоторое время) и затем читать логи Traefik. Проверить, что всё заработало, можно следующей командой:
docker exec crowdsec cscli metrics
В ответ вернутся метрики:
Также можно проверить, а собственно какие фильтры (коллекции) будут применяться. Это делается командой:
docker exec crowdsec cscli collections list
-------------------------------------------------------------- COLLECTIONS -------------------------------------------------------------- Name 📦 Status Version -------------------------------------------------------------- crowdsecurity/appsec-generic-rules ✔️ enabled 1.0 crowdsecurity/appsec-virtual-patching ✔️ enabled 11.1 crowdsecurity/base-http-scenarios ✔️ enabled 1.2 crowdsecurity/http-cve ✔️ enabled 2.9 crowdsecurity/linux ✔️ enabled 0.3 crowdsecurity/sshd ✔️ enabled 0.7 crowdsecurity/traefik ✔️ enabled 0.1 crowdsecurity/whitelist-good-actors ✔️ enabled 0.2 --------------------------------------------------------------
Их мы кстати указывали в docker-compose, в параметре COLLECTIONS.
Подключение к CrowdSec Console (необязательно)
Дополнительно можно привязать свой экземпляр CrowdSec к облаку. Это даст возможность мониторить онлайн состояние, списки блокировки, получать алерты и т.д.
Регистрируемся на https://crowdsec.net , входим в консоль управления:
Листам ниже и ищем строчку «Connect with the Console». Это код для подключения контейнера к облаку.
Копируем данную команду, приводим её к следующему виду и выполняем:
docker exec crowdsec cscli console enroll XXXXXXXXXXXXXXXXXXXXXXX
Затем в разделе «Engines» на сайте подтверждаем подключение, а сам контейнер CrowdSec перезапускаем. После этого мы увидим наш экземпляр в панели управления и сможем им управлять.
В бесплатном режиме нам доступно на выбор три списка блокировки (это списки прокси, геосписки и т.д.)
Получаем API ключ
Для подключения Traefik к контейнеру CrowdSec необходимо получить API-ключ. Для этого выполняем следующую команду:
sudo docker exec crowdsec cscli bouncers add traefik-bouncer
Полученный ключ скопируйте и запишите, он нам в дальнейшем понадобится.
Настраиваем маршруты в Traefik
В файл динамической конфигурации Traefik (data/custom/host.yml) в раздел http - middlewares добавляем плагин crowdsec-bouncer-traefik-plugin, а в entryPoints ваших роутеров подключаем crowdsec. Здесь главное не ошибиться в отступах. У меня дважды всё падало из-за неправильного места вставки:
http: routers: myrouter: entryPoints: - https service: service-example middlewares: - "my-geoblock" - crowdsec rule: (Host(`example.ru`) || Host(`www.example.ru`)) tls: certResolver: letsEncrypt ... middlewares: crowdsec: plugin: crowdsec-bouncer-traefik-plugin: enabled: true crowdsecAppsecEnabled: true crowdsecAppsecHost: crowdsec:7422 crowdsecAppsecFailureBlock: true crowdsecAppsecUnreachableBlock: true crowdsecLapiKey: "API-KEY" ...
Вместо API-KEY вставляем ключ, полученный на предыдущем этапе.
Если всё сделано правильно, то сайты должны нормально открываться. А при выполнении следующей команды мы должны получить вывод адреса crowdsec и количество обработанных запросов:
$ docker exec crowdsec cscli metrics show appsec +-------------------------------------+ | Appsec Metrics | +---------------+-----------+---------+ | Appsec Engine | Processed | Blocked | +---------------+-----------+---------+ | 0.0.0.0:7422/ | 219 | - | +---------------+-----------+---------+
Также мы увидим появление данных в Web-консоли (если вы её подключали):
Ещё несколько доступных команд
Список тревог:
docker exec crowdsec cscli alerts list
Список заблокированных адресов:
docker exec crowdsec cscli decisions list
Разблокировать адрес:
docker exec crowdsec cscli decisions delete --ip xxx.xxx.xxx.xxx
Немного о метриках
+------------------------------------------------------------------------+ | Local API Decisions | +--------------------------------------------+----------+--------+-------+ | Reason | Origin | Action | Count | +--------------------------------------------+----------+--------+-------+ | generic:scan | CAPI | ban | 8 | | http:crawl | CAPI | ban | 11 | | http:exploit | CAPI | ban | 10367 | | http:scan | CAPI | ban | 5329 | | ssh:bruteforce | CAPI | ban | 1680 | | vm-management:exploit | CAPI | ban | 2 | | crowdsecurity/http-probing | crowdsec | ban | 1 | | http:bruteforce | CAPI | ban | 163 | | crowdsecurity/http-admin-interface-probing | crowdsec | ban | 1 | | crowdsecurity/http-cve-probing | crowdsec | ban | 1 | +--------------------------------------------+----------+--------+-------+
В настоящее время CrowdSec поддерживает следующие источники:
crowdsec: автоматическое решение, основанное на поведенческом анализе ваших журналовCAPI: решение, принятое чёрным списком сообществаcscli: решение, принятое вручную с помощьюcscli decisions addcscli-import: решения, импортированные с помощью cscli decisions importappsec: запрос был заблокирован правилом appsecconsole: решение, принятое вручную с консолиlists: решение, принятое на основе списка блокировок, зарегистрированного в консоли.






