Thank you for reading this post, don't forget to subscribe!
Речь пойдет об установке и настройке CrowdSec, аналоге Fail2ban, но построенном на современных принципах работы приложений. Основная особенность его в том, что он написан на Gо, и это позволяет работать гораздо быстрее упомянутого fail2ban, написанного на python.
CrowdSec - локальная служба, способная обеспечить некоторый уровень защиты локальных же служб и приложений. Принцип ее работы полностью аналогичен старому и известному продукту - fail2ban. В ее основе лежит анализ лог файлов и выполнение определенных действий по результату анализа. Самое распространенное действие - бан ip адреса, который выполняет недопустимые действия с сервисом.
Проект Open Source, живет на github - https://github.com/crowdsecurity/crowdsec.
CrowdSec vs Fail2ban
Для начала рассмотрим основные отличия CrowdSec от Fail2ban:
- Crowdsec более производительный, так как написан на Go, в отличие от Fail2ban, который на Python.
- У crowdsec современный yaml формат конфигов.
- В качестве парсера лог файлов crowdsec использует фильтры grok, хорошо известные тем, кто активно использует elk stack. Мне лично этот фильтр нравится. Я научился на нем писать правила парсинга.
- У crowdsec есть готовая web панель, с помощью которой можно управлять защитой и просматривать статистику.
- Есть готовые контейнеры docker, которые призваны упростить установку и запуск. На практике особого упрощения нет, так как надо прокидывать в контейнеры все лог файлы для анализа. Тем не менее, кому актуален докер, не надо будет самому делать контейнеры.
- CrowdSec собирает глобальную статистику по заблокированным ip адресам и предоставляет возможность настроить у себя списки блокировки на основе этой статистики. Как по мне, инициатива сомнительная, так как получится то же самое, что и с подобными списками в почте. Потом употеешь себя из этих списков убирать или разбираться, почему кто-то из клиентов не может получить доступ к твоему сервису. Более того, через ботнет доверенных хостов crowdsec можно умышленно банить какие-то ip адреса.
- С локальной службой защиты можно взаимодействовать через встроенное API, что открывает безграничные возможности для интеграции.
- Из коробки работает экспорт всех основных метрик в формате Prometheus. То есть мониторинг вообще настраивать не надо, он сразу готов.
По сравнению видно, что авторы CrowdSec взяли тот же принцип анализа лог файлов, что и Fail2ban, но развили его и адаптировали под современные реалии.
Архитектура решения
CrowdSec состоит из следующих компонентов:
- Локальная служба, которая занимается парсингом логов и имеет свой API.
- CLI интерфейс для взаимодействия со службой через консоль.
- Различные модули интеграции (Bouncers) для выполнения каких-то действий на основе парсинга. Например, блокировка ip адресов с помощью firewall.
- База данных для хранения своей информации. В самом простом случае используется sqlite, которая устанавливается автоматически и не требует отдельной настройки.
- Публичная база данных с ip адресами и репутацией. С ней можно взаимодействовать через API.
Исходя из архитектуры, у вас есть как минимум 2 разных способа использования CrowdSec у себя. Возможна полностью локальная установка, анализ локальных логов и выполнение определенных действий на основе анализа. Взаимодействия с публичной базой данных может не быть.
Второй, противоположный вариант, когда вы вообще не анализируете свои логи, а используете публичную репутационную базу данных адресов и выполняете какие-то действия с ними с помощью Bouncers. Например, всем ip адресам из базы показываете каптчу.
Возможна комбинация этих режимов. Например, анализировать и свои логи, и брать информацию об ip из репутационной базы. Как я уже сказал, мне подобная база видится сомнительной инициативой, так что я ее использовать не буду. Настрою локальную службу и анализ своих лог файлов. То есть полный аналог Fail2ban.
Установка CrowdSec
С установкой CrowdSec все просто. Есть несколько вариантов:
- Для deb дистрибутивов есть репозиторий.
- Для всех остальных бинарники с инсталлятором. Rpm пакета, к сожалению, нет.
- Сборка и установка из исходников.
- Установка в 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 и качаем последнюю версию.
[root@centos7 ~]# wget https://github.com/crowdsecurity/crowdsec/releases/download/v1.0.9/crowdsec-release.tgz
[root@centos7 ~]# tar xvzf crowdsec-release.tgz
[root@centos7 ~]# cd crowdsec-v1.0.9/
!!!!!!ВАЖНО ПОРТ 8080 ДОЛЖЕН БЫТЬ СВОБОДЕН
Запускаем инсталлятор:
[root@centos7 crowdsec-v1.0.9]# ./wizard.sh -i
Он сразу же определил основные сервисы, за логами которых будет следить. В моем случае это системные логи linux, лог авторизаций ssh и логи nginx. Далее он уточнит, какие именно лог файлы будет парсить. По умолчанию он проверяет дефолтные директории. Если что-то не нашел, то потом в конфигурационных файлах сможете вручную добавить нужные файлы с логами.
Далее нужно будет выбрать преднастроенные конфиги для различных служб. Они есть для наиболее популярных сервисов. Тут все по аналогии с Fail2ban сделано. В моем случае конфиги для веб сервера nginx, сайтов на wordpress, системных логов linux и sshd:
- crowdsecurity/nginx
- crowdsecurity/sshd
- crowdsecurity/wordpress
- crowdsecurity/linux
Далее установщик сообщит, что создал конфиг с белым списком адресов, включающим все серые подсети.
Дальше вам будет сказано, что ни одного bouncer не установлено, так что ничего реально заблокировано не будет.
для выполнения каких-то действий, требуются отдельные компоненты системы в виде bouncers. Далее я расскажу, как их ставить и настраивать.
На этом установка CrowdSec закончена. В конце вы увидите список основных cli команд для взаимодействия с локальной службой.
Можете их позапускать и посмотреть, как все это работает. Сама установка CrowdSec выполнена. Переходим к настройке.
Настройка CrowdSec
В целом, все базовые настройки уже сделаны установщиком и CrowdSec готов к работе. Напомню для тех, кто будет тестировать работу в локалке. В файле /etc/crowdsec/parsers/s02-enrich/whitelists.yaml перечислены подсети с приватными адресами, для которых проверки и блокировки не работают. Уберите оттуда свою локальную подсеть для тестов.
Основные метрики
Давайте теперь разберемся, как CrowdSec работает. Для начала посмотрим его основные метрики. Будут показаны цифры для тех сущностей, которые были активны. Например, если у вас есть логи, но они пустые и по ним не было ничего, в метриках вы их не увидите вообще. То же самое по фильтрам и сценариям.
# cscli metrics
Мы здесь видим:
- BUCKET - набор активных сценариев, по которым анализировалось содержимое логов. Живут эти сценарии тут - /etc/crowdsec/scenarios.
- SOURCE - список логов. Настраивается в конфиге /etc/crowdsec/acquis.yaml.
- PARSERS - список шаблонов парсинга. Настраиваются тут - /etc/crowdsec/parsers.
- ROUTE - урлы запросов к локальному API.
- BOUNCER - не понимаю, как переводится это слово в данном контексте, но это набор инструментов для выполнения каких-то действий. Пока у нас там пусто.
Анализ логов и поиск нарушителей
Давайте теперь с какого-нибудь соседнего сервера попробуем что-то сделать с целевым, где установлен crowdsec. Для этого удобно взять утилиту wapiti и просканить сайт. В Centos 8 ее можно поставить через pip, который по умолчанию уже есть в системе:
а в centos 7 сначала поставим puthon 3
yum install -y python34-setuptools
easy_install-3.4 pip
yum install python3-pip
yum install python3-devel
# pip3 install wapiti3
# wapiti -u http://192.168.1.170/
Я поставил на тестовый сервер phpmyadmin и тестировал с этой панелью работу. Итак, скан web сервера запустили, теперь идем смотреть, как отработает crowdsec. Смотрим сначала метрики, убеждаемся, что парсинг лог файлов веб сервера работает. Потом смотрим список принятых решений на основе парсинга логов и работы политик.
# cscli decisions list
IP, с которого я запустил сканирование, предлагают забанить. Сработал фильтр crowdsecurity/http-probing. Посмотрим, что он делает. Идем в /etc/crowdsec/scenarios/http-probing.yaml и смотрим содержимое.
Если я правильно понял, то фильтр срабатывает для того, кто сделал 10 и более запросов и получил в ответ 4XX ошибки
Более детальную информацию о событии можно посмотреть с помощью команды:
# cscli alerts inspect -d 5
5 это ID события в списке decisions. После того, как сработал один из фильтров, и ip отправился в бан, было создано ровно одно действие для этого. Посмотреть, под какие еще фильтры попал этот ip можно с помощью alerts.
# 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.
Bouncer установлен. Проверим, все ли с ним в порядке.
# cscli metrics
После установки он автоматически забанит все адреса, что были ранее помечены для этого. Проверяем:
# nft list tables
# nft list table ip crowdsec
Видим тут целую кучу 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 свое:
Посмотреть этот список можно следующим образом:
# ipset -L crowdsec-blacklists
Там же сразу же будет указано время жизни записи для каждого ip. В целом, все работает просто и надежно. Я проверил и с iptables, и с nftibles. С Firewalld тоже никаких проблем нет. Он не мешает.
Ручное управление блокировками
По умолчанию в качестве Decision применяется ban на 4 часа. Изменить эти параметры можно в файле /etc/crowdsec/profiles.yaml. В настоящий момент, как я понял, доступны 2 действия:
Ban
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. Сам установщик мне их ни разу не показал, так как постоянно вываливался то с ошибкой, а на другом хосте бесконечно висел в режиме установки. Хотя по факту контейнер запустил и он нормально работал.
В этой web панели вы можете просматривать все то же самое, что доступно через локальное cli. В целом, удобно, но не уверен, что в этом есть большая практическая польза. Не вижу большого смысла все это просматривать вручную. Хотя с дугой стороны там можно гибко фильтры настраивать. Возможно в каких-то случаях это будет актуально.
Мониторинг CrowdSec
По умолчанию, CrowdSec отдает все свои метрики в формате Prometheus по адресу http://127.0.0.1:6060/metrics. Проверяем:
1 |
# curl http://127.0.0.1:6060/metrics |
Там будет вся информация по состоянию локальной службы. Далее вы очень просто переносите все это дело в Grafana. Готовый Dashbord забираете по ссылке - https://github.com/crowdsecurity/grafana-dashboards.