Откройте журнал аутентификации на любом сервере с публичным IP, и вы обнаружите сотни неудачных попыток входа, накопившихся за первый же час. Боты перебирают украденные базы логинов и паролей, сканеры ищут устаревшее ПО, а автоматизированные тулкиты проверяют каждый открытый порт на известные уязвимости.
Долгое время стандартным решением был Fail2Ban: скрипт, который считает неудачные попытки и блокирует нарушителей через файрвол. Инструмент рабочий, но замкнутый сам на себя. Он знает только о тех атаках, которые лично зафиксировал на одном конкретном сервере. IP-адрес, который минуту назад ломился в тысячу других машин, для вашего Fail2Ban будет совершенно незнакомым.
CrowdSec решает эту проблему иначе. Это бесплатный движок безопасности с открытым кодом, который не только следит за логами и блокирует нарушителей локально, но и участвует в глобальной сети обмена данными об угрозах. Когда ваш экземпляр ловит подозрительный IP, информация уходит в общий пул. Взамен вы получаете постоянно обновляемый список адресов, которые уже отметились у других участников. Ваш сервер начинает отклонять известные угрозы ещё до того, как они отправят первый пакет.
В этом руководстве мы разберём полную установку CrowdSec на Ubuntu и Debian: от подключения репозитория до рабочей конфигурации с активной блокировкой через файрвол. Весь процесс занимает около 15 минут.
Что такое CrowdSec и зачем он нужен
CrowdSec появился в 2020 году. Его создатели много лет управляли хостинговым бизнесом, где Fail2Ban был ежедневным инструментом. Они хорошо знали его плюсы, но упёрлись в потолок: отсутствие обмена данными между серверами, медленная работа при высокой нагрузке на логи и негибкая конфигурация на основе регулярных выражений. Было решено выстроить концепцию заново, выбрав Go ради скорости и модульную архитектуру, где обнаружение атак отделено от их блокировки. Проект распространяется под лицензией MIT и набрал более 12 000 звёзд на GitHub.
Чтобы понять, как CrowdSec защищает сервер, разберём конкретную ситуацию. Бот начинает подбирать SSH-пароли к вашей машине. Агент CrowdSec следит за /var/log/auth.log и подхватывает каждую неудачную попытку в момент её появления. Цепочка парсеров извлекает IP источника, имя пользователя и временную метку, а GeoIP-модуль помечает адрес страной и номером автономной системы. Распознанное событие попадает в "дырявое ведро" (leaky bucket), привязанное к сценарию ssh-bf. Когда один и тот же IP наполняет ведро (например, 5 отказов за 30 секунд), срабатывает алерт. Local API (LAPI) принимает его, сверяется с профилем и записывает вердикт в базу: забанить этот адрес на четыре часа. Баунсер файрвола, который опрашивает LAPI раз в несколько секунд, тут же добавляет правило drop для нарушителя в nftables (или iptables). Параллельно LAPI отправляет анонимизированный отчёт (временная метка, IP, название сценария) в центральный API CrowdSec, откуда данные попадают в общий блоклист, доступный всем подключённым экземплярам.
За всем этим стоят три компонента. Security Engine отвечает за чтение логов, их парсинг, оценку поведенческих сценариев и уведомление LAPI о подозрительной активности. LAPI выступает мозговым центром: хранит вердикты, синхронизируется с глобальной сетью и раздаёт решения всем, кто спрашивает. Баунсеры выполняют наказание в конкретной точке инфраструктуры: один управляет nftables-правилами на хосте, другой выдаёт HTTP 403 в Nginx, третий создаёт блокировки на уровне CDN. Благодаря такому разделению можно анализировать логи на одной машине, а блокировать трафик на десятке других.
Сравнение CrowdSec и Fail2Ban
В таблице ниже собраны ключевые отличия, которые помогут определиться с выбором.
| Критерий | Fail2Ban | CrowdSec |
|---|---|---|
| Язык | Python | Go (значительно быстрее при большом объёме логов) |
| Способ обнаружения | Regex-паттерны по строкам лога | Поведенческие сценарии на основе leaky bucket |
| Обмен данными | Отсутствует, каждый сервер сам по себе | Глобальный блоклист, обновляемый в реальном времени |
| Архитектура | Монолитный процесс | Раздельные движок, API и баунсеры |
| Работа на нескольких серверах | Ручное копирование конфигов | Встроенный распределённый режим с общим LAPI |
| IPv6 | Частичная поддержка | Полная, включая CIDR-решения |
| WAF | Нет | Модуль AppSec для проверки HTTP-трафика |
| Добавление правил | Regex-фильтры и jail-файлы | YAML-коллекции из Hub одной командой |
| Потребление ресурсов | Минимальное | Чуть выше, но комфортно на VPS с 1 ГБ RAM |
Предварительные требования
- Сервер с Ubuntu 22.04/24.04 или Debian 12. Пакеты также доступны для RHEL, CentOS, Fedora и SUSE.
- Root-доступ или пользователь с правами sudo.
- Хотя бы один работающий сервис, генерирующий логи (SSH есть по умолчанию на большинстве серверов).
Если сервера пока нет, на Serverspace можно развернуть VPS с Linux за считанные минуты. Ubuntu и Debian доступны как предустановленные образы.
Шаг 1. Обновление системы и подключение репозитория
Обновляем список пакетов и ставим все ожидающие обновления:
Запускаем скрипт, который добавляет официальный репозиторий CrowdSec и импортирует GPG-ключ:
sudo apt update
Замечание для Ubuntu Pro/ESM. Штатный репозиторий Ubuntu может предлагать устаревшую версию CrowdSec 1.4.6. Если apt policy crowdsec показывает именно её, создайте файл приоритетов, чтобы система брала пакеты из официального источника:
Pin: origin packagecloud.io Pin-Priority: 900 EOF
Шаг 2. Установка Security Engine
В процессе установки пакет регистрирует машину в LAPI, скачивает базовый набор парсеров и сценариев из Hub и запускает сервис. Включаем автозапуск и проверяем статус:
На этом этапе CrowdSec уже читает логи и сопоставляет события со сценариями, но пока ничего не блокирует. Представьте камеру наблюдения без охранника у двери. Нам нужен баунсер.
Шаг 3. Установка баунсера файрвола
Баунсер опрашивает LAPI на предмет свежих вердиктов и превращает их в правила файрвола. На Ubuntu 24.04 и Debian 12 по умолчанию используется nftables:
На более ранних системах с iptables:
Включаем и запускаем:
crowdsec-firewall-bouncer
Проверяем регистрацию командой sudo cscli bouncers list. В выводе должна появиться одна запись с валидным статусом. С этого момента каждый IP, который переполнит сценарный bucket, автоматически окажется в drop-правиле файрвола.
Конфликт с UFW. UFW и nftables-баунсер управляют одним и тем же бэкендом. Если UFW активен, лучше либо отключить его, либо использовать iptables-вариант баунсера.
Шаг 4. Подключение коллекций для ваших сервисов
Коллекция объединяет парсеры ("как читать этот формат лога") и сценарии ("что считать подозрительным") для конкретного сервиса. Устанавливаем нужные:
collections install crowdsecurity/sshd sudo cscli collections install
crowdsecurity/nginx # если используете Nginx sudo cscli collections
install crowdsecurity/apache2 # если используете Apache
Полный каталог доступных коллекций можно посмотреть командой sudo cscli collections list -a. После установки перезапускаем движок:
Шаг 5. Настройка источников логов
CrowdSec нужно знать, какие файлы читать. Конфигурация хранится в /etc/crowdsec/acquis.yaml и файлах внутри /etc/crowdsec/acquis.d/. Проверяем текущие настройки:
Типичная конфигурация для SSH и Nginx:
- /var/log/nginx/access.log
- /var/log/nginx/error.log labels: type: nginx
Каждый блок указывает пути к файлам и метку, по которой CrowdSec определяет нужную цепочку парсеров. Если ваш веб-сервер пишет логи в нестандартную директорию, поправьте пути и перезапустите сервис.
Шаг 6. Проверка работы и тестирование
Убеждаемся, что логи обрабатываются:
Если для какого-то источника накопилось много нераспознанных строк, значит для этого формата не хватает парсера или коллекции. Смотрим алерты и активные баны:
Для проверки сквозной блокировки вручную баним тестовый IP и ищем его в правилах файрвола:
ruleset | grep 198.51.100.77
После проверки снимаем бан:
Шаг 7. Подключение консоли и добавление IP в белый список
CrowdSec предоставляет бесплатную веб-панель на app.crowdsec.net. Создайте аккаунт и подключите свой экземпляр:
sudo systemctl reload crowdsec
Прежде чем закрыть терминал, добавьте свой IP в белый список, чтобы случайно не заблокировать себя:
name: my-whitelists description: "Trusted IPs that should never be
banned" whitelist: reason: "Admin and monitoring addresses" ip:
- "YOUR.IP.ADDRESS.HERE"
Перезапускаем CrowdSec для применения:
Частые ошибки и как их избежать
Движок без баунсера. Самая распространённая оплошность. CrowdSec в одиночку только фиксирует алерты, но ничего не блокирует. Всегда ставьте хотя бы один баунсер файрвола.
Забыли про белый список. Пара неверных SSH-паролей при тестировании может привести к блокировке вашего собственного адреса. Внесите доверенные IP в whitelist до начала продуктивной эксплуатации.
Конфликт файрвольных менеджеров. UFW и nftables-баунсер управляют одним и тем же бэкендом. Выберите что-то одно, иначе поведение правил станет непредсказуемым.
Нет коллекции для работающего сервиса. Если sudo cscli metrics показывает тысячи нераспознанных строк, CrowdSec не видит атак в этих логах. Установите соответствующую коллекцию.
Открытый LAPI наружу. На одиночном сервере LAPI слушает только localhost. Но при переходе к распределённой архитектуре ограничьте доступ по IP и подключите TLS.
Устаревшие правила. Новые сценарии и улучшения парсеров появляются регулярно. Команда sudo cscli hub update && sudo cscli hub upgrade раз в пару недель поддерживает набор правил в актуальном состоянии.
Заключение
Весь путь от чистого сервера до полноценной защиты с CrowdSec укладывается в короткую сессию в терминале. Репозиторий, движок, баунсер, коллекции, готово. Как только сервис запущен, он начинает сопоставлять события из логов с известными паттернами атак и отбрасывать нарушителей на уровне файрвола, одновременно обогащая глобальный пул данных об угрозах.
Мы рекомендуем начать с базовой конфигурации из этого руководства: защита SSH плюс баунсер файрвола. По мере освоения можно наращивать уровни: добавить Nginx-баунсер для выдачи CAPTCHA подозрительным посетителям, подключить Cloudflare-баунсер для блокировки на периметре CDN или объединить несколько хостов через общий LAPI, чтобы одно обнаружение защищало все машины сразу. Обновляйте Hub-контент по расписанию, время от времени проверяйте метрики, а остальное система возьмёт на себя.