Philippe Humeau 发布的文章

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

 title=

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

CrowdSec 门卫可以在应用栈的各个层面上进行设置:Web 服务器、防火墙、CDN 等等。本文关注的是另外一个层次:直接在应用层面设置补救措施。

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

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

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

先决条件

本教程假定你在 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>

 title=

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

 title=

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

用 PHP 门卫进行补救

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

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

Web 服务器是 Apache,所以你可以使用 Apache 的安装脚本

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

 title=

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

尝试访问网站

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

 title=

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

$ cscli decisions add -i <your_ip>

对于其余的测试,删除当前的决策:

$ cscli decisions delete -i <your_ip>

更进一步

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

检测爬虫和扫描器

我不喜欢爬虫和坏的用户代理,在 Hub 上有各种方案可以用来发现它们。

确保用 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_staticscrowdsecurity/http-bad-user-agent 场景的 IP 地址都会被强制执行一个验证码(持续 4 小时)。

接下来,重新加载 CrowdSec:

$ sudo systemctl reload crowdsec

尝试自定义的补救措施

重新启动 Web 漏洞扫描器会触发很多场景,所以你最终会再次被禁止。相反,你可以直接制作一个触发 bad-user-agent 场景的攻击(已知的坏用户代理列表在 这里)。请注意,你必须激活该规则两次才能被禁止。

$ 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

 title=

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

 title=

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

接下来,再次解禁自己:

$ cscli decisions delete -i <your_ip>

启动漏洞扫描器:

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

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

 title=

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

 title=

总结

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

要下载 PHP 门卫,请到 CrowdSec HubGitHub


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

作者:Philippe Humeau 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

对 CrowdSec 的配置更改,在不到一分钟的时间内阻止了一个 7000 台机器的僵尸网络的攻击。

2020 年,我们的生活和工作方式在短短几天内被彻底颠覆。随着 COVID-19 开始在全球范围内蔓延,我们将工作带回家,与同事、朋友和家人保持在线联系成为关键的必需品。这为黑客造成破坏打开了大门。例如,根据 Neustar 的数据,今年上半年全球的分布式拒绝服务(DDOS) 攻击增长了 151%

CrowdSec 是一个开源的安全引擎,它可以分析访问者的行为,并提供适应各种攻击的响应。它能解析来自各种来源的日志,并应用启发式方案来识别攻击性行为,并防范大多数攻击类别。并且,它与其它安装的 CrowdSec 系统共享该情报。每次 IP 地址被阻止时,它都会通知整个用户社区。这就创建了一个实时、协作的 IP 信誉数据库,利用人群的力量使互联网更加安全。

CrowdSec 如何工作:案例研究

Sorf Networks 是一家总部位于土耳其的技术公司,为客户提供高配置的托管服务器和 DDoS 防护解决方案,它提供了一个 CrowdSec 工作的例子。Sorf 的一个客户每天都会遇到来自 1 万多台机器僵尸网络的 DDoS 攻击,并努力寻找一种能够满足技术要求的解决方案来及时处理这些攻击。

虽然客户采取了一般的预防措施来缓解这些攻击,比如引入 JavaScript(JS) 挑战 challenges 、限速等,但这些措施在整个攻击面并不可行。一些 URL 需要被非常基本的软件使用,而这些软件不支持 JS 挑战。黑客就是黑客,这正是他们每天的目标:链条上最薄弱的环节。

Sorf Networks 首先使用 Fail2ban(这启发了 CrowdSec)为其客户建立了一个 DDoS 缓解策略。它在一定程度上帮助了客户,但它太慢了。它需要 50 分钟来处理日志和处理 7000 到 10000 台机器的 DDoS 攻击。这使得它在这种情况下没有效果。另外,因为它没有禁止 IP,日志会持续堆积,它需要每秒处理几千条日志,这是不可能的。

在使用租用的僵尸网络进行的 DDoS 测试中,一次攻击可以高达每秒 6700 个左右的请求,这些请求来自 8600 个独立 IP。这是对一台服务器流量的捕捉:

 title=

虽然 CrowdSec 技术可以应对巨大的攻击,但其默认设置每秒只能处理约 1000 个端点。Sorf 需要一个量身定做的配置来处理单台机器上这么多的流量。

Sorf 的团队对 CrowdSec 的配置进行了修改,以显著提高其吞吐量来处理日志。首先,它去掉了高消耗且非关键的 富集 enrichment 解析器,例如 GeoIP 富集。它还将允许的 goroutine 的默认数量从一个增加到五个。之后,团队又用 8000 到 9000 台主机做了一次实测,平均每秒 6000 到 7000 个请求。这个方案是有代价的,因为 CrowdSec 在运行过程中吃掉了 600% 的 CPU,但其内存消耗却保持在 270MB 左右。

然而,结果却显示出明显的成功:

  • 在一分钟内,CrowdSec 能够处理所有的日志
  • 95% 的僵尸网络被禁止,攻击得到有效缓解
  • 15 个域现在受到保护,不受 DDoS 攻击

根据 Sorf Networks 的总监 Cagdas Aydogdu 的说法,CrowdSec 的平台使团队“能够在令人难以置信的短时间内提供一个世界级的高效防御系统”。


本文改编自如何用 CrowdSec 在 1 分钟内阻止 7000 台机器的僵尸网络,原载于 CrowdSec 网站。


via: https://opensource.com/article/20/12/open-source-vs-ddos-attacks

作者:Philippe Humeau 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出