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.
Некоторые коллекции могут включать себя другие коллекции (зависимости).
Существует большое количество различных готовых коллекций, почти на все случаи жизни. Также можно полностью с нуля написать собственные парсеры и сценарии, собрать свою коллекцию и поделиться с сообществом.
Decisions
Решения — это таблица IP-адресов, которые в результате отработки установленных сценариев попали в список подозрительных.
Пример ручного добавления в список:
cscli decisions add --ip 1.2.3.4
Проверить списки можно такой командой:
cscli decisions list # Your list
cscli decisions list --origin CAPI # Crowdsec community lists
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 на практике. Решим следующие задачи:
- Запустить СrowdSec с нужными коллекциями.
- Запустить Blacklist mirror и связать с СrowdSec.
- Обновлять полученные IP в firewall address list block на mikrotik
- Заблокировать в цепочках 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:
- Подставить полученный ключ в crowdsec-blocklist-mirror.yaml (значение lapi_key)
- Использовать переменную 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, настроенный выше)
Подготовка mikrotik
Подключиться к маршрутизатору и выполнить следующие действия:
- Добавить пользователя, настроить права для доступа api.
- IP -> services, разрешить api-ssl.
- Установить сертификаты.
Создать сертификаты
/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-адресов (есть ограничения на количество запросов в час).
Этот раздел показывает календарь с активностью зарегистрированных отчетов с выбранного адреса: когда последний раз появлялся, на основании каких сценариев, попадания в бан листы и т.п.
Итоги
В результате большого вклада сообщества Crowdsec имеет огромное количество различных интеграций и возможностей применения на любых уровнях систем.
В статье показан один из простых примеров использования, для получения актуального списка вредоносных IP-адресов.
С помощью CrowdSec удалось повысить качество firewall на своем оборудовании.
Небольшое потребление ресурсов позволяет запустить все сервисы даже на самом маршрутизаторе.