CrowdSec: распределённая система обнаружения вторжений

Что такое CrowdSec и чем он лучше Fail2ban

CrowdSec — это open-source система обнаружения и реагирования на угрозы, работающая по принципу коллективного интеллекта. В отличие от Fail2ban, который анализирует логи локально и реагирует только на атаки, направленные конкретно на ваш сервер, CrowdSec агрегирует данные со всех участников сети и формирует глобальные блоклисты.

Архитектура CrowdSec разделена на два компонента:

  • Agent (движок) — анализирует логи, применяет парсеры и сценарии, выносит решения о блокировке
  • Bouncer (баунсер) — применяет решения: блокирует IP через iptables, Nginx, Cloudflare и другие механизмы

Ключевые преимущества:

  • Коллективный интеллект: IP-адрес, атакующий другие серверы CrowdSec, будет заблокирован превентивно на вашем
  • Высокая производительность: написан на Go, обрабатывает миллионы строк логов
  • Модульность: парсеры, сценарии и баунсеры устанавливаются из хаба
  • API-first: все компоненты взаимодействуют через REST API
  • Поддержка контейнеров: нативная интеграция с Docker и Kubernetes

CrowdSec не является заменой файрвола или WAF — он дополняет их, анализируя логи и принимая решения о блокировке подозрительных IP-адресов на основе поведенческого анализа.

Установка CrowdSec на Linux

CrowdSec поддерживает все основные дистрибутивы Linux. Установим его из официального репозитория на Ubuntu/Debian:

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt install crowdsec -y

Для CentOS/RHEL:

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.rpm.sh | sudo bash
sudo yum install crowdsec -y

После установки CrowdSec автоматически обнаруживает установленные сервисы и подключает соответствующие парсеры и коллекции. Проверяем:

sudo cscli collections list
sudo cscli parsers list
sudo cscli scenarios list

Основные конфигурационные файлы:

  • /etc/crowdsec/config.yaml — главный конфиг
  • /etc/crowdsec/acquis.yaml — источники логов
  • /etc/crowdsec/profiles.yaml — профили реагирования

Проверяем, какие источники логов обнаружены:

cat /etc/crowdsec/acquis.yaml

Типичный вывод:

filenames:
  - /var/log/syslog
labels:
  type: syslog
---
filenames:
  - /var/log/auth.log
labels:
  type: syslog
---
filenames:
  - /var/log/nginx/access.log
labels:
  type: nginx

Установка и настройка баунсеров

Баунсер — компонент, который применяет решения CrowdSec. Без него агент только обнаруживает угрозы, но не блокирует их. Наиболее распространённые баунсеры:

Firewall Bouncer (iptables/nftables)

Блокирует IP на уровне файрвола — самый надёжный способ:

sudo apt install crowdsec-firewall-bouncer-iptables -y

Конфигурация /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml:

mode: iptables
update_frequency: 10s
api_url: http://127.0.0.1:8080/
api_key: <генерируется автоматически>
deny_action: DROP
deny_log: true
deny_log_prefix: "crowdsec: "
blacklists_ipv4: crowdsec-blacklists
blacklists_ipv6: crowdsec6-blacklists

Проверяем работу:

sudo systemctl status crowdsec-firewall-bouncer
sudo iptables -L INPUT -n | grep crowdsec

Nginx Bouncer

Для веб-серверов можно блокировать на уровне Nginx, показывая капчу или страницу с ошибкой:

sudo apt install crowdsec-nginx-bouncer -y

Баунсер работает как Lua-модуль. В конфигурации Nginx добавляется:

lua_shared_dict crowdsec_cache 50m;
resolver 8.8.8.8 ipv6=off;
lua_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;

init_by_lua_block {
    cs = require "crowdsec.CrowdSec"
    cs.init("/etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf", "crowdsec-nginx-bouncer")
}

access_by_lua_block {
    cs.Allow(ngx.var.remote_addr)
}

Конфигурация /etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf:

API_URL=http://127.0.0.1:8080
API_KEY=your-api-key
CACHE_EXPIRATION=1
BANTEMPLATE_PATH=/var/lib/crowdsec/lua/templates/ban.html
CAPTCHA_PROVIDER=recaptcha

Коллекции, парсеры и сценарии

CrowdSec Hub содержит готовые коллекции для большинства сервисов. Коллекция — это набор парсеров и сценариев, объединённых для защиты конкретного сервиса.

Установка популярных коллекций:

# Защита SSH
sudo cscli collections install crowdsecurity/sshd

# Защита Nginx
sudo cscli collections install crowdsecurity/nginx

# Защита Apache
sudo cscli collections install crowdsecurity/apache2

# Защита WordPress
sudo cscli collections install crowdsecurity/wordpress

# Защита Postfix
sudo cscli collections install crowdsecurity/postfix

# Обновление всех коллекций
sudo cscli hub update
sudo cscli hub upgrade

Каждая коллекция включает парсеры (разбор логов в структурированные события) и сценарии (правила обнаружения). Например, сценарий crowdsecurity/ssh-bf обнаруживает брутфорс SSH, анализируя количество неудачных попыток входа за определённый период.

Просмотр установленных сценариев с параметрами:

sudo cscli scenarios inspect crowdsecurity/ssh-bf

Типичные параметры сценария:

type: leaky
filter: evt.Meta.log_type == 'ssh_failed-auth'
groupby: evt.Meta.source_ip
capacity: 5
leakspeed: 10s
blacklist_reason: "ssh bruteforce"

Это означает: если с одного IP поступило более 5 неудачных попыток входа по SSH за 50 секунд (5 × 10s), IP блокируется.

Создание пользовательских сценариев

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

Создаём файл /etc/crowdsec/scenarios/port-scan.yaml:

type: leaky
name: custom/port-scan
description: "Detect port scanning from iptables logs"
filter: evt.Meta.log_type == 'iptables_drop'
groupby: evt.Meta.source_ip
capacity: 20
leakspeed: 5s
blacklist_reason: "port scanning detected"
labels:
  remediation: true
  type: scan

Для этого необходим парсер логов iptables. Создаём /etc/crowdsec/parsers/s01-parse/iptables-logs.yaml:

onsuccess: next_stage
name: custom/iptables-logs
description: "Parse iptables DROP logs"
filter: evt.Line.Labels.type == 'syslog' && evt.Line.Raw contains 'iptables-drop'
pattern: '.*iptables-drop.*SRC=(?P\S+).*DPT=(?P\d+).*'
statics:
  - meta: log_type
    value: iptables_drop
  - meta: source_ip
    expression: evt.Parsed.source_ip

После создания файлов перезапускаем CrowdSec:

sudo systemctl reload crowdsec
sudo cscli scenarios list --local

Тестирование сценария на существующих логах:

sudo cscli explain --file /var/log/syslog --type syslog

Управление решениями и белыми списками

CrowdSec предоставляет удобный CLI для управления блокировками и исключениями.

Просмотр текущих решений (заблокированных IP):

# Все текущие решения
sudo cscli decisions list

# Поиск конкретного IP
sudo cscli decisions list --ip 203.0.113.50

# Статистика по решениям
sudo cscli metrics

Ручное добавление и удаление блокировок:

# Заблокировать IP на 24 часа
sudo cscli decisions add --ip 203.0.113.50 --duration 24h --reason "manual ban"

# Заблокировать подсеть
sudo cscli decisions add --range 203.0.113.0/24 --duration 48h --reason "malicious network"

# Снять блокировку
sudo cscli decisions delete --ip 203.0.113.50

Для критически важных IP-адресов (мониторинг, партнёры, собственные серверы) настройте белый список /etc/crowdsec/parsers/s02-enrich/whitelist.yaml:

name: custom/whitelist
description: "Whitelist trusted IPs"
whitelist:
  reason: "trusted IP"
  ip:
    - 10.0.0.0/8
    - 192.168.0.0/16
    - 203.0.113.10
  expression:
    - evt.Meta.source_ip startsWith '10.'
    - evt.Meta.http_user_agent contains 'UptimeRobot'

Мультисерверное развёртывание

В инфраструктуре с несколькими серверами CrowdSec позволяет организовать централизованное управление через LAPI (Local API). Один сервер выступает центральным, остальные подключаются как агенты.

На центральном сервере (LAPI):

# Регистрация машины-агента
sudo cscli machines add worker-01 --auto --force

# Просмотр зарегистрированных машин
sudo cscli machines list

# Регистрация баунсера
sudo cscli bouncers add bouncer-worker-01
# Запомните выданный API-ключ

На удалённых серверах (агенты) в /etc/crowdsec/config.yaml:

api:
  client:
    insecure_skip_verify: false
    credentials_path: /etc/crowdsec/local_api_credentials.yaml
  server:
    enable: false  # LAPI отключен на агентах

В /etc/crowdsec/local_api_credentials.yaml:

url: https://crowdsec-central.company.local:8080
login: worker-01
password: <auto-generated-password>

Таким образом, все решения принимаются централизованно, а баунсеры на каждом сервере получают единый список заблокированных IP. Это особенно эффективно: атака на один сервер автоматически приводит к блокировке атакующего на всех серверах инфраструктуры.

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

sudo cscli console enroll <enrollment-key>

Часто задаваемые вопросы

Функционально — да, CrowdSec покрывает все сценарии Fail2ban и значительно расширяет их за счёт коллективного интеллекта, REST API и мультисерверной архитектуры. Однако CrowdSec потребляет больше ресурсов (написан на Go), поэтому на VPS с 512 МБ RAM Fail2ban может быть предпочтительнее.

CrowdSec отправляет только метаданные об обнаруженных атаках: IP-адрес атакующего, тип атаки и временную метку. Содержимое логов, пароли и другие чувствительные данные не передаются. Участие в коллективном обмене можно отключить, но тогда вы не будете получать превентивные блоклисты.

CrowdSec предоставляет метрики в формате Prometheus на эндпоинте /metrics LAPI. Добавьте в конфигурацию Prometheus таргет http://localhost:6060/metrics. В Grafana импортируйте готовый дашборд с ID 13985 из Grafana Hub.

Да, CrowdSec имеет официальный Docker-образ. Пример запуска: docker run -d --name crowdsec -v /var/log:/var/log -v crowdsec-db:/var/lib/crowdsec/data crowdsecurity/crowdsec. Для Docker-окружений рекомендуется использовать источник логов типа docker вместо файлов.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#CrowdSec#IDS#система обнаружения вторжений#защита сервера#fail2ban альтернатива#баунсер#брутфорс защита#блокировка IP
Комментарии 0

Оставить комментарий

загрузка...