Home » Linux » Установка и настройка CrowdSec

Установка и настройка CrowdSec

Хочу вас познакомить с новым современным продуктом, призванным обеспечивать защиту серверов и веб приложений. Речь пойдет об установке и настройке CrowdSec, аналоге Fail2ban, но построенном на современных принципах работы приложений. Основная особенность его в том, что он написан на Gо, и это позволяет работать гораздо быстрее упомянутого fail2ban, написанного на python.

Если у вас есть желание научиться работать с роутерами микротик и стать специалистом в этой области, рекомендую по программе, основанной на информации из официального курса MikroTik Certified Network Associate. Курс стоящий, все подробности читайте по ссылке. Есть бесплатные курсы.

Введение

CrowdSec - локальная служба, способная обеспечить некоторый уровень защиты локальных же служб и приложений. Принцип ее работы полностью аналогичен старому и известному продукту - fail2ban. В ее основе лежит анализ лог файлов и выполнение определенных действий по результату анализа. Самое распространенное действие - бан ip адреса, который выполняет недопустимые действия с сервисом.

Я установил и подробно протестировал работу CrowdSec, так что могу поделиться полученной информацией с вами и сделать некоторые выводы. Проект Open Source, живет, как водится в таких случаях, на github - https://github.com/crowdsecurity/crowdsec.

CrowdSec vs Fail2ban

Для начала рассмотрим основные отличия CrowdSec от Fail2ban:

  1. Crowdsec более производительный, так как написан на Go, в отличие от Fail2ban, который на Python.
  2. У crowdsec современный yaml формат конфигов.
  3. В качестве парсера лог файлов crowdsec использует фильтры grok, хорошо известные тем, кто активно использует elk stack. Мне лично этот фильтр нравится. Я научился на нем писать правила парсинга.
  4. У crowdsec есть готовая web панель, с помощью которой можно управлять защитой и просматривать статистику.
  5. Есть готовые контейнеры docker, которые призваны упростить установку и запуск. На практике особого упрощения нет, так как надо прокидывать в контейнеры все лог файлы для анализа. Тем не менее, кому актуален докер, не надо будет самому делать контейнеры.
  6. CrowdSec собирает глобальную статистику по заблокированным ip адресам и предоставляет возможность настроить у себя списки блокировки на основе этой статистики. Как по мне, инициатива сомнительная, так как получится то же самое, что и с подобными списками в почте. Потом употеешь себя из этих списков убирать или разбираться, почему кто-то из клиентов не может получить доступ к твоему сервису. Более того, через ботнет доверенных хостов crowdsec можно умышленно банить какие-то ip адреса.
  7. С локальной службой защиты можно взаимодействовать через встроенное API, что открывает безграничные возможности для интеграции.
  8. Из коробки работает экспорт всех основных метрик в формате Prometheus. То есть мониторинг вообще настраивать не надо, он сразу готов.

По сравнению видно, что авторы CrowdSec взяли тот же принцип анализа лог файлов, что и Fail2ban, но развили его и адаптировали под современные реалии. Я читал, что они работают над интеграцией своего продукта с Kubernetes и его Ingress Controller.

Архитектура решения

CrowdSec состоит из следующих компонентов:

  • Локальная служба, которая занимается парсингом логов и имеет свой API.
  • CLI интерфейс для взаимодействия со службой через консоль.
  • Различные модули интеграции (Bouncers) для выполнения каких-то действий на основе парсинга. Например, блокировка ip адресов с помощью firewall.
  • База данных для хранения своей информации. В самом простом случае используется sqlite, которая устанавливается автоматически и не требует отдельной настройки.
  • Публичная база данных с ip адресами и репутацией. С ней можно взаимодействовать через API.

Исходя из архитектуры, у вас есть как минимум 2 разных способа использования CrowdSec у себя. Возможна полностью локальная установка, анализ локальных логов и выполнение определенных действий на основе анализа. Взаимодействия с публичной базой данных может не быть.

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

Возможна комбинация этих режимов. Например, анализировать и свои логи, и брать информацию об ip из репутационной базы. Как я уже сказал, мне подобная база видится сомнительной инициативой, так что я ее использовать не буду. Настрою локальную службу и анализ своих лог файлов. То есть полный аналог Fail2ban.

Установка CrowdSec

С установкой CrowdSec все просто. Есть несколько вариантов:

  1. Для deb дистрибутивов есть репозиторий.
  2. Для всех остальных бинарники с инсталлятором. Rpm пакета, к сожалению, нет.
  3. Сборка и установка из исходников.
  4. Установка в docker.

