用 CrowdSec 保护你的 PHP 网站不受机器人攻击
CrowdSec 门卫被设计成可以包含在任何 PHP 应用程序中，以帮助阻止攻击者。
PHP 机器人
CrowdSec 门卫被设计成可以包含在任何 PHP 应用程序中，以帮助阻止攻击者。

> 
> CrowdSec 门卫被设计成可以包含在任何 PHP 应用程序中，以帮助阻止攻击者。
> 
> 
> 


![](/data/attachment/album/202201/24/094243dtt2fkjjwtn5i2kz.jpg "Security monster")


PHP 是 Web 上广泛使用的一种编程语言，据估计有近 80% 的网站使用它。我在 [CrowdSec](https://opensource.com/article/20/10/crowdsec) 的团队决定，我们需要为服务器管理员提供一个 PHP 门卫，以帮助抵御那些可能试图与 PHP 文件互动的机器人和不良分子。


CrowdSec 门卫可以在应用栈的各个层面上进行设置：[Web 服务器、防火墙、CDN](https://hub.crowdsec.net/browse/#bouncers) 等等。本文关注的是另外一个层次：直接在应用层面设置补救措施。


由于各种原因，直接在应用程序中进行补救是有帮助的：


* 它为潜在的安全威胁提供了业务逻辑上的答案。
* 它提供了关于如何应对安全问题的自由。


虽然 CrowdSec 已经发布了一个 WordPress 门卫，但这个 PHP 库被设计成可以包含在任何 PHP 应用中（例如 Drupal）。该门卫有助于阻止攻击者，用验证码挑战他们，让人类通过，同时阻止机器人。


### 先决条件


本教程假定你在 Linux 服务器上运行 Drupal，并使用 [Apache 作为 Web 服务器](https://opensource.com/article/18/2/how-configure-apache-web-server)。


第一步是在你的服务器上 [安装 CrowdSec](https://doc.crowdsec.net/docs/getting_started/install_crowdsec)。你可以用 [官方安装脚本](https://packagecloud.io/crowdsec/crowdsec/install) 来完成。如果你使用的是 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](https://github.com/sullo/nikto)，看看它的表现如何：



```
$ ./nikto.pl -h http://<ip_or_domain>

```

![nikto scan](/data/attachment/album/202201/24/094255nafol1dxld1ympck.png "nikto scan")


该 IP 地址已被检测到触发了各种场景，最后一个是 `crowdsecurity/http-crawl-non_statics`：


![detected scan](/data/attachment/album/202201/24/094255xyuknyupyheyizpi.png "detected scan")


然而，CrowdSec 只检测问题，需要一个门卫来应用补救措施。这就是 PHP 门卫发挥作用的地方。


### 用 PHP 门卫进行补救


现在你可以检测到恶意行为了，你需要在网站层面上阻止 IP。在这个时候，没有用于 Drupal 的门卫可用。然而，你可以直接使用 PHP 门卫。


它是如何工作的？PHP 门卫（和其他门卫一样）对 CrowdSec 的 API 进行调用，并检查是否应该禁止进入的 IP，向他们发送验证码，或者允许他们通过。


Web 服务器是 Apache，所以你可以使用 [Apache 的安装脚本](https://github.com/crowdsecurity/cs-php-bouncer/blob/main/install.sh)：



```
$ git clone https://github.com/crowdsecurity/cs-php-bouncer.git
$ cd cs-php-bouncer/
$ ./install.sh --apache

```

![apache install script](/data/attachment/album/202201/24/094255kuaksumsiudyazan.png "apache install script")


门卫的配置是用来保护整个网站。可以通过调整 Apache 的配置保护网站的一个特定部分。


### 尝试访问网站


PHP 门卫已经安装并配置好。由于之前的网络漏洞扫描行动，你被禁止了，你可以尝试访问该网站看看：


![site access attempt](/data/attachment/album/202201/24/094256g9ckfxflf4r44txp.png "site access attempt")


门卫成功阻止了你的流量。如果你在以前的 Web 漏洞扫描后没有被禁止，你可以用增加一个手动决策：



```
$ cscli decisions add -i <your_ip>

```

对于其余的测试，删除当前的决策：



```
$ cscli decisions delete -i <your_ip>

```

### 更进一步


我封锁了试图破坏 PHP 网站的 IP。这很好，但那些试图扫描、爬取或 DDoS 的 IP 怎么办？这些类型的检测可能会导致误报，那么为什么不返回一个验证码挑战来检查它是否是一个真正的用户（而不是一个机器人），而不是封锁 IP？


#### 检测爬虫和扫描器


我不喜欢爬虫和坏的用户代理，在 [Hub](https://hub.crowdsec.net/) 上有各种方案可以用来发现它们。


确保用 `cscli’ 下载了 Hub 上的`base-http-scenarios` 集合：



```
$ 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

```

#### 用验证码补救


由于检测 DDoS、爬虫或恶意的用户代理可能会导致误报，我更倾向于对任何触发这些情况的 IP 地址返回一个验证码，以避免阻止真正的用户。


为了实现这一点，请修改 `profiles.yaml` 文件。


在 `/etc/crowdsec/profiles.yaml` 中的配置文件的开头添加这个 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 地址都会被强制执行一个验证码（持续 4 小时）。


接下来，重新加载 CrowdSec：



```
$ sudo systemctl reload crowdsec

```

#### 尝试自定义的补救措施


重新启动 Web 漏洞扫描器会触发很多场景，所以你最终会再次被禁止。相反，你可以直接制作一个触发 `bad-user-agent` 场景的攻击（已知的坏用户代理列表在 [这里](https://raw.githubusercontent.com/crowdsecurity/sec-lists/master/web/bad_user_agents.txt)）。请注意，你必须激活该规则两次才能被禁止。



```
$ 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

```

![detected scan](/data/attachment/album/202201/24/094256nzi5vwjfvwhoweeh.png "detected scan")


如果你试图访问该网站，不会被简单地被阻止，而是会收到一个验证码：


![CAPTCHA prompt](/data/attachment/album/202201/24/094256hsllv4yd24s44oyt.png "CAPTCHA prompt")


一旦你解决了这个验证码，你就可以重新访问网站了。


接下来，再次解禁自己：



```
$ cscli decisions delete -i <your_ip>

```

启动漏洞扫描器：



```
$ ./nikto.pl -h http://example.com

```

与上次不同的是，你现在可以看到，你已经触发了几个决策：


![scan detected](/data/attachment/album/202201/24/094257gu8q62l6y27xy206.png "scan detected")


当试图访问网站时，禁止决策具有优先权：


![site access attempt](/data/attachment/album/202201/24/094257jseuvc5ungnueag9.png "site access attempt")


### 总结


这是一个帮助阻止攻击者进入 PHP 网站和应用程序的快速方法。本文只包含一个例子。补救措施可以很容易地扩展，以适应额外的需求。要了解更多关于安装和使用 CrowdSec 代理的信息，[查看这个方法指南](https://crowdsec.net/tutorial-crowdsec-v1-1/) 来开始。


要下载 PHP 门卫，请到 [CrowdSec Hub](https://hub.crowdsec.net/author/crowdsecurity/bouncers/cs-php-bouncer) 或 [GitHub](https://github.com/crowdsecurity/cs-php-bouncer)。




---


via: <https://opensource.com/article/22/1/php-website-bouncer-crowdsec>


作者：[Philippe Humeau](https://opensource.com/users/philippe-humeau) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出

