Найти тему
Timeweb Cloud

Crowdsec Blocklist: как поднять у себя и варианты применения

CrowdSec blocklist — народный черный список подозрительных IP-адресов.

Введение

CrowdSec — это open-source-инструмент для защиты от кибератак.

Его основным отличием от других сервисов контроля доступа является то, что в CrowdSec Blocklist список опасных IP-адресов собирается сообществом.

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

Основные понятия

Полезные материалы:

Компоненты

Для различных интеграций используется модульная система. Отдельные модули создаются и поддерживаются разработчиками, но основное множество написано сообществом и энтузиастами.

Составные модули можно разделить на несколько видов:

  • parsers
  • scenarios
  • collections

Parsers

Парсеры (анализаторы) — описывают фильтры и разные методы обработки логов, помогают разбирать их на более понятные кусочки, что позволяет автоматизировать анализ информации и делает его более быстрым и точным.

Scenarios

Сценарии — позволяют обнаруживать определенное поведение, обычно атаку. Именно по правилам описания сценария определяются подозрительные запросы.

Например, есть множество готовых описанных сценариев для определения:

  • брутфорс-атак
  • сканирования портов
  • сканирования дерева URL-адресов
  • DDoS-атак

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

Collections

Коллекция — это специальный набор parsers и scenarios, который собран для различных случаев защиты системы.

Например набор инструментов crowdsecurity/sshd применяется для анализа журналов sshd с целью выявления попыток взлома через bruteforce или перебора пользователей.

При выборе наборов инструментов важно ориентироваться на направления защиты системы и сочетать различные наборы на различных уровнях, чтобы обеспечить комплексную защиту.

Например, использование на разных участках:

  • core-маршрутизатор (отсекать основные IP-адреса из черного списка сообщества)
  • nginx (установить коллекцию для анализа логов и блокировки по сценариям http-уязвимостей)

Все доступные коллекции можно посмотреть на Crowdsec HUB.

Коллекции можно на Crowdsec HUB
Коллекции можно на Crowdsec HUB

Некоторые коллекции могут включать себя другие коллекции (зависимости).

crowdsecurity/linux включает в себя коллекцию crowdsecurity/sshd
crowdsecurity/linux включает в себя коллекцию crowdsecurity/sshd

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

Decisions

Решения — это таблица IP-адресов, которые в результате отработки установленных сценариев попали в список подозрительных.

Пример ручного добавления в список:

cscli decisions add --ip 1.2.3.4

Проверить списки можно такой командой:

cscli decisions list # Your list
cscli decisions list --origin CAPI # Crowdsec community lists

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

Bouncers

Bouncers (вышибалы) — это отдельные автономные программные компоненты, которые отвечают за выполнение решений (decisions), принятых CrowdSec. Например, они могут заблокировать по IP или отправить на страницу с captcha.

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

Полный список Bouncers можно найти тут: HUB - Remediation components.

Принцип работы Bouncer на примере cs-nginx-bouncer:

На основе lua-скрипта входящие IP-адреса проверяются с помощью локального crowdsec-агента по API. Если адрес источника есть в списке решений на блокировку (decisions), то этот запрос блокируется и пользователю возвращается ответ 403.

Документация: nginx-bouncer

Blacklist mirror

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

Сам по себе установленный CrowdSec-агент не отдает список IP-адресов, для этих целей предлагается использовать специальный bouncer, который называется blacklist-mirror.

Crowdsec Blacklist mirror связывается с локальным crowdsec по LAPI и на основе полученных данных поднимает свой локальный HTTP-сервер, который при запросах выдает полный список актуальных опасных IP-адресов.

Полученный список адресов можно использовать в сетевых устройствах для защиты или реализовать свои механизмы блокировок/

Полезные материалы:

Использование CrowdSec

Посмотрим использование CrowdSec на практике. Решим следующие задачи:

  1. Запустить СrowdSec с нужными коллекциями.
  2. Запустить Blacklist mirror и связать с СrowdSec.
  3. Обновлять полученные IP в firewall address list block на mikrotik
  4. Заблокировать в цепочках input и forward адреса из списка block

Установка СrowdSec