Я буду ставить на Centos 8, так что скачаю бинарники и установлю инсталлятором. Быстрее было бы запустить в докере, но мне не нравится, что туда надо мапить логи. Да и в целом не вижу смысла в установке подобного софта через докер. Это же не разработка, когда надо по 5 релизов в день с автотестами выкатывать. Один раз поставил и пользуешься, иногда обновляешь. Что бинарники, что контейнер обновить одно и то же время надо.

Для Debian / Ubuntu устанавливаем CrowdSec так:

# wget -qO - https://s3-eu-west-1.amazonaws.com/crowdsec.debian.pragmatic/crowdsec.asc |sudo apt-key add - && sudo apt-add-repository "https://s3-eu-west-1.amazonaws.com/crowdsec.debian.pragmatic/$(lsb_release -cs) $(lsb_release -cs) main"
# apt update
# apt install crowdsec

В Centos установка выглядит следующим образом. Идем в репозиторий https://github.com/crowdsecurity/crowdsec/releases и качаем последнюю версию.

Загрузка crowdsec

# wget https://github.com/crowdsecurity/crowdsec/releases/download/v1.0.9/crowdsec-release.tgz
# tar xvzf crowdsec-release.tgz
# cd crowdsec-v1.0.9/

Запускаем инсталлятор:

# ./wizard.sh -i

Установка CrowdSec

Он сразу же определил основные сервисы, за логами которых будет следить. В моем случае это системные логи linux, лог авторизаций ssh и логи nginx. Далее он уточнит, какие именно лог файлы будет парсить. По умолчанию он проверяет дефолтные директории. Если что-то не нашел, то потом в конфигурационных файлах сможете вручную добавить нужные файлы с логами.

Далее нужно будет выбрать преднастроенные конфиги для различных служб. Они есть для наиболее популярных сервисов. Тут все по аналогии с Fail2ban сделано. В моем случае конфиги для веб сервера nginx, сайтов на wordpress, системных логов linux и sshd:

  • crowdsecurity/nginx
  • crowdsecurity/sshd
  • crowdsecurity/wordpress
  • crowdsecurity/linux

Выбор фильтров

Далее установщик сообщит, что создал конфиг с белым списком адресов, включающим все серые подсети.

Белый список

Я во время первого знакомства пропустил этот момент и потом долго не мог понять во время тестов в локалке, почему ничего не работает. Найти этот белых список так и не смог и забросил дело. Когда второй раз начал тесты, внимательнее все посмотрел и понял, в чем была проблема. Так что имейте ввиду этот момент.

Дальше вам будет сказано, что ни одного bouncer не установлено, так что ничего реально заблокировано не будет.

Информация о bouncers

Как я уже говорил в начале, для выполнения каких-то действий, требуются отдельные компоненты системы в виде bouncers. Далее я расскажу, как их ставить и настраивать.

На этом установка CrowdSec закончена. В конце вы увидите список основных cli команд для взаимодействия с локальной службой.

Основные команды cs cli

Можете их позапускать и посмотреть, как все это работает. Сама установка CrowdSec выполнена. Переходим к настройке.

Настройка CrowdSec

В целом, все базовые настройки уже сделаны установщиком и CrowdSec готов к работе. Напомню для тех, кто будет тестировать работу в локалке. В файле /etc/crowdsec/parsers/s02-enrich/whitelists.yaml перечислены подсети с приватными адресами, для которых проверки и блокировки не работают. Уберите оттуда свою локальную подсеть для тестов.

Так же еще один важный момент, на котором я сильно подзалип и потратил практически несколько часов в сумме, пытаясь разобраться, как все работает. Чуть не бросил всю затею с этим софтом, так как думал, что с ним какие-то проблемы. В конфиге /etc/crowdsec/parsers/s01-parse/nginx-logs.yaml описан шаблон парсинга логов nginx. Как я уже говорил, используется парсер grok. У меня по умолчанию в nginx используется модифицированный формат логов, который упрощает мониторинг бэкенда. Я об этом рассказываю в отдельной статье - парсинг логов nginx в elk stack.

Очевидно, что CrowdSec ничего не знает про мой формат и не понимает его. Поэтому ничего не работало. А я по привычке везде накатываю свой конфиг nginx. В общем, пока не поправил фильтр, ничего не получалось. Если у вас стандартные логи, то вам ничего делать не надо. Тут, кстати, налицо очевидное преимущество CrowdSec. Его фильтры парсинга на grok и они полностью совместимы с фильтрами, использующимися в ELK Stack. Для меня это огромный плюс, так как я постоянно использую ELK и у меня есть основные фильтры под него.

Основные метрики

