В данной статье представлены процессы установки и настройки CrowdSec на примере Ubuntu 26.04 LTS. CrowdSec является ПО с открытым кодом, представляющим из себя систему обнаружения и предотвращения вторжений, обменивающуюся данными о злоумышленниках с другими устройствами. В статье рассмотрим CrowdSec версии 1.7.8, так как в ней закрыты уязвимости CVE-2026-44982 (обход WAF) и CVE-2026-44981 (DoS в Local API).

 

Сценарии использования CrowdSec

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

Защита SSH от брутфорса

Проблема: Постоянные попытки подбора паролей к SSH от нежелательных источников.

Действия CrowdSec:

  1. Агент читает /var/log/auth.log (или journalctl) через коллекцию crowdsecurity/sshd.
  2. Обнаруживает многократные неудачные аутентификации с одного IP.
  3. Принимает решение (например, блокировка на 4 часа) и передает IP в баунсер.
  4. Баунсер мгновенно блокирует IP на уровне сети. IP-адрес атакующего отправляется в базу IP-адресов, которые CrowdSec классифицирует как злонамеренные.

Защита веб-приложений на Nginx

Проблема: Атаки на сайт — сканирование уязвимостей, перебор админинистративных панелей, SQL-инъекции, межсайтовый скриптинг.

Действия CrowdSec:

  1. Парсит access-логи Nginx через коллекции crowdsecurity/nginx и crowdsecurity/http-cve.
  2. Обнаруживает подозрительные паттерны (например, запросы к /wp-admin, .env, /etc/passwd).
  3. Блокирует атакующий IP через баунсер.

Возможна установка кастомных сценариев под конкретные CMS (WordPress, Drupal).

Защита почтового сервера

Проблема: Брутфорс SMTP/IMAP-авторизаций, спам-рассылки.

Действия CrowdSec:

  1. Коллекции для postfix и dovecot анализируют соответствующие логи.
  2. Обнаруживают множество неудачных логинов, попытки relay-атак.
  3. IP блокируются до того, как нагрузка на сервер станет критичной.

Защита Kubernetes и контейнерных сред

Проблема: Атаки на Ingress-контроллер, API-сервер.

Действия CrowdSec:

  1. Анализирует логи Ingress (Nginx/Traefik) так же, как и обычный веб-сервер.
  2. Может читать audit-логи Kubernetes через отдельные парсеры.
  3. Блокировка на уровне Ingress-controller или через сетевые политики с помощью Kubernetes-bouncer.

Защита баз данных (MySQL, PostgreSQL)

Проблема: Перебор паролей к БД, эксплуатация уязвимостей.

Действия CrowdSec:

  1. Анализирует логи СУБД (например, ошибки аутентификации в PostgreSQL).
  2. При множестве неудачных попыток IP блокируется.

 

Основные термины

Консоль (Console) — веб-интерфейс на сайте CrowdSec для управления добавленными движками безопасности — позволяет просматривать оповещения (alerts), решения (decisions) и другую информацию.

Движок безопасности (Security Engine) — основное приложение CrowdSec, которое устанавливается первоначально. Работает в качестве системы обнаружения вторжений, генерирует оповещения по выявленным угрозам. Внутренняя структура Security Engine включает два основных компонента: обработчик логов (отвечающий за обнаружение) и локальный API (отвечающий за хранение и распространение решений).

Log Processor (Агент анализатор) — Читает и анализирует системные логи и HTTP-трафик, проверяет их с помощью сценариев.При обнаружении угрозы отправляет оповещение (alert) в Local API.

Локальный (LAPI) — центральный компонент, который хранит оповещения (alerts) и решения (decisions), а также выступает в роли посредника между модулями обработки логов, компонентами реагирования и центральным API.

Оповещения (Alerts) — записи, которые создает CrowdSec, когда срабатывает сценарий или правило AppSec. Служат для мониторинга и содержат информацию об атаке.

AppSec — компонент, интегрированный в CrowdSec Security Engine, и представляющий из себя полноценный Web Application Firewall (WAF). Он используется для защиты веб-сервисов и работает в совокупности с веб-баунсером (к примеру crowdsec-nginx-bouncer). В данном случае баунсер перехватывает входящий запрос к веб-серверу, отправляет его на анализ в AppSec-компонент, затем тот возвращает вердикт: «пропустить» или «заблокировать».

Решения (Decisions) — инструкции по принятию мер (например, блокировка), созданные профилями Local API или вручную через cscli, используются баунсерами (bouncers).

Профили (Profiles) — Набор правил, который определяет, как Local API должен превращать оповещения (Alerts) в решения (Decisions).

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

Баунсеры (Bouncers) — это компоненты, которые блокируют трафик. Они опрашивают Local API, получают список решений (decisions) и применяют выбранные меры (блокировка на уровне брандмауэра, показ капчи, сброс HTTP-запроса).

Сценарии (Scenarios) — это YAML-файлы, позволяющие выявить определенное поведение, как правило, атаку.

