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

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:

  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, но раз­ви­ли его и адап­ти­ро­ва­ли под совре­мен­ные реалии.

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

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 и кача­ем послед­нюю версию.

[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. Про­ве­ря­ем:

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