Давайте теперь разберемся, как CrowdSec работает. Для начала посмотрим его основные метрики. Будут показаны цифры для тех сущностей, которые были активны. Например, если у вас есть логи, но они пустые и по ним не было ничего, в метриках вы их не увидите вообще. То же самое по фильтрам и сценариям.

# cscli metrics

Настройка crowdsec

Мы здесь видим:

  • BUCKET - набор активных сценариев, по которым анализировалось содержимое логов. Живут эти сценарии тут - /etc/crowdsec/scenarios.
  • SOURCE - список логов. Настраивается в конфиге /etc/crowdsec/acquis.yaml.
  • PARSERS - список шаблонов парсинга. Настраиваются тут - /etc/crowdsec/parsers.
  • ROUTE - урлы запросов к локальному API.
  • BOUNCER - не понимаю, как переводится это слово в данном контексте, но это набор инструментов для выполнения каких-то действий. Пока у нас там пусто.

Анализ логов и поиск нарушителей

Давайте теперь с какого-нибудь соседнего сервера попробуем что-то сделать с целевым, где установлен crowdsec. Для этого удобно взять утилиту мамкиных хакеров wapiti и просканить сайт. В Centos 8 ее можно поставить через pip, который по умолчанию уже есть в системе:

# pip3 install wapiti3
# wapiti -u http://10.20.1.23/

Я поставил на тестовый сервер phpmyadmin и тестировал с этой панелью работу. Итак, скан web сервера запустили, теперь идем смотреть, как отработает crowdsec. Смотрим сначала метрики, убеждаемся, что парсинг лог файлов веб сервера работает. Потом смотрим список принятых решений на основе парсинга логов и работы политик.

# cscli decisions list

cscli decisions list

IP, с которого я запустил сканирование, предлагают забанить. Сработал фильтр crowdsecurity/http-probing. Посмотрим, что он делает. Идем в /etc/crowdsec/scenarios/http-probing.yaml и смотрим содержимое.

crowdsecurity/http-probing

Если я правильно понял, то фильтр срабатывает для того, кто сделал 10 и более запросов и получил в ответ 4XX ошибки. Тут на 100% не уверен, так как детально еще не разбирался с тем, как работают и как писать свои фильтры. Этим только предстоит заняться. В error.log nginx при этом было следующее.

ban ip адреса из error.log

Более детальную информацию о событии можно посмотреть с помощью команды:

# cscli alerts inspect -d 5

5 это ID события в списке decisions. После того, как сработал один из фильтров, и ip отправился в бан, было создано ровно одно действие для этого. Посмотреть, под какие еще фильтры попал этот ip можно с помощью alerts.

# cscli alerts list

cscli alerts list

Обращаю внимание, что тут так же отмечено то, что из Community blocklist пришли 80 ip адресов для бана. В будущем мы отключим этот лист, чтобы полностью управлять банами самостоятельно на основе анализа только своих логов.

Установка cs-firewall-bouncer для бана ip

В настоящий момент мы только имеем намерение забанить ip адрес с помощью crowdsec, но не имеем возможности. Исправим это, установив cs-firewall-bouncer. Для этого идем на страницу https://hub.crowdsec.net/browse/#bouncers и скачиваем его на сервер.

# wget https://github.com/crowdsecurity/cs-firewall-bouncer/releases/download/v0.0.10/cs-firewall-bouncer.tgz

Он будет банить ip адреса с помощью iptables или nftables, в зависимости от того, что у вас установлено в системе. Если iptables, то будет использован ipset. Установите его предварительно на сервер, если его нет.

# dnf install ipset

Теперь устанавливаем сам bouncer.

# tar xzvf cs-firewall-bouncer.tgz
# cd cs-firewall-bouncer-v0.0.10/
# ./install

У меня дефолтный сервер Centos 8 c Firewalld на борту. Установщик почему-то решил, что у меня установлены и iptables, и nftables. Предложил выбрать из них. Буду использовать nftables. Пора привыкать к новому.

Установка cs-firewall-bouncer

Bouncer установлен. Проверим, все ли с ним в порядке.

# cscli metrics

cscli metrics

После установки он автоматически забанит все адреса, что были ранее помечены для этого. Проверяем:

# nft list tables

таблица nftables со списком crowdsec

# nft list table ip crowdsec

список заблокированных ip адресов

Видим тут целую кучу ip адресов из публичного списка. Давайте сразу отключим его. Для этого открываем основной конфиг /etc/crowdsec/config.yaml и комментируем там строки:

#    online_client: # Crowdsec API credentials (to push signals and receive bad IPs)
#      credentials_path: /etc/crowdsec/online_api_credentials.yaml

После этого перезапускаем службу:

