PHP 是一种在网络上广泛使用的编程语言,据估计,几乎 80% 的网站都在使用它。我在 CrowdSec 的团队认为,我们需要为服务器管理员提供一个 PHP bouncer,以帮助抵御可能尝试与 PHP 文件交互的机器人和不良行为者。
CrowdSec bouncer 可以设置在应用堆栈的各个级别:Web 服务器、防火墙、CDN 等等。本文着眼于另一个层面:直接在应用程序级别设置补救措施。
直接在应用程序中进行补救可能在多种原因下有所帮助
- 它为潜在的安全威胁提供了业务逻辑上的回应。
- 它提供了关于如何应对安全问题的自由。
虽然 CrowdSec 已经发布了一个 WordPress bouncer,但这个 PHP 库旨在包含在任何 PHP 应用程序(例如 Drupal)中。该 bouncer 帮助阻止攻击者,使用 CAPTCHA 挑战他们,以便让人类通过,同时阻止机器人。
先决条件
本教程假设您在 Linux 服务器上运行 Drupal,并使用 Apache 作为 Web 服务器。
第一步是在您的服务器上安装 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,启动一个 Web 应用程序漏洞扫描器,例如 Nikto,看看它的行为
$ ./nikto.pl -h http://<ip_or_domain>

(Philippe Humeau, CC BY-SA 4.0)
IP 地址已被检测到并触发了各种场景,最后一个是 crowdsecurity/http-crawl-non_statics。

(Philippe Humeau, CC BY-SA 4.0)
但是,CrowdSec 仅检测问题,需要一个 bouncer 来应用补救措施。这就是 PHP bouncer 的作用。
使用 PHP bouncer 进行补救
现在您可以检测到恶意行为,您需要在网站级别阻止 IP。目前,没有可用的 Drupal bouncer。但是,您可以直接使用 PHP bouncer。
它是如何工作的?PHP bouncer(像任何其他 bouncer 一样)向 CrowdSec API 发出 API 调用,并检查是否应禁止传入的 IP、向它们发送 CAPTCHA 或允许它们通过。
Web 服务器是 Apache,因此您可以使用 Apache 的安装脚本。
$ git clone https://github.com/crowdsecurity/cs-php-bouncer.git
$ cd cs-php-bouncer/
$ ./install.sh --apache

(Philippe Humeau, CC BY-SA 4.0)
bouncer 配置为保护整个网站。通过调整 Apache 配置来保护网站的特定部分。
尝试访问网站
PHP bouncer 已安装和配置。由于之前的 Web 漏洞扫描操作,您已被禁止,但您可以尝试访问网站

(Philippe Humeau, CC BY-SA 4.0)
bouncer 成功阻止了您的流量。如果您在之前的 Web 漏洞扫描后没有被禁止,您可以添加一个手动决策,使用
$ cscli decisions add -i <your_ip>
对于其余的测试,请删除当前的决策
$ cscli decisions delete -i <your_ip>
更进一步
我阻止了尝试破坏 PHP 网站的 IP。这很好,但是尝试扫描、抓取或 DDoS 它的 IP 呢?这些类型的检测可能会导致误报,那么为什么不返回 CAPTCHA 挑战来检查它是否是实际用户(而不是机器人),而不是阻止 IP 呢?
检测爬虫和扫描器
我不喜欢爬虫和不良用户代理,并且 Hub 上有各种场景可以发现它们。
确保从 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、爬虫或恶意用户代理可能会导致误报,因此我更倾向于为任何触发这些场景的 IP 地址返回 CAPTCHA,以避免阻止真实用户。
为了实现这一点,请修改 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
使用此配置文件,对于任何触发 crowdsecurity/http-crawl-non_statics
或 crowdsecurity/http-bad-user-agent
场景的 IP 地址,将强制执行 CAPTCHA(持续四个小时)。
接下来,重新加载 CrowdSec
$ sudo systemctl reload crowdsec
尝试自定义补救措施
重新启动 Web 漏洞扫描器会触发许多场景,因此您最终将再次被禁止。相反,您可以构建一个触发 bad-user-agent
场景的攻击(已知不良用户代理的列表在此处:here)。请注意,您必须激活该规则两次才能被禁止。
$ 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

(Philippe Humeau, CC BY-SA 4.0)
如果您尝试访问网站,您将收到 CAPTCHA,而不是被简单地阻止

(Philippe Humeau, CC BY-SA 4.0)
一旦您解决它,您可以重新访问网站。
接下来,再次解除对自己的禁止
$ cscli decisions delete -i <your_ip>
启动漏洞扫描器
$ ./nikto.pl -h http://example.com
与上次不同,您现在可以看到您已触发多个决策

(Philippe Humeau, CC BY-SA 4.0)
当尝试访问网站时,禁止决策具有优先权

(Philippe Humeau, CC BY-SA 4.0)
总结
这是一种帮助阻止攻击者攻击 PHP 网站和应用程序的快速方法。本文仅包含一个示例。补救措施可以很容易地扩展以适应其他需求。要了解有关安装和使用 CrowdSec 代理的更多信息,请查看本操作指南以开始使用。
要下载 PHP bouncer,请访问 CrowdSec Hub 或 GitHub。
评论已关闭。