По данным статистики 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-баунсер установлен и настроен и уже забанил нас из-за предыдущих попыток сканировать сайт на уязвимости. Если попытаться получить доступ к веб-сайту теперь, мы увидим такое вот сообщение:
Баунсер успешно защитил сайт от наших действий! Если после запуска сканирования вас не заблокировали, вы можете добавить решение о блокировке в систему в ручном режиме при помощи команды
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)
kasigor
03.11.2021 10:39Использую тоже fail2ban. Отличная вещь. Только он и спасает. Очень простой в настройках.
Goodwinnew
А почему вредный IP не в лог на сервере - и на него fail2ban напустить?
IMHO - банить вредителей средствами CMS - это достаточно большая нагрузка на сервер. Этих вредителей обычно много - и большую часть времени CMS будет их банить, занимая дорогое процессорное время.
Если сайт популярный - там будет вал попыток что-либо подобрать. А fail2ban на уровне сервера занимает ресурсов намного меньше, чем обработка бана средствами CMS.
CrowdSec Автор
В этом случае CrowdSec работает точно так же как Fail2ban, анализируя логи на сервере. Что касается нагрузки на сервер, ты прав. Но большее использование CPU - это жертва в обмен на отсутсвие риска блокировки обычных пользователей, что критически важно для eCommerce. CrowdSeс не допускает такой риск, предлагая заполнить капчу.