Поиск по сайту:

Защитите свой 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.