Коллекции (Collections) — наборы парсеров, сценариев и других компонентов, которые устанавливаются вместе для защиты конкретного сервиса (например, коллекция для Nginx или SSH).

 

Установка CrowdSec

Загружаем и выполняем скрипт автоматического добавления репозитория CrowdSec:

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

Обновляем список репозиториев и устанавливаем CrowdSec:

sudo apt update && sudo apt install crowdsec

Добавляем службу CrowdSec в автозагрузку и проверяем, что она работает:

sudo systemctl enable crowdsec
sudo systemctl status crowdsec

 

Связывание локального агента CrowdSec с централизованной консолью

Для быстрой регистрации нашего движка на сайте вводим команду:

sudo cscli console enroll --quick

Сгенерируется уникальная ссылка, доступная в течение 15 минут, переходим по ней в браузере и регистрируем аккаунт.

Должно открыться окно, в котором нужно нажать кнопку Enroll engine. Если после регистрации аккаунта данное окно автоматически не открылось, то нужно заново перейти по сгенерированной ссылке в браузере.

Также есть альтернативный вариант связывания движка с консолью. Сначала необходимо создать аккаунт на сайте app.crowdsec.net. Затем нужно перейти в Engines и найти пункт Enroll. Здесь должна быть команда, которую нужно использовать на сервере для связывания:

sudo cscli console enroll (--name <Имя движка>) (--tags <Метки движка>) <Ключ>

Флаги name и tags не являются обязательными, но могут быть полезными.

После этого на сайте потребуется нажать кнопку Accept enroll для подтверждения связывания.

После успешного связывания нужно перезагрузить агент:

sudo systemctl reload crowdsec

Проверим связь движка с центральным API:

sudo cscli capi status

Если в выводе написано «You can successfully interact with Central API (CAPI)», то значит, что движок успешно аутентифицирован и может обмениваться данными с CAPI.

 

Установка Firewall Bouncer

Firewall Bouncer обеспечивает широкую защиту на уровне IP, но не может применяться для веб-сервисов. Этот баунсер подходит для SSH, баз данных или SMTP.

Для начала проверим, какой бэкенд используется в системе для обработки правил фильтрации трафика:

iptables -V

Если в выводе команды есть (nf_tables), тогда нужно устанавливать crowdsec-firewall-bouncer-nftables, иначе будем использовать crowdsec-firewall-bouncer-iptables.

Установка crowdsec-firewall-bouncer-nftables:

sudo apt install crowdsec-firewall-bouncer-nftables

Установка crowdsec-firewall-bouncer-iptables:

sudo apt install crowdsec-firewall-bouncer-iptables

Проверяем статус службы после установки подходящей версии Firewall Bouncer:

sudo systemctl status crowdsec-firewall-bouncer

Если установка баунсера осуществляется на удаленной ВМ, где cscli не имеет прямого доступа к Local API (LAPI), тогда на сервере с LAPI потребуется вручную сгенерировать API-ключ для нового баунсера:

sudo cscli bouncers add <Название баунсера>

На удаленном сервере открываем файл конфигурации баунсера:

sudo nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml

В строке api_url указываем IP-адрес сервера с LAPI:

api_url: http://<IP-адрес>:8080/

В строке api_key нужно добавить полученный ранее API-ключ:

api_key: <API-ключ>

После этого перезапускаем службу баунсера:

sudo systemctl restart crowdsec-firewall-bouncer

 

Установка Nginx Bouncer

Данный баунсер блокирует доступ к сайту для подозрительных IP-адресов или заставляет их проходить проверку. Обратите внимание, что этот баунсер работает как внутренний модуль NGINX с использованием Lua, поэтому у него нет собственной службы, которую нужно запускать через systemctl.

Сначала нужно установить зависимости:

sudo apt install nginx lua5.1 libnginx-mod-http-lua luarocks gettext-base

Затем установить сам баунсер:

sudo apt install crowdsec-nginx-bouncer

 

Установка коллекций

Количество устанавливаемых коллекций зависит от того, какие сервисы вы используете. Минимально рекомендуются следующие коллекции:

sudo cscli collections install crowdsecurity/linux

sudo cscli collections install crowdsecurity/sshd

При необходимости вы можете также установить коллекции из перечня:

sudo cscli collections install crowdsecurity/nginx
sudo cscli collections install crowdsecurity/apache2
sudo cscli collections install crowdsecurity/mysql
sudo cscli collections install crowdsecurity/http-cve

После установки коллекций необходимо их активировать, перезагрузив агент:

sudo systemctl reload crowdsec

Вывод перечня текущих коллекций:

sudo cscli collections list

 

Настройка источников логов

CrowdSec смотрит какие логи нужно считывать через /etc/crowdsec/acquis.yaml или из любого файла в каталоге /etc/crowdsec/acquis.d/. Для их правильного анализа как раз-таки необходимы ранее установленные коллекции. В последних версиях Crowdsec файл acquis.yaml по умолчанию отсутствует, рекомендуется создавать или использовать файлы конфигураций в каталоге acquis.d.