Docker compose — самый простой и универсальный способ установки.

Запустить на отдельном сервере compose.yaml

services:
crowdsec:
image: ${CROWDSEC_IMAGE_TAG:-crowdsecurity/crowdsec:latest}
container_name: crowdsec
restart: unless-stopped
environment:
TZ: Asia/Yekaterinburg
COLLECTIONS: "a1ad/mikrotik crowdsecurity/traefik" # crowdsecurity/nginx fulljackz/proxmox crowdsecurity/linux
# ENROLL_KEY: "clomgynlexampletokenn3cd" # Uncomment and insert your token if you want crowdsec dashboard https://app.crowdsec.net
# ENROLL_INSTANCE_NAME: "homelab" # Uncomment if you want https://app.crowdsec.net
ports:
- 8080:8080
- 6060:6060
volumes:
- ./crowdsec/data:/var/lib/crowdsec/data
- ./crowdsec/config:/etc/crowdsec
healthcheck:
test: ["CMD", "cscli", "version"]
start_period: 10s
networks:
crowdsec_net:
ipv4_address: 172.21.0.11

blocklist:
image: ${CROWDSEC_BLOCKLIST_IMAGE_TAG:-crowdsecurity/blocklist-mirror:latest}
container_name: blocklist
restart: unless-stopped
depends_on:
crowdsec:
condition: service_healthy
environment:
TZ: Asia/Yekaterinburg
API_KEY: ${API_KEY:-'UseCrowdSecAPIKey'}
ports:
- 41412:41412
volumes:
- ./crowdsec-blocklist-mirror.yaml:/etc/crowdsec/bouncers/crowdsec-blocklist-mirror.yaml
healthcheck:
test: wget -qO- http://localhost:41412/security/blocklist?ipv4only || exit 1
start_period: 20s
interval: 5s
timeout: 3s
retries: 5
networks:
crowdsec_net:
ipv4_address: 172.21.0.12

networks:
crowdsec_net:
driver: bridge
ipam:
config:
- subnet: 172.21.0.0/24
gateway: 172.21.0.1

Необходимо создать файл crowdsec-blocklist-mirror.yaml для blocklist-mirror.

Готовые примеры конфигурации и compose.yaml можно найти тут: github crowdsec-blocklist.

Запуск:

docker compose up -d

Для получения API key, в crowdsec выполнить команду для добавления bouncer:

docker compose exec crowdsec cscli bouncers add blocklistMirror

Пример вывода:

API key for 'blocklistMirror':
hsevAVxNwExampleTkeyfdssdfrqNyTsdy51/U
Please keep this key since you will not be able to retrieve it!

Два способа использовать этот ключ в blocklist-mirror bouncer:

  1. Подставить полученный ключ в crowdsec-blocklist-mirror.yaml (значение lapi_key)
  2. Использовать переменную API_KEY в .env файле или в переменные compose.yaml для blocklist-mirror контейнера

Перезапустить контейнеры:

docker compose restart

Дополнительно:

  • Сетевые адреса лучше использовать статичные (настраивается в compose.yaml)
  • COLLECTIONS — позволяет заранее задать список необходимых коллекций
  • ENROLL_KEY и ENROLL_INSTANCE_NAME — стоит использовать, если нужно привязать текущего агента crowdsec в личном кабинете на портале Crowdsec. Позволяет следить за статусом и подключать дополнительные списки блокировок (подробнее ниже).

Проверка

Можно открыть и проверить в браузере: http://YOUR_IP:6060/metrics

Пример вывода:

