Как защитить сайты на PHP при помощи CrowdSec

Kate

Administrator
Команда форума
По данным статистики W3Techs, PHP применяется в 79% сайтов (о которых есть данные об используемых языках программирования). Для их защиты явно нужен собственный баунсер, и он уже добавлен в наш хаб! В этом посте поговорим о том, как этот баунсер может помочь защитить сайты от атак.

Баунсеры CrowdSec можно настроить на разных уровнях вашего стека: существуют баунсеры для веб-сервера, брандмауэра и CDN. Теперь к ним присоединится и решение, которое можно использовать прямо на уровне приложения.

Что это нам даёт?

— Возможность найти ответ на потенциальные угрозы кибербезопасности в рамках существующей бизнес-логики.

— Больше свободы в выборе средств и сценариев защиты, когда дело доходит до реальной атаки.

Мы уже выпустили баунсер для WordPress (он доступен в виде плагина, который можно напрямую установить из бэк-офиса), но библиотеки PHP по сути могут использоваться в любых приложениях на базе PHP. Поэтому для примера давайте рассмотрим Drupal.

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

Первые шаги​

Итак, предположим, что мы запустили Drupal на машине на базе Debian и с Apache в качестве веб-сервера. Для других приложений на PHP порядок действий будет таким же.

В первую очередь давайте установим на сервер CrowdSec:

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt install crowdsec
Дополнительную информацию об установке см. в официальной документации. CrowdSec самостоятельно обнаруживает все запущенные службы, поэтому вам не придется заниматься дополнительной настройкой после установки. Всё сразу же готово к работе!

Тестируем базовую конфигурацию​

Теперь, когда CrowdSec установлен, давайте запустим сканер уязвимостей веб-приложений, например, Nikto, и посмотрим, что получится:

./nikto.pl -h http://<ip_or_domain>Наш IP-адрес был обнаружен и это привело к запуску различных сценариев. Последним из них стал
crowdsecurity/http-crawl-non_statics:

005b26cb7c00121e56d3d928b3cfcabc.png

Наш IP-адрес был обнаружен и это привело к запуску различных сценариев. Последним из них стал

crowdsecurity/http-crawl-non_statics:
9225fb6e6a8fac06b393d08300b7157c.png

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

Защищаемся при помощи баунсера для PHP​

Итак, мы смогли обнаружить попытку вредоносного вмешательства, и теперь нам нужно заблокировать этот IP-адрес на уровне веб-сайта. На момент написания этих строк отдельный баунсер для Drupal ещё не выпущен, поэтому мы будем использовать универсальный баунсер для PHP.

Как работает этот баунсер? Баунсер PHP (как и любой другой) обращается к API CrowdSec, чтобы выяснить, следует ли ему заблокировать обнаруженные IP-адреса, выдать окно с капчей или разрешить передачу данных. Поскольку мы используем Apache в качестве веб-сервера, для его установки мы можем просто запустить скрипт.

git clone https://github.com/crowdsecurity/cs-php-bouncer.git
cd cs-php-bouncer/
./install.sh –apache
a2b38c88be74ae7c374f507c122ef79b.png

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

/etc/apache2/conf-enabled/crowdsec_apache.conf

Сработало!​

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

[IMG alt="Сообщение о блокировке IP-адреса из-за попыток сканирования. Источник: CrowdSec
"]https://habrastorage.org/r/w1560/ge...5f270d6ce1fa48edf82522ff66.png[/IMG]Сообщение о блокировке IP-адреса из-за попыток сканирования. Источник: CrowdSec
Баунсер успешно защитил сайт от наших действий! Если после запуска сканирования вас не заблокировали, вы можете добавить решение о блокировке в систему в ручном режиме при помощи команды

cscli decisions add -i <your_ip>
Чтобы продолжить тестирование функций, давайте отменим эти решения:

cscli decisions delete -i <your_ip>

Что еще мы можем сделать​

Итак, мы заблокировали один IP-адрес за подозрительную активность. Это отлично, но как насчёт IP-адресов, которые пытаются сканировать, кроулить или проводить DDoS-атаки? Все мы знаем, что в этом случае возможны ложные срабатывания системы. Так почему бы не отделить реальных пользователей от ботов, используя вместо блокировки капчу?

Обнаруживаем кроулеры и сканнеры​

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

cscli collections list | grep base-http-scenarios:
f8a84e092e62351909ba3feeafa921a0.png

Если они отсутствуют, вы можете их скачать, установить и перезапустить CrowdSec при помощи команд:

sudo cscli collections install crowdsecurity/base-http-scenarios
sudo systemctl reload crowdsec

Защищаемся при помощи капчи​

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

Добавим этот блок YAML в начало профиля:

/etc/crowdsec/profiles.yaml

name: crawler_captcha_remediation
filters:
- Alert.Remediation == true && Alert.GetScenario() in ["crowdsecurity/http-crawl-non_statics", "crowdsecurity/http-bad-user-agent"]
decisions:
- type: captcha
duration: 4h
on_success: break
---
Теперь, если какой-то IP-адрес вызовет срабатывание сценария

crowdsecurity/http-crawl-non_statics
или

crowdsecurity/http-bad-user-agent
для него на четыре часа будет активирован вход только через капчу.

Не забываем перезагрузить CrowdSec:

sudo systemctl reload crowdsec

Пробуем различные методы защиты​

Если просто перезапустить сканнер, он вызовет срабатывание сразу нескольких сценариев, и в итоге наш IP-адрес снова забанят. Давайте вместо этого сымитируем атаку, которая запустит сценарий bad-user-agent (список известных вредоносных пользовательских агентов выложен здесь). Напоминаем: IP-адрес блокируется после двух срабатываний сценария

96b6e198e030ef1613fc5711062c73e7.png

Естественно, наши действия не прошли незамеченными:

[IMG alt="
"]https://habrastorage.org/r/w1560/ge...30/b956751301157f93ea7c3bd11173da23.png[/IMG]
Теперь, если мы попытаемся зайти на сайт, вместо сообщения о блокировке мы увидим капчу:

7eaae64c77f445bac8c0cf7d5c00cc96.png

После правильного ввода капчи мы получим доступ к сайту.

Для продолжения тестирования давайте себя снова разбаним:

cscli decisions delete -i <your_ip>
Теперь мы можем запустить сканер уязвимостей:

be1a0a6a3fa381a0e9304898962c5eb9.png

Как видим, в этот раз мы вызвали срабатывание сразу нескольких сценариев, и среди ответных действий есть и блокировка, и капча:

32cd36adbe0c304ee00b2a33ef41616f.png

При попытке доступа к сайту решение о блокировке IP-адреса получает более высокий приоритет и нас снова банят:

34a66c942b5330c27d5cbfcb05127c64.png

Теперь вы знаете, как защитить свои сайты и приложения на базе PHP при помощи нашего баунсера! Если вас заинтересовала платформа CrowdSec и вы хотите попробовать её в действии, ознакомьтесь с нашим мануалом.

 
Сверху