# systemctl restart crowdsec

Проверяем список alerts:

# cscli alerts list
INFO[12-03-2021 09:11:54 PM] push and pull to crowdsec API disabled

Видим, что обмен с crowdesc API отключен. Ранее добавленные адреса останутся. Вы можете их вручную удалить, либо подождать, когда они по таймауту будут удалены сами. Как вручную управлять блокировками, я покажу ниже отдельно.

Скажу еще пару слов о том, как crowdesc работает с iptables. Как я уже сказал ранее, он использует таблицу ipset для хранения списка блокировок. Cs-firewall-bouncer автоматически создаст список crowdsec-blacklists и поместит в самый верх списка правил iptables свое:

Интеграция crowdsec с iptables

Посмотреть этот список можно следующим образом:

# ipset -L crowdsec-blacklists

Там же сразу же будет указано время жизни записи для каждого ip. В целом, все работает просто и надежно. Я проверил и с iptables, и с nftibles. С Firewalld тоже никаких проблем нет. Он не мешает.

Ручное управление блокировками

По умолчанию в качестве Decision применяется ban на 4 часа. Изменить эти параметры можно в файле /etc/crowdsec/profiles.yaml. В настоящий момент, как я понял, доступны 2 действия:

  1. Ban
  2. Captcha

Как настроить последнюю, я не разбирался. А вообще интересная штука. Надо бы потестировать.

Разблокировать вручную конкретный ip можно следующей командой:

# cscli decisions delete --ip 10.20.1.16

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

# cscli decisions delete --all

Можно вручную кого-то забанить:

# cscli decisions add --ip 10.20.1.16 --reason "web bruteforce" --type ban

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

Web панель управления CrowdSec

Для CrowdSec из коробки идет готовая панель управления через браузер. Устанавливается она только через Docker. Как ее установить вручную без докера я не нашел информации, правда не особо и искал. Ставится она как-то глючно и через раз. То скачать что-то не может, то установка зависает, то учетку для доступа не показывает.

По установке Docker у меня есть отдельная статья. Можете воспользоваться, если еще не поставили его. Сама панель ставится через cscli.

# cscli dashboard setup

На выходе получите url для входа и учетные данные. Не забудьте открыть соответствующий порт на firewall для панели. По умолчанию это tcp 3000. Дефолтная учетка crowdsec@crowdsec.net, пароль !!Cr0wdS3c_M3t4b4s3?? Если инсталлятор в конце не покажет реквизиты доступа, попробуйте эти. Я их подсмотрел, запустив установщик в режиме --debug. Сам установщик мне их ни разу не показал, так как постоянно вываливался то с ошибкой, а на другом хосте бесконечно висел в режиме установки. Хотя по факту контейнер запустил и он нормально работал.

CrowdSec Dashboard

В этой web панели вы можете просматривать все то же самое, что доступно через локальное cli. В целом, удобно, но не уверен, что в этом есть большая практическая польза. Не вижу большого смысла все это просматривать вручную. Хотя с дугой стороны там можно гибко фильтры настраивать. Возможно в каких-то случаях это будет актуально.

Мониторинг CrowdSec

По умолчанию, CrowdSec отдает все свои метрики в формате Prometheus по адресу http://127.0.0.1:6060/metrics. Проверяем:

# curl http://127.0.0.1:6060/metrics

Там будет вся информация по состоянию локальной службы. Далее вы очень просто переносите все это дело в Grafana. Готовый Dashbord забираете по ссылке - https://github.com/crowdsecurity/grafana-dashboards.

Мониторинг CrowdSec

Я сам мониторинг пока не тестировал и не смотрел, но не думаю, что там есть какие-то сложности. Все должно завестись без проблем.

Видео

Заключение

На этом завершаю обзор CrowdSec. Получилось и так насыщенно и объемно. Я бегло посмотрел всю документацию, чтобы понять возможности программы. Мне она очень понравилась. 100% буду ее дальше изучать и использовать вместо Fail2ban. Давно уже задумывался, почему нет развития этой программы. Очевидно, что в текущем виде Fail2ban морально устарел.

Я рассмотрел только один bouncer для firewall. Но там есть еще и для nginx, и для haproxy. Например, вы можете отдавать 403 ошибки заблокированным ip адресам. Это действие по умолчанию. Свое поведение вы сможете настроить с помощью lua в соответствующих конфигах.

Так же есть bouncer для wordpress. Он взаимодействует со специальным плагином, который нужно будет установить на сайт. Он то как раз и умеет показывать каптчу, а не просто банить ip адреса.

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

Надеюсь, у меня получилось вас познакомить с CrowdSec и дать представление о нем. Как он вам? Пробовать будете?

