Traefik — 7. как подключить защиту CrowdSec

7 января 2026

CrowdSec (Crowd Security) — это система для защиты серверов и контейнеров от сетевых атак (Web Application Firewall, WAF, файрвол веб-приложений). Она использует коллективный разум сообщества для обнаружения и предотвращения угроз. CrowdSec анализирует сетевой трафик и поведение системы, чтобы выявить подозрительные действия, которые могут указывать на атаку. Система использует алгоритмы машинного обучения и статистические методы для обнаружения аномалий в поведении сети.

Одним из главных преимуществ CrowdSec является возможность быстрого обнаружения и реагирования на новые и неизвестные угрозы. Это достигается благодаря тому, что система опирается на данные и опыт сообщества, которое делится информацией о подозрительных действиях и атаках.

Для начала подключим плагин «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 в 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 к облаку. Это даст возможность мониторить онлайн состояние, списки блокировки, получать алерты и т.д.

Регистрируемся на https://crowdsec.net , входим в консоль управления:

Листам ниже и ищем строчку «Connect with the Console». Это код для подключения контейнера к облаку.

Копируем данную команду, приводим её к следующему виду и выполняем:

docker exec crowdsec cscli console enroll XXXXXXXXXXXXXXXXXXXXXXX

Затем в разделе «Engines» на сайте подтверждаем подключение, а сам контейнер CrowdSec перезапускаем. После этого мы увидим наш экземпляр в панели управления и сможем им управлять.

В бесплатном режиме нам доступно на выбор три списка блокировки (это списки прокси, геосписки и т.д.)

Для подключения Traefik к контейнеру CrowdSec необходимо получить API-ключ. Для этого выполняем следующую команду:

sudo docker exec crowdsec cscli bouncers add traefik-bouncer

Полученный ключ скопируйте и запишите, он нам в дальнейшем понадобится.

В файл динамической конфигурации 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 add
  • cscli-import: решения, импортированные с помощью cscli decisions import
  • appsec: запрос был заблокирован правилом appsec
  • console: решение, принятое вручную с консоли
  • lists: решение, принятое на основе списка блокировок, зарегистрированного в консоли.
  • docker/traefik_podkljuchaem_zaschitu_crowdsec.txt
  • Последнее изменение: 14.01.2026 19:21
  • r0wbh