Обложка: DDoS — не вопрос: защищаем интернет-проекты от кибератак

DDoS — не вопрос: защищаем интернет-проекты от кибератак

Коротко о CrowdSec

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

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

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

Сравнение решения с Fail2Ban теоретически возможно, но не вполне корректно, поскольку CrowdSec значительно более мощная система, совместимая с IPV6, в состав которой входит множество поведенческих шаблонов и готовых конфигураций для самых распространённых случаев.

Мы помогаем не только обнаруживать и блокировать вредоносные IP, но и, после проверки, делиться данными о заблокированных IP-адресах с другими пользователями, чтобы их локально установленные CrowdSec-системы могли тоже их заблокировать. Таким образом,  целесообразно рассматривать в качестве глобальной базы репутации IP-адресов, своеобразной прививки от пандемии вредоносных кибератак.

Принцип работы CrowdSec

Система состоит из трёх основных компонентов:

  • агента CrowdSec — службы мониторинга, которая отслеживает логи указанных в настройке системных сервисов, например, nginx, Apache2, WordPress, netfilter на предмет атак и потенциально опасных или нежелательных действий;
  • утилиты управления службой из командной строки cscli;
  • баунсеров (bouncers) — отдельных программных частей, отвечающих за выполнение решений, принятых агентом CrowdSec, таких как блокировка IP, ввод капчи, применение MFA так далее.

Архитектура 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.

Чтобы упростить настройку 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 фрагментов конфигурации. Перечислим ключевые возможности платформы:

  • обнаружение атак и реагирование на всех уровнях;
  • простая установка и обслуживание с помощью консольного мастера;
  • интеграция с другими системными компонентами;
  • чтение логов и автоматическая блокировка нарушителей на уровне CDN;
  • отправка при необходимости собранных сведений о вредоносных IP-адресах в глобальную БД репутации;
  • минимум оперативной памяти и потребления ресурсов процессора;
  • возможность работы с архивными логами для расследований и симуляций;
  • предустановленные панели мониторинга.

Установка

С выпуском 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

Или же следуем инструкциям ниже:

  • Получаем публичный ключ репозитория:
curl -L https://packagecloud.io/crowdsec/crowdsec/gpgkey | sudo apt-key add –
  • Устанавливаем пакет apt-transport-https, чтобы загружать пакеты по https:
sudo apt-get install -y apt-transport-https
  • Добавляем репозиторий к source.list:
echo "deb https://packagecloud.io/crowdsec/crowdsec/debian/ $(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. Выбор служб для мониторинга

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

Выбор лог-файлов для мониторинга

Когда службы и связанные файлы журналов будут корректно идентифицированы, мастер предложит выбрать и установить коллекции. Выбор коллекций зависит от того, по каким направлениям планируется защищать систему.

Выбор коллекций в мастере установки

Финальный этап работы мастера установки — развёртывание общих белых списков, которые не дают банить частные IP-адреса. Это важный этап, поскольку решение о блокировке принимает администратор системы, а не CrowdSec.

После завершения установки CrowdSec готов к работе:

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

Чтобы проверить, как работает свежеустановленный CrowdSec, проведём имитацию сканирования веб-приложений на nginx через wapiti с внешнего хоста ATTACKER:

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

Утилита командной строки cscli — основной способ взаимодействия с CrowdSec. Помимо прочего, она позволяет отследить текущие решения и прошлые предупреждения:

Используя команду 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/crowdsec-firewall-bouncer/crowdsec-firewall-bouncer.yaml/. Для работы в режиме iptables требуется ipset.

Защита готова

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

Присоединяйтесь к комьюнити CrowdSec:

Официальный сайт CrowdSec

GitHub проекта 

Пока вся документация на английском языке, но не стесняйтесь писать в чат на нашем сайте. Мы обязательно ответим на ваши вопросы и поможем разобраться, если возникнут трудности.