Онлайн курсы по Mikrotik

Если у вас есть желание научиться работать с роутерами микротик и стать специалистом в этой области, рекомендую пройти курсы по программе, основанной на информации из официального курса MikroTik Certified Network Associate. Помимо официальной программы, в курсах будут лабораторные работы, в которых вы на практике сможете проверить и закрепить полученные знания. Все подробности на сайте . Стоимость обучения весьма демократична, хорошая возможность получить новые знания в актуальной на сегодняшний день предметной области. Особенности курсов:
  • Знания, ориентированные на практику;
  • Реальные ситуации и задачи;
  • Лучшее из международных программ.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Zerox
Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

9 комментариев

  1. Аватар

    Что-то я здесь напутал с последовательностью ответов, и получилось сумбурно, сорри

  2. Аватар

    И да: посмотрел свои закладки - ваша статья "Защита почтового сервера postfix + dovecot с помощью fail2ban" там есть.
    Значит, и она не помогла ни мне, ни моим добровольным и платным помощникам по защите почты.
    Слишком сложная настройка почты, но это недостаток самого fail2ban.
    Почему-то защита SSH в нем настраиваетя элементарно.

    • Zerox

      Так от чего не получается защититься? Вы можете конкретно показать, какие моменты вы хотите распарсить в логе и настроить бан для тех, кто оставляет эти метки в логах?

      • Аватар

        Конкретнее не помню, уже с год прошел после этих попыток.
        Надо начинать все заново.
        Главная проблема - ISPManager не дружит с fail2ban.

  3. Аватар

    Спасибо за быстрый ответ!
    Вот уж не припомню, пользовался ли этой вашей статьей по защите почты с помощью fail2ban.
    Помню только, что потратил на эту проблему уймищу времени, помощники тоже, и потом плюнул на это дело.

    "Архитектурность" CrowdSec как-то не вызывает интереса ;-), а вот простота настройки - это для меня стоит на первом месте, т.к. копаться в множестве хитрых выражений изрядно утомляет.

    Как с простотой настройки защиты почты обстоит в CrowdSec?

    • Zerox

      Я не смотрел еще его готовые правила для postfix/dovecot и т.д. По аналогии с тем, что посмотрел, не думаю, что там будет много отличий от fail2ban. Настройку CrowdSec я описал в статье, можно самостоятельно оценить сложность. В целом, чуть посложнее, чем fail2ban, так как сервис многокомпонентный. Но понравилось то, что интеграция с firewall, что в случае с iptables, что с nftables, заработала сразу и автоматически. Я сам ничего не делал. С fail2ban иногда что-то не работает, приходится разбираться.

      • Аватар

        Вспомнил, почему не получилось настроить fail2ban ни мне, ни моим помощникам.
        На сервере используется ISPManager. И вот все, что не делали в fail2ban, все эти действия и правила вступали в конфликт с ISPManager, который имел по их поводу свое собственное мнение и переделывал их на свой лад.
        В результате вообще ничего не работало. Так и не удалось их помирить.

  4. Аватар

    Отличная и очень подробная статья, респект!

    Но вот засада - для защиты SSH и прочих подобных сервисов и с древним fail2ban проблем нет, он даже настроен на него по дефолту.
    Но когда речь заходит о защите почты SMTP, так нет ни одной грамотной статьи.

    Более того - самые крутые знатоки fail2ban, которые даже пишут статьи о нем и которые по моей просьбе попытались настроить fail2ban для защиты почты (даже за оплату!), позорно облажались.

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

    Zerox, если я не прав - попробуйте это опровергнуть в дополнении к вашей замечательной статье.

    • Zerox

      Какие конкретно проблемы с защитой почты и что не получается сделать? У меня есть статья на этот счет - https://serveradmin.ru/fail2ban-postfix-dovecot/ Меня такая защита вполне устраивает.

      Сам по себе CrowdSec не предлагает ничего особо нового в плане непосредственно защиты. Он именно архитектурно намного удобнее. Можно, к примеру, на внешнем шлюза поставить cs-firewall-bouncer, который будет по api забирать ip для блокировки с веб сервера, где анализируются логи. Для fail2ban придется колхозить какие-то костыли для этого, а тут все готово. Не надо ничего придумывать. Для меня это очень удобно, так как на веб сервера обычно проксируются запросы с внешних шлюзов. Удобно банить сразу на шлюзе, а на веб сервере не трогать firewall вообще.

      Я думаю, это решение получит развитие в будущем, так как бесплатных аналогов нет.

Добавить комментарий

Ваш адрес email не будет опубликован.

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.