Пример создания файла конфигурации Nginx в /etc/crowdsec/acquis.d/:

sudo tee /etc/crowdsec/acquis.d/nginx.yaml > /dev/null << 'EOF'
filenames:
  - /var/log/nginx/access.log
  - /var/log/nginx/error.log
labels:
  type: nginx
EOF

Перезагружаем агент:

sudo systemctl reload crowdsec

 

AppSec

Сначала устанавливаем необходимую коллекцию:

sudo cscli collections install crowdsecurity/appsec-virtual-patching crowdsecurity/appsec-generic-rules

Создаем конфигурацию AppSec в /etc/crowdsec/acquis.d/:

sudo tee /etc/crowdsec/acquis.d/appsec.yaml > /dev/null << 'EOF'
appsec_config: crowdsecurity/appsec-default
labels:
  type: appsec
listen_addr: 127.0.0.1:7422
source: appsec
EOF

Перезагружаем агент:

sudo systemctl reload crowdsec

Добавляем в конфиг баунсера Nginx тот же адрес, что указали при создании конфигурации AppSec:

sudo sed -i 's|^APPSEC_URL=.*|APPSEC_URL=http://127.0.0.1:7422|' /etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf

Перезагружаем Nginx:

sudo systemctl restart nginx

 

Добавление IP в белый список

IP-адреса из белого списка проверяются до принятия каких-либо решений, они никогда не будут заблокированы, даже если спровоцируют срабатывание сценария.

Нужно создать список, в который затем будут добавляться разрешенные IP-адреса:

sudo cscli allowlists create <Название белого списка> \
--description "<Описание>"

Добавление IP-адресов происходит через команду:

sudo cscli allowlists add <Название белого списка> <IP-адрес> \
--comment "<Комментарий>"

Пример:

sudo cscli allowlists add my_whitelist 192.168.100.31 \
--comment "Internal"

С флагом –e можно добавлять IP-адреса в белый список на ограниченное количество времени (в примере 24 часа):

sudo cscli allowlists add <Название белого списка> <IP> -e 24h

Помимо одного IP-адреса могут быть указаны несколько IP-адресов (Пример: 112.3.145.6 112.3.145.7) или полностью сети (Пример: 192.168.100.0/24)

Полностью посмотреть белый список можно с помощью команды:

sudo cscli allowlists inspect <Название белого списка>

Удалить IP-адреса из списка:

sudo cscli allowlists remove <Название белого списка> <IP-адрес>

Удалить белый список:

sudo cscli allowlists delete <Название белого списка>

Посмотреть статус отдельного IP-адреса:

sudo cscli allowlists check <IP-адрес>

 

Режим симуляции

Когда включен режим симуляции для сценария, CrowdSec продолжает обнаруживать атаки и создавать решения (decisions) о блокировке, но эти решения не применяются на практике — блокировка не происходит.

Проверим, включена ли сейчас симуляция:

sudo cscli simulation status

Если хотите включить режим симуляции для всех сценариев:

sudo cscli simulation enable --global

Включить симуляцию для конкретного сценария:

sudo cscli simulation enable <Название, к примеру crowdsecurity/ssh-bf>

Выключение симуляции в обоих случаях выполняется аналогично, только со словом disable:

sudo cscli simulation disable --global

Как после включения, так и после выключения нужно перезагружать CrowdSec, чтобы изменения вступили в силу:

sudo systemctl reload crowdsec

 

Тестирование блокировки

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

Для примера будем пробовать подключаться на другом компьютере вне локальной сети. Запускаем консоль и вводим:

ssh <логин>@<IP-адрес>

Требуется пароль учетной записи, специально вводим неверные пароли. После нескольких неудачных попыток доступ к серверу был ограничен, появилось сообщение:

ssh_dispatch_run_fatal: Connection to <IP-адрес> port 22: Connection timed out

Проверяем информацию на сайте CrowdSec.

Во вкладке Alerts добавилось 2 оповещения об атак — ssh-bf и ssh-slow-bf. У обоих стоит Behavior SSH — Bruteforce.

Во вкладке Decisions появилась новая запись, в которой указан IP-адрес злоумышленника, тип действия с ним (блокировка) и через какое время действие завершится.

Если агент на сервере не был связан с консолью CrowdSec, то можно посмотреть информацию об атаках с помощью команды:

sudo cscli alerts list

И аналогично для Decisions:

sudo cscli decisions list

Если вы хотите отменить какой-то Decision, то это можно сделать несколькими способами.

Удаление по ID Decision:

cscli decisions delete --id <ID из decisions list>

Обратите внимание – при удалении по ID также необходимо будет удалить дубликаты, которые могут создаться, если срабатывают сразу несколько сценариев.

Удаление по IP-адресу атакующего:

cscli decisions delete -i <IP-адрес>

Если вы хотите изменить стандартные 4 часа блокировки на другое время, то необходимо изменить информацию в файле profiles.yaml:

sudo nano /etc/crowdsec/profiles.yaml

Перезагружаем CrowdSec:

sudo systemctl reload crowdsec