Кибератаки на интернет-ресурсы стали не только привычным, но и массовым явлением. Хакеры с помощью различных инструментов в автоматическом режиме атакуют сайты, интернет-магазины, WordPress-блоги, пытаясь подобрать пароль или вызвать отказ в обслуживании. Для противодействия таким атакам имеется много способов. Об одном из них — движке CrowdSec — мы расскажем в этой статье.
Что такое CrowdSec
CrowdSec — это бесплатный open source-инструмент для выявления и блокировки вредоносных IP-адресов на основе шаблонов их поведения. Он умеет подключать индивидуальные бан-листы, настроенные администраторами, а также использовать общие бан-листы, в формировании которых принимают участие пользователи CrowdSec.
Многие рассматривают CrowdSec в качестве альтернативы Fail2ban, но CrowdSec потенциально представляет собой более мощную систему. Фактически это глобальная база репутации IP-адресов, которую можно рассматривать в качестве иммунной системы интернета.
Как это работает
С архитектурной точки зрения система состоит из трёх основных компонентов:
-
службы CrowdSec ( Crowdsec-agent ), которая беспрерывно мониторит логи указанных в настройке системных сервисов, например, nginx, Apache2, WordPress, netfilter, выявляя атаки и потенциально опасные действия;
-
инструмента командной строки cscli, с помощью которого можно управлять работой службы;
-
баунсеров (bouncers) — модулей интеграции с другими инструментами типа Cloudflare для реального обеспечения блокировки вредоносного трафика;
-
локального REST API, через который проходит общение указанных выше компонентов и базы данных. [1]
Архитектура CrowdSec. Источник (здесь и далее): CrowdSec
На момент написания статьи на сайте разработчика представлено восемь модулей интеграции (bouncers) :
-
caddy-crowdsec-bouncer;
-
cs-cloud-firewall-bouncer,
-
cs-custom-bouncer;
-
cs-express-bouncer;
-
cs-firewall-bouncer;
-
cs-haproxy-bouncer;
-
cs-nginx-bouncer
-
cs-wordpress-bouncer
Например, модуль для Nginx сверяет каждый неизвестный IP-адрес в логе с базой данных до того, как веб-сервер даст ответ на запрос или выдаст ошибку 403. Модуль firewall просто добавляет вредоносные IP-адреса в чёрный список nftables/ipset. А баунсер для WordPress решает сразу две задачи веб-мастера: отсекает нежелательные IP-адреса и имеет дополнительную функцию более мягкой блокировки — показывает нежелательным или подозрительным IP-адресам капчу.
Чтобы упростить настройку CrowdSec в типовых случаях, разработчик предлагает загрузить различные коллекции и конфигурации .
Коллекции представляют собой наборы парсеров и сценариев для разных ситуаций. Так, в коллекцию Nginx входит парсер логов nginx-logs и базовые http-сценарии для определения типичных вредоносных ботов (агрессивный краулинг, сканирование/пробы портов, чёрный список user-agent'ов, определение попыток проведения атаки path traversal и многое другое).
Конфигурации — это фрагменты настроек для распространённых сервисов, которые администратор системы может добавить в свой конфиг. Например, если на сервере установлена cpanel и администратор хочет мониторить попытки подбора паролей, он может воспользоваться конфигурацией cpanel-bf, которая выглядит следующим образом:
type: trigger name: crowdsecurity/cpanel-bf description: "Detect bruteforce on cpanel login" filter: "evt.Meta.log_type == 'auth_bf_log'" groupby: evt.Meta.source_ip blackhole: 5m labels: service: cpanel type: bruteforce remediation: true
На момент написания статьи на сайте разработчика представлены 20 коллекций и 56 фрагментов конфигурации.
Разработчики CrowdSec называют следующие ключевые возможности платформы:
-
обнаружение атак и реагирование на всех уровнях, причём логи могут находиться в любом месте;
-
простая установка и обслуживание с помощью консольного мастера;
-
интеграция с другими системными компонентами;
-
чтение логов и автоматическая блокировка нарушителей на уровне CDN;
-
опционально — отправка собранных метаданных по вредоносным IP-адресам в центральную БД, чтобы данные об этих адресах были доступным другим пользователям CrowdSec;
-
низкие требования к ресурсам для работы: минимум оперативной памяти и ресурсов CPU;
-
возможность обработки архивных логов для проведения расследований и симуляций;
-
предустановленные панели мониторинга.
Установка
С выпуском CrowdSec v1.1.x разработчики перевели репозиторий системы с GitHub на Package Cloud, облачный дистрибутив пакетов.
Цель перехода — дать пользователям возможность использовать больше пакетов для разных систем: помимо пакетов для Debian и Ubuntu, в репозитории имеются пакеты для Red Hat Enterprise Linux, CentOS, Amazon Linux (el/7, el/8, fc/33, fc/34, Amazon Linux/2 for x86-64 & Arm).
Таким образом, процедура установки немного изменилась и выглядит следующим образом :
Для debian и ubuntu, добавляем репозиторий PackageCloud (инструкцию по добавлению репозиториев можно также найти в документации по установке тут ):
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
Или же следуйте инструкциям ниже:
- Получаем публичный ключ репозитория:
- Устанавливаем пакет apt-transport-https, чтобы загружать пакеты по https:
curl -L https://packagecloud.io/crowdsec/crowdsec/gpgkey | sudo apt-key add –
sudo apt-get install -y apt-transport-https
Добавляем репозиторий к source.list:
debian:
echo "deb https://packagecloud.io/crowdsec/crowdsec/debian/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/crowdsec.list > /dev/nullubuntu:
echo "deb https://packagecloud.io/crowdsec/crowdsec/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/crowdsec.list > /dev/null
Устанавливаем CrowdSec
sudo apt-get update sudo apt-get install crowdsec
Запустится мастер установки, который поможет провести первоначальную настройку системы.
Мастер установки CrowdSec. Выбор служб для мониторинга
После этого мастер установки сканирует систему на ассоциированные лог-файлы и предлагает пользователю выбрать их для мониторинга:
Мастер установки CrowdSec. Выбор лог-файлов для мониторинга
После того, как службы и связанные файлы журналов будут правильно идентифицированы, мастер предложит выбрать и установить коллекции.
Выбор коллекций зависит от того, по каким направлениям планируется защищать систему:
Мастер установки CrowdSec. Выбор коллекций
Последний шаг мастера установки — развёртывание общих белых списков, которые не дают банить частные IP-адреса. Это важный этап, поскольку решение о блокировке принимает администратор системы, а не CrowdSec.
После завершения установки CrowdSec готов к работе:
Проверяем работу CrowdSec
Смоделируем сканирование веб-приложений на Nginx через wapiti с внешнего IP-адреса:
ATTACKER$ wapiti -u http://34.248.33.108/ [*] Saving scan state, please wait…Note ======== This scan has been saved in the file /home/admin/.wapiti/scans/34.248.33.108folderb753f4f6.db
Теперь посмотрим на логи «атаки»:
Из лога видно, что CrowdSec зафиксирован два сценария атак:
-
Crowdsecurity / http-path-traversal-probing — шаблонные попытки обхода в URI или параметрах GET;
-
Crowdsecurity / http-sqli-probbing-detection — попытки проверки SQL-инъекций в URI или параметрах GET.
Даже скан пустого nginx-сервера выявил две атаки. В случае с реальным сайтом сканер выявил бы множество других манипуляций, которые обычно происходят при атаках на веб-сервер.
Проверяем результаты через cscli
Один из основных инструментов для взаимодействия с CrowdSec — cscli. Помимо прочего, он позволяет визуализировать текущие решения и прошлые алёрты:
Используя команду cscli decisions list, можно посмотреть все решения, принятые за время работы системы, а cscli alerts list покажет список прошлых алёртов, даже если срок действия решения истёк или на алёрт не последовало реакции.
Чтобы получить полную информацию по принятому решению, можно вызвать его лог командой cscli alerts inspect -d <ID> (ID решения отображается в левой колонке). Результат будет выглядеть примерно так:
Cscli также позволяет посмотреть, какие парсеры и сценарии были установлены по умолчанию (cscli hub list):
Мониторинг
Ключевой момент в построении периметра безопасности — это мониторинг. Кроме классического «tail logfile» CrowdSec предлагает ещё два инструмента — metabase dashboard и метрики prometheus .
Создать панель на основе metabase и docker поможет cscli:
Команда cscli dashboard setup разворачивает новую панель мониторинга metabase на докере, попутно генерируя случайный пароль. Подключиться к ней можно с помощью браузера по адресу, указанному в команде.
Консольный мониторинг: Prometheus
Для тех, кто предпочитает работать через консоль, имеется консольный вариант мониторинга через Prometheus. Чтобы получить эти данные, можно воспользоваться командой cscli metrics.
Сscli metrics раскрывает лишь небольшую часть возможностей Prometheus. Более подробное описание имеется в официальной документации по Prometheus в CrowdSec. Вот какую информацию ещё можно получить с помощью Prometheus:
-
Buckets: как много было создано и какого типа, заполнились/были переполнены с момента запуска демона;
-
Acquisition: сколько строк/событий было прочитано в каждом из указанных источников, были ли они проанализированы и/или перемещены позже в корзины;
-
Parser: сколько строк/событий было доставлено к каждому парсеру и удалось ли ему обработать упомянутые события;
-
Local API: сколько раз был использован каждый маршрут и т. д.
- Ещё больше возможностей даёт использование Prometheus в связке с Grafana.
Вот как это выглядит:
Настройка защиты: баунсеры
Помимо детектирования и наблюдения за угрозами, CrowdSec умеет защищать систему и блокировать атаки. Для этого служат баунсеры: CrowdSec обнаруживает атаку, а баунсер блокирует атакующего.
Чтобы определить, блокировать IP или нет, баунсеры делают запрос к API CrowdSec. Скачать готовые баунсеры можно из нашего хаба на официальном сайте .
Установка баунсера
$ curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash $ sudo apt install crowdsec-firewall-bouncer crowdsec-firewall-bouncer-iptables
Баунсеры общаются с системой через REST API, поэтому нужно проверить, что у установленного баунсера получается выполнять запросы:
Командой cscli bouncers list можно проверить, установился ли баунсер.
Тестирование баунсера
Проверку работы баунсера необходимо проводить с отдельного IP-адреса. Это может быть какой-то временный прокси-сервер или мобильный интернет. Если проводить тестирование с основного адреса, система забанит его, и вы потеряете доступ к своему ресурсу.
Попытаемся получить доступ к серверу в конце сканирования:
ATTACKER$ curl --connect-timeout 1 http://34.248.33.108/ curl: (28) Connection timed out after 1001 milliseconds
Теперь посмотрим, как это выглядит со стороны нашей защиты:
Crowdsec-firewall-bouncer использует либо nftables, либо iptables. При использовании nftables, который в Debian 10 используется по умолчанию, баунсер создаёт и поддерживает две таблицы с именами Crowdsec и Crowdsec6 (для ipv4 и ipv6 соответственно).
$ sudo nft list ruleset … table ip crowdsec { set crowdsec_blocklist { type ipv4_addr elements = { 3.22.63.25, 3.214.184.223, 3.235.62.151, 3.236.112.98, 13.66.209.11, 17.58.98.156, … } }chain crowdsec_chain { type filter hook input priority 0; policy accept; ip saddr @crowdsec_blocklist drop } } table ip6 crowdsec6 { set crowdsec6_blocklist { type ipv6_addr }chain crowdsec6_chain { type filter hook input priority 0; policy accept; ip6 saddr @crowdsec6_blocklist drop } }
При необходимости можно изменить настройку брандмауэра и перейти на iptables вместо nftables, к которой обращается баунсер, в файле конфигурации /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml (для работы в режиме iptables требуется ipset).
Итог
Мы рассмотрели установку и работу CrowdSec — системы защиты интернет-ресурсов от кибератак на базе поведенческого анализа и блокировки вредоносных IP-адресов. Благодаря простоте, низким требованиям к системным ресурсам и гибким возможностям, а также богатому набору типовых конфигураций использовать CrowdSec могут даже начинающие администраторы.
Присоединяйтесь к нашему комьюнити.