Защитите свой PHP-сайт от ботов с помощью этого инструмента с открытым исходным кодом.
Отбойник CrowdSec предназначен для включения в любое приложение PHP и помогает блокировать злоумышленников.
PHP — это широко используемый язык программирования в Интернете, и, по оценкам, его используют почти 80% всех веб-сайтов. Моя команда в CrowdSec решила, что нам необходимо предоставить администраторам серверов средство защиты PHP, которое поможет отогнать ботов и злоумышленников, которые могут попытаться взаимодействовать с файлами PHP.
Вышибалы CrowdSec можно настроить на различных уровнях прикладного стека: веб-сервере, межсетевом экране, CDN и т. д. В этой статье рассматривается еще один уровень: настройка исправления непосредственно на уровне приложения.
Исправление непосредственно в приложении может быть полезно по разным причинам:
- Он обеспечивает бизнес-логику ответа на потенциальные угрозы безопасности.
- Это дает свободу в том, как реагировать на вопросы безопасности.
Хотя CrowdSec уже публикует баунсер WordPress, эта PHP-библиотека предназначена для включения в любое PHP-приложение (например, Drupal). Вышибала помогает блокировать злоумышленников, заставляя их использовать CAPTCHA, чтобы пропустить людей и одновременно блокировать ботов.
Предварительные условия
В этом руководстве предполагается, что вы используете Drupal на сервере Linux с Apache в качестве веб-сервера.
Первый шаг — установить CrowdSec на ваш сервер. Вы можете сделать это с помощью официального сценария установки. Если вы используете Fedora, CentOS или аналогичную версию, загрузите версию RPM:
$ curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.rpm.sh
В Debian и системах на базе Debian загрузите версию DEB:
$ curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh
Эти сценарии просты, поэтому прочитайте загружаемый сценарий, чтобы убедиться, что он импортирует ключ GPG и настраивает новый репозиторий. Как только вы освоитесь с тем, что он делает, запустите его, а затем установите.
$ sudo dnf install crowdsec || sudo apt install crowdsec
CrowdSec самостоятельно обнаруживает все существующие сервисы, поэтому для немедленной функциональной настройки не требуется дополнительной настройки.
Проверьте первоначальную настройку
Теперь, когда у вас установлен CrowdSec, запустите сканер уязвимостей веб-приложений, например Nikto, и посмотрите, как он себя ведет:
$ ./nikto.pl -h http://<ip_or_domain>
(Филипп Юмо, CC BY-SA 4.0)
IP-адрес был обнаружен и запускает различные сценарии, последний из которых — crowdsecurity/http-crawl-non_statics.
(Филипп Юмо, CC BY-SA 4.0)
Однако CrowdSec только обнаруживает проблемы, и для устранения проблем необходим вышибал. А вот и PHP-вышибала.
Исправление с помощью PHP-баунсера
Теперь, когда вы можете обнаружить вредоносное поведение, вам необходимо заблокировать IP-адрес на уровне веб-сайта. В настоящее время баунсер Drupal недоступен. Однако вы можете использовать PHP-баунсер напрямую.
Как это работает? PHP-вышибала (как и любой другой вышибал) выполняет API-вызов API CrowdSec и проверяет, следует ли блокировать входящие IP-адреса, отправлять им CAPTCHA или разрешать их прохождение.
Веб-сервер — Apache, поэтому вы можете использовать сценарий установки Apache.
$ git clone https://github.com/crowdsecurity/cs-php-bouncer.git
$ cd cs-php-bouncer/
$ ./install.sh --apache
(Филипп Юмо, CC BY-SA 4.0)
Баунсер настроен на защиту всего сайта. Защитите определенную часть сайта, адаптировав конфигурацию Apache.
Попробуйте зайти на сайт
PHP-баунсер установлен и настроен. Вы забанены из-за предыдущих действий по сканированию веб-уязвимостей, но вы можете попытаться получить доступ к веб-сайту:
(Филипп Юмо, CC BY-SA 4.0)
Вышибала успешно заблокировала ваш трафик. Если вы не были забанены после предыдущего сканирования веб-уязвимостей, вы можете добавить ручное решение с помощью:
$ cscli decisions add -i <your_ip>
Для остальных тестов удалим текущие решения:
$ cscli decisions delete -i <your_ip>
Идти дальше
Я заблокировал IP-адрес, пытаясь зайти на сайт PHP. Это хорошо, но как насчет IP-адресов, пытающихся сканировать, сканировать или проводить DDoS-атаки? Подобные обнаружения могут привести к ложным срабатываниям, так почему бы не вернуть запрос CAPTCHA, чтобы проверить, является ли это реальным пользователем (а не ботом), вместо того, чтобы блокировать IP-адрес?
Обнаружение сканеров и сканеров
Мне не нравятся сканеры и плохие пользовательские агенты, и в Hub доступны различные сценарии их обнаружения.
Убедитесь, что коллекции base-http-scenarios
из хаба загружены с помощью cscli
:
$ cscli collections list | grep base-http-scenarios
crowdsecurity/base-http-scenarios ✔️ enabled /etc/crowdsec/collections/base-http-scenarios.yaml
Если это не так, установите его и перезагрузите CrowdSec:
$ sudo cscli collections install crowdsecurity/base-http-scenarios
$ sudo systemctl reload crowdsec
Решение проблемы с помощью CAPTCHA
Поскольку обнаружение DDoS, сканеров или злонамеренных пользовательских агентов может привести к ложным срабатываниям, я предпочитаю возвращать CAPTCHA для любого IP-адреса, запускающего эти сценарии, чтобы избежать блокировки реальных пользователей.
Для этого измените файл profiles.yaml
.
Добавьте этот блок YAML в начало своего профиля в /etc/crowdsec/profiles.yaml
:
---
# /etc/crowdsec/profiles.yaml
name: crawler_captcha_remediation
filter: Alert.Remediation == true && Alert.GetScenario() in ["crowdsecurity/http-crawl-non_statics", "crowdsecurity/http-bad-user-agent"]
decisions:
- type: captcha
duration: 4h
on_success: break
С помощью этого профиля CAPTCHA применяется (на четыре часа) к любому IP-адресу, который запускает сценарии crowdsecurity/http-crawl-non_statics
или crowdsecurity/http-bad-user-agent
.
Затем перезагрузите CrowdSec:
$ sudo systemctl reload crowdsec
Попробуйте специальные исправления
Перезапуск веб-сканера уязвимостей может вызвать множество сценариев, поэтому в конечном итоге вас снова забанят. Вместо этого вы можете просто создать атаку, которая запускает сценарий плохой пользовательский агент
(список известных плохих пользовательских агентов находится здесь). Обратите внимание: чтобы получить бан, вам необходимо активировать правило дважды.
$ curl --silent -I -H "User-Agent: Cocolyzebot" http://example.com > /dev/null
$ curl -I -H "User-Agent: Cocolyzebot" http://example.com
HTTP/1.1 200 OK
Date: Tue, 05 Oct 2021 09:35:43 GMT
Server: Apache/2.4.41 (Ubuntu)
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: no-cache, must-revalidate
X-Content-Type-options: nosniff
Content-Language: en
X-Frame-Options: SAMEORIGIN
X-Generator: Drupal 7 (http://drupal.org)
Content-Type: text/html; charset=utf-8
Вы, конечно, можете увидеть, что вас поймают за ваши действия.
$ sudo cscli decisions list
(Филипп Юмо, CC BY-SA 4.0)
Если вы попытаетесь зайти на сайт, вместо того, чтобы быть просто заблокированным, вы получите CAPTCHA:
(Филипп Юмо, CC BY-SA 4.0)
Как только вы решите проблему, вы сможете снова получить доступ к веб-сайту.
Далее снова разбаню себя:
$ cscli decisions delete -i <your_ip>
Запустите сканер уязвимостей:
$ ./nikto.pl -h http://example.com
В отличие от прошлого раза, теперь вы можете видеть, что вы активировали несколько решений:
(Филипп Юмо, CC BY-SA 4.0)
При попытке доступа к сайту решение о запрете имеет приоритет:
(Филипп Юмо, CC BY-SA 4.0)
Заворачивать
Это быстрый способ заблокировать злоумышленникам доступ к веб-сайтам и приложениям PHP. В этой статье приведен только один пример. Исправления могут быть легко расширены для удовлетворения дополнительных потребностей. Чтобы узнать больше об установке и использовании агента CrowdSec, ознакомьтесь с этим руководством по началу работы.
Чтобы загрузить PHP-баунсер, перейдите на CrowdSec Hub или GitHub.