CrowdSec — это современная открытая IPS (Intrusion Prevention System), которая работает как улучшенная замена fail2ban. Ключевое отличие: все пользователи CrowdSec делятся информацией об атакующих IP, формируя коллективную базу угроз из миллионов источников.
CrowdSec vs fail2ban
| Функция | fail2ban | CrowdSec |
|---|---|---|
| Архитектура | Монолитная | Agent + Bouncer |
| Threat Intelligence | Только локальные логи | Глобальная shared DB |
| Проактивная блокировка | Нет | Да (известные атакующие) |
| Веб-дашборд | Нет | Да (app.crowdsec.net) |
| Коллекции сценариев | Только regex | YAML-сценарии, Hub |
| Лицензия | GPL | MIT (Community) |
Установка CrowdSec
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | bash
apt install crowdsec -y
# Установить Nginx Bouncer (блокировщик)
apt install crowdsec-nginx-bouncer -y
# Или firewall bouncer
apt install crowdsec-firewall-bouncer-nftables -y
Установка коллекций сценариев
cscli collections list
cscli collections install crowdsecurity/nginx
cscli collections install crowdsecurity/wordpress
cscli collections install crowdsecurity/ssh-bf
cscli collections install crowdsecurity/linux-lpe
systemctl reload crowdsec
Управление блокировками
cscli decisions list
cscli decisions add --ip 1.2.3.4 --duration 24h --reason "manual ban"
cscli decisions delete --ip 1.2.3.4
cscli alerts list --limit 20
Мониторинг метрик
cscli metrics
cscli bouncers list
cscli machines list
CrowdSec Hub: На app.crowdsec.net доступен бесплатный дашборд с графиками атак, картой источников угроз и управлением вашими агентами.
CrowdSec не заменяет настройку firewall и SSH hardening — это дополнительный слой. Используйте его в связке с ufw/nftables и правилами sshd_config.
Разбор типичных проблем при внедрении CrowdSec
level=fatal msg="unable to run local API: listen tcp 127.0.0.1:8080: bind: address already in use"— порт 8080 по умолчанию уже занят другим сервисом (Node.js-приложением, панелью, тестовым PHP-сервером). Изменитеapi.server.listen_uriв/etc/crowdsec/config.yamlна свободный порт.- Команда
cscli decisions addотработала без ошибок, а атакующий трафик всё равно проходит — decision это только запись в базе LAPI. Реальную блокировку выполняет bouncer, и без установленного и настроенного bouncer'а трафик никто не остановит. cscli bouncers listпоказывает bouncer с пустой колонкой Last Pull — он зарегистрирован, но не забирает решения. Почти всегда причина в неверномapi_urlилиapi_keyв его конфиге, например/etc/crowdsec/bouncers/crowdsec-nginx-bouncer.yaml.cscli metricsпоказывает нулевые события по установленному сценарию — источник логов изacquis.yamlне читается: неверный путь к файлу или у пользователя, от имени которого работает crowdsec, нет прав на чтение лога.- nginx-bouncer не запускается на стоковом Nginx из репозитория дистрибутива —
crowdsec-nginx-bouncerтребует Nginx, собранный сngx_http_lua_module, либо OpenResty; обычная сборка Nginx из apt этот модуль не включает.
Типы bouncer'ов и что они блокируют
| Bouncer | Уровень блокировки | Где устанавливается | Ограничение |
|---|---|---|---|
| nginx-bouncer | HTTP-запрос (уровень приложения) | На каждом сервере с Nginx | Требует Lua-модуль, не влияет на не-HTTP трафик |
| firewall-bouncer (nftables/iptables) | Сетевой пакет | На хосте целиком | Блокирует любой трафик, но не видит HTTP-заголовки и URL |
| cloudflare-bouncer | Периметр CDN | В аккаунте Cloudflare | Работает только если весь трафик идёт через Cloudflare |
| Собственный bouncer через API | Любой, который вы реализуете | Свой скрипт, обращающийся к LAPI | Требует собственной разработки и поддержки |
Когда CrowdSec не подходит
- Одиночный сервер с невысоким трафиком, где fail2ban уже закрывает потребности — CrowdSec добавляет agent, LAPI и bouncer, а значит больше движущихся частей и памяти ради не сильно большего выигрыша.
- Изолированная сеть без доступа в интернет — обмен коллективной базой атакующих с CAPI CrowdSec требует связи с внешним сервисом; в закрытом контуре останется только локальный анализ по сценариям, без сетевого эффекта.
- Сервер с очень ограниченной памятью (512 MB — 1 GB) — агент CrowdSec, локальная база решений и bouncer вместе требовательнее к ресурсам, чем fail2ban.
- Нужна блокировка по сложным поведенческим признакам после логина (device fingerprint, аномалии сессии) — это задача уровня приложения или специализированного anti-fraud, а не IPS уровня CrowdSec.
Проверка, что блокировка реально работает
# Добавить тестовую блокировку СВОЕГО внешнего IP на короткое время
cscli decisions add --ip 1.2.3.4 --duration 1m --reason "test block"
# Убедиться, что решение попало в базу LAPI
cscli decisions list
# Проверить с заблокированного IP, что соединение действительно не проходит
curl -I https://example.com
# Снять тестовую блокировку, не дожидаясь истечения срока
cscli decisions delete --ip 1.2.3.4
Замените 1.2.3.4 на собственный внешний адрес и выполняйте проверку с него, а не с сервера — иначе третья команда покажет успех локально, но ничего не скажет о том, действительно ли bouncer блокирует чужой трафик.