# HELP cs_active_decisions Number of active decisions.
# TYPE cs_active_decisions gauge
cs_active_decisions{action="ban",origin="CAPI",reason="a1ad/mikrotik-bf"} 55
cs_active_decisions{action="ban",origin="CAPI",reason="a1ad/mikrotik-scan-multi_ports"} 112
cs_active_decisions{action="ban",origin="CAPI",reason="crowdsecurity/CVE-2017-9841"} 618
cs_active_decisions{action="ban",origin="CAPI",reason="crowdsecurity/CVE-2019-18935"} 28
cs_active_decisions{action="ban",origin="CAPI",reason="crowdsecurity/CVE-2022-26134"} 103
cs_active_decisions{action="ban",origin="CAPI",reason="crowdsecurity/fortinet-cve-2018-13379"} 29
cs_active_decisions{action="ban",origin="CAPI",reason="crowdsecurity/grafana-cve-2021-43798"} 12
cs_active_decisions{action="ban",origin="CAPI",reason="crowdsecurity/http-admin-interface-probing"} 1782
cs_active_decisions{action="ban",origin="CAPI",reason="crowdsecurity/http-backdoors-attempts"} 177
cs_active_decisions{action="ban",origin="CAPI",reason="crowdsecurity/ssh-bf"} 9501
cs_active_decisions{action="ban",origin="CAPI",reason="crowdsecurity/ssh-slow-bf"} 9
cs_active_decisions{action="ban",origin="CAPI",reason="crowdsecurity/thinkphp-cve-2018-20062"} 1

Или в консоли:

docker compose exec crowdsec cscli metrics

Основные метрики сервиса: http://YOUR_IP:41412/metrics

Пример вывода:

# HELP active_decision_count Total number of decisions served by any blocklist
# TYPE active_decision_count gauge
active_decision_count 18777

Основной URL со списком IP адресов:

http://YOUR_IP:41412/security/blocklist?ipv4only

Пример вывода:

Вывод списка адресов в браузере
Вывод списка адресов в браузере

В браузере видим список потенциально опасных IP-адресов, осталось начать их блокировать.

На этом этапе настройка и запуск CrowdSec с получением вредных IP от сообщества завершена.

Вы можете использовать данный список на ваше усмотрение и блокировать на уровне различных сервисов и служб.

Далее в статье мы рассмотрим использование данного списка на устройствах RouterOS.

Блокировка CrowdSec Blocklist на RouterOS

Полученные IP-адреса нужно добавить в firewall address list на маршрутизаторе

Согласно документации, BlackList Mirror поддерживает различные форматы выводов:

  • plain_text: Просто IP-адреса, каждый в отдельной строке
  • mikrotik: Вывод строк в формате команд RouterOS:

/ip firewall address-list add list={list_name} address={ip} comment="{scenario} for {duration}

  • F5: Вывод строк в формате команд f5:

{ip|range},{netmask},bl,{scenario}

Изменил в настройках crowdsec-blocklist-mirror.yaml формат вывода mikrotik.

Данная настройка поможет получать ответ от HTTP-сервера в заранее подготовленном виде команд для маршрутизатора.

Добавить в scheduler-скрипт:

/tool fetch url="http://YOUR_IP:41412/security/blocklist?ipv4only" dst-path=block_list.rsc;
:import block_list.rsc

Список IP-адресов в этот момент составлял ~ 30 000. Добавлено расписание, чтобы каждые 30 минут маршрутизатор удалял все IP-адреса и добавлял заново все 30 000 адресов, даже если изменился всего 1 адрес.

Это рабочее решение, но желательно сделать доработку, которая будет выполнять только синхронизацию, а не постоянное удаление и добавление всего списка.

Для этого буду использовать еще один отдельный сервис — MikroSecList.

Mikrotik firewall sync

MikroSecList — это комбинация Mikrotik + CrowdSec block list sync.

Это отдельное приложение, которое занимается синхронизацией и обновляет список адресов в firewall mikrotik.

Все, что нужно указать для работы сервиса:

  • Конфигурацию для подключения к устройству mikrotik
  • URL со списком IP-адресов (Blocklist mirror, настроенный выше)

Ссылка на проект в Github

Подготовка mikrotik

Подключиться к маршрутизатору и выполнить следующие действия:

  1. Добавить пользователя, настроить права для доступа api.
  2. IP -> services, разрешить api-ssl.
  3. Установить сертификаты.

Создать сертификаты

/certificate
add name=CA-Template common-name=CAtemp key-usage=key-cert-sign,crl-sign
add name=Server common-name=server
add name=Client common-name=client

Подписать сертификаты

/certificate
sign CA-Template
sign Client
sign Server ca-crl-host=192.168.88.1 name=ServerCA

Добавить сертификат в api-ssl

