По данным статистики 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:

Вы уже знаете, что 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

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

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

Сработало!

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

Сообщение о блокировке IP-адреса из-за попыток сканирования. Источник: CrowdSec
Сообщение о блокировке 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:

Если они отсутствуют, вы можете их скачать, установить и перезапустить 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-адрес блокируется после двух срабатываний сценария

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

Теперь, если мы попытаемся зайти на сайт, вместо сообщения о блокировке мы увидим капчу:

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

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

cscli decisions delete -i <your_ip>

Теперь мы можем запустить сканер уязвимостей:

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

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

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

Комментарии (3)


  1. Goodwinnew
    02.11.2021 20:15
    +2

    А почему вредный IP не в лог на сервере - и на него fail2ban напустить?

    IMHO - банить вредителей средствами CMS - это достаточно большая нагрузка на сервер. Этих вредителей обычно много - и большую часть времени CMS будет их банить, занимая дорогое процессорное время.

    Если сайт популярный - там будет вал попыток что-либо подобрать. А fail2ban на уровне сервера занимает ресурсов намного меньше, чем обработка бана средствами CMS.


    1. CrowdSec Автор
      25.11.2021 11:24

      В этом случае CrowdSec работает точно так же как Fail2ban, анализируя логи на сервере. Что касается нагрузки на сервер, ты прав. Но большее использование CPU - это жертва в обмен на отсутсвие риска блокировки обычных пользователей, что критически важно для eCommerce. CrowdSeс не допускает такой риск, предлагая заполнить капчу. 


  1. kasigor
    03.11.2021 10:39

    Использую тоже fail2ban. Отличная вещь. Только он и спасает. Очень простой в настройках.