/ip service
set api-ssl address=192.168.88.0/24 certificate=ServerCA

Запуск firewall sync

Можно поднять как отдельный сервис или добавить в предыдущий compose.yaml рядом с crowdsec:

services:
mikroseclist:
image: ${MIKROSECLIST_IMAGE_TAG:-ghcr.io/akmalovaa/mikroseclist}
container_name: mikroseclist
depends_on:
blocklist:
condition: service_healthy
restart: true
crowdsec:
condition: service_started
command: ["python", "-m", "mikroseclist.main"]
environment:
MIKROTIK_HOST: ${MIKROTIK_HOST:-'192.168.88.1'}
MIKROTIK_USER: ${MIKROTIK_USER:-'admin'}
MIKROTIK_PASSWORD: ${MIKROTIK_PASSWORD:-'password'}
BLOCKLIST_URL: 'http://blocklist:41412/security/blocklist?ipv4only'
SYNC_INTERVAL_MIN: 15
restart: unless-stopped
networks:
crowdsec_net:
ipv4_address: 172.21.0.3

В переменных необходимо задать настройки и запустить:

  • MIKROTIK_HOST
  • MIKROTIK_USER
  • MIKROTIK_PASSWORD

Первая синхронизация займет примерно 1-2 минуты для добавления полного списка в 30 000 адресов.

В дальнейшем будет выполняться только синхронизация.

Логи сервиса
Логи сервиса

Важно не забыть добавить правило обработки Firewall на маршрутизаторе.

/ip firewall filter
add action=accept chain=input src-address-list=access # access list optional
add action=drop chain=input in-interface=ether1 src-address-list=block
add action=drop chain=forward in-interface=ether1 src-address-list=block

Использование правила drop позволит экономить ресурсы маршрутизатора и серверов за ним. Все запросы с данных IP-адресов будут сразу отброшены.

Дополнительные возможности в личном кабинете Crowdsec

Это личный кабинет пользователя, где есть возможность контролировать все запущенные экземпляры CrowdSec: https://app.crowdsec.net

Для того чтобы добавить свой сервер в ЛК, нужно зарегистрироваться на портале и получить ENROLL_KEY на вкладке engines.

Команда для синхронизации в консоли crowdsec:

cscli console enroll clhulihuliexample1n3cd

Второй вариант — раскомментировать и использовать строки в compose.yaml.

service:
crowdsec:
...
ENROLL_KEY: "clhulihuliexample1n3cd"
ENROLL_INSTANCE_NAME: "homelab"
...

После перезапуска ваш сервер crowdsec появится в личном кабинете.

Получаем возможность просмотреть в удобном формате все запущенные компоненты и предупреждения.

Просмотр компонентов в личном кабинете
Просмотр компонентов в личном кабинете

Дополнительные списки блокировок

Еще одной причиной привязать сервис в личном кабинете является возможность подписаться на дополнительные сборки IP-адресов, которые отдельно собирают определенные компании, сообщества и постоянно их обновляют.

Дополнительные блоклисты
Дополнительные блоклисты

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

В ходе использования и анализа трафика для меня самыми эффективными списками стали:

  • Firehol cybercrime tracker list — 1.5k адресов
  • OTX Web Scanners List — 9k адресов

Основные боты, которые перебирали домены по URL и искали уязвимости, уже были в списке OTX Web Scanners List и успешно блокировались на уровне маршрутизатора

Explore IPs

На портале имеется страница для проверки IP-адресов (есть ограничения на количество запросов в час).

Страница проверки IP-адресов
Страница проверки IP-адресов

Этот раздел показывает календарь с активностью зарегистрированных отчетов с выбранного адреса: когда последний раз появлялся, на основании каких сценариев, попадания в бан листы и т.п.

Итоги

В результате большого вклада сообщества Crowdsec имеет огромное количество различных интеграций и возможностей применения на любых уровнях систем.

В статье показан один из простых примеров использования, для получения актуального списка вредоносных IP-адресов.

С помощью CrowdSec удалось повысить качество firewall на своем оборудовании.

Небольшое потребление ресурсов позволяет запустить все сервисы даже на самом маршрутизаторе.