帮助使用 REST API 保护您的 Linux 服务器免受攻击

CrowdSec 的新架构改进了组件之间的通信,从而更好地保护系统免受网络安全威胁。
59 位读者喜欢这篇文章。
Lock

JanBaby,通过 Pixabay CC0。

CrowdSec 是一个开源网络安全检测系统,旨在识别攻击性行为并阻止其访问系统。其用户友好的设计降低了技术门槛,并显着提高了安全性。

CrowdSec 是一个用 Go 编写的现代行为检测系统,它结合了 Fail2ban 的理念与 Grok 模式和 YAML 语法,用于分析日志,从而为保护云、容器和虚拟机 (VM) 基础设施提供了一种现代化的、解耦的方法。一旦检测到威胁,就可以使用 bouncer(阻止、403、验证码等)来缓解,并且阻止的互联网协议地址 (IP) 在所有用户之间共享,以进一步提高每个人的安全性。

12 月正式发布的 CrowdSec v.1.0.x 引入了几项改进,包括一项重大的架构变更:引入了本地 REST API。这个本地 API 允许所有组件更有效地通信,以支持更复杂的架构,同时保持单机用户的简单性。它还简化了 bouncer(补救组件)的创建,并使它们更能适应即将到来的变化,从而减少了维护时间。

CrowdSec 架构在新发布的 1.0 版本中进行了深度改造。

所有 CrowdSec 组件(读取日志的代理、供人使用的 cscli 以及阻止坏人的 bouncer)现在都可以通过 REST API 进行通信,而不是直接在数据库中读取或写入。在这个新版本中,只有本地 API 服务会与数据库(例如,SQLite、PostgreSQL 或 MySQL)进行交互。

本文介绍了如何在 Linux 服务器上安装和运行 CrowdSec

  • CrowdSec 设置
  • 测试检测能力
  • Bouncer 设置
  • 可观察性

设置环境

我用于此测试的机器是 Debian 10 Buster t2.medium EC2。

为了使其更具相关性,请安装 Nginx

$ sudo apt-get update
$ sudo apt-get install nginx

配置安全组,以便可以从外部世界访问安全外壳 (SSH) (tcp/22) 和 HTTP (tcp/80)。这将有助于稍后模拟攻击。

安装 CrowdSec

获取最新版本的 CrowdSec

$ curl -s https://api.github.com/repos/crowdsecurity/crowdsec/releases/latest | grep browser_download_url| cut -d '"' -f 4  | wget -i -

您也可以从 CrowdSec 的 GitHub 页面下载它。

安装它

$ tar xvzf crowdsec-release.tgz 
$ cd crowdsec-v1.0.0/
$ sudo ./wizard.sh -i

向导有助于指导安装和配置。我不得不说它非常有用!

首先,向导识别机器上存在的服务

它允许您选择要监视的服务。对于本教程,请使用默认选项并监视所有三个服务:Nginx、SSHD 和 Linux 系统。

对于每个服务,向导都会识别相关的日志文件并要求您确认(再次使用默认值)

一旦正确识别了服务和相关的日志文件(这至关重要,因为这是 CrowdSec 获取其信息的地方),向导会提示您建议的集合。

集合是一组配置,旨在创建一个连贯的整体来保护技术堆栈。例如,crowdsecurity/sshd 集合包含一个 用于 SSHD 日志的解析器和一个 用于检测 SSH 暴力破解和 SSH 用户枚举的场景

建议的集合基于您选择保护的服务。

向导的最后一步是部署 通用白名单,以防止禁止私有 IP 地址。它还提醒您,CrowdSec 将检测恶意 IP,但不会禁止任何 IP。您需要一个 bouncer 来阻止攻击。这是要记住的重要事项:CrowdSec 检测攻击;bouncer 阻止攻击

现在初始设置已完成,CrowdSec 应该已启动并正在运行。

使用 CrowdSec 检测攻击

通过安装 CrowdSec,您应该已经覆盖了常见的互联网背景噪音。检查一下!

使用 Wapiti 攻击 Web 服务器

使用 Web 应用程序漏洞扫描器 Wapiti 在您的 Nginx 服务上模拟 Web 应用程序漏洞扫描。您需要从外部 IP 执行此操作,并记住 私有 IP 默认情况下已列入白名单

ATTACKER$ wapiti   -u http://34.248.33.108/
[*] Saving scan state, please wait...

 Note
========
This scan has been saved in the file 
/home/admin/.wapiti/scans/34.248.33.108_folder_b753f4f6.db
...

在您新安装的机器上,您可以在日志中看到攻击

我的 IP 触发了不同的场景

请记住,您在本示例中攻击的网站是一个空的 Nginx 服务器。如果这是一个真实的网站,扫描器将执行许多其他操作,从而导致更多检测。

使用 cscli 检查结果

cscli 是与 CrowdSec 服务交互的主要工具之一,其功能之一是可视化活动决策过去的警报

cscli decisions list 命令随时显示活动决策,而 cscli alerts list 显示过去的警报(即使决策已过期或警报未导致决策)。

您还可以使用 cscli alerts inspect -d <ID>(使用警报列表左侧列中显示的 ID)检查特定警报以获取更多详细信息。

cscli 提供其他功能,但现在要查看的一个功能是找出默认设置中安装了哪些解析器和场景。

可观察性

可观察性(特别是对于可能采取防御性对策的软件)始终是安全解决方案的关键点。除了其“跟踪日志文件”功能外,CrowdSec 还提供两种实现此目的的方法:Metabase 仪表板和 Prometheus 指标。

Metabase 仪表板

cscli 允许您使用 Metabase 和 Docker 部署仪表板。首先,按照其官方文档 安装 Docker

如果您使用的是 AWS EC2 实例,请确保公开 tcp/3000 以访问您的仪表板。

cscli dashboard setup 使您能够部署在 Docker 上运行的新 Metabase 仪表板,并带有随机密码。

Prometheus 指标

虽然有些人喜欢可视化仪表板,但其他人更喜欢其他类型的指标。这就是 CrowdSec 的 Prometheus 集成发挥作用的地方。

可视化这些指标的一种方法是使用 cscli metrics

cscli metrics 命令仅公开 Prometheus 指标的子集,这些指标对于系统管理员很重要。您可以在文档中找到指标的详细 描述。 指标分为几个部分

  • Buckets: 自守护程序启动以来,每种类型的 bucket 创建、倾倒或溢出了多少个?
  • Acquisition: 从每个指定的源读取了多少行或事件?它们是否被解析和/或稍后倾倒入 bucket 中?
  • Parser: 传递给每个解析器的行/事件有多少?解析器是否成功处理了提到的事件?
  • Local API: 每个路由被命中了多少次,等等?

通过 cscli metrics 查看 CrowdSec 的 Prometheus 指标很方便,但并没有完全展现 Prometheus 的优势。深入研究 Prometheus 超出了本文的范围,但这些屏幕截图快速展示了 CrowdSec 的 Prometheus 指标在 Grafana 中的外观。

使用 bouncer 防御攻击

CrowdSec 的检测能力提供了对正在发生的事情的可观察性。但是,为了保护自己,您需要阻止攻击者,bouncer 在其中发挥着重要作用。记住:CrowdSec 检测,bouncer 阻止。

Bouncer 通过查询 CrowdSec 的 API 来了解何时阻止 IP。您可以直接从 CrowdSec Hub 下载 bouncer。

对于此示例,请使用 cs-firewall-bouncer。它直接在防火墙级别使用 iptables 或 nftables 禁止任何恶意 IP。

注意:如果您使用您的 IP 模拟攻击,请在继续操作之前取消禁止您的 IP: 

sudo cscli decisions delete -i X.X.X.X

安装 bouncer

首先,从 Hub 下载 bouncer

$ wget https://github.com/crowdsecurity/cs-firewall-bouncer/releases/download/v0.0.5/cs-firewall-bouncer.tgz
$ tar xvzf cs-firewall-bouncer.tgz
$ cd cs-firewall-bouncer-v0.0.5/

使用简单的安装脚本安装 bouncer

安装脚本将检查您是否已安装 iptables 或 nftables,如果未安装,则提示您安装。

Bouncer 通过 REST API 与 CrowdSec 通信,因此请检查 bouncer 是否已在 API 上注册。

最后一个命令 (sudo cscli bouncers list) 显示您新安装的 bouncer。

测试 bouncer

警告: 在继续操作之前,请确保您有另一个可用的 IP 来访问您的机器,并且您不会将自己踢出去。使用您智能手机的互联网连接即可。

现在您有了一个 bouncer 来保护您,请再次尝试测试。

尝试在扫描结束时访问服务器

ATTACKER$ curl --connect-timeout 1 http://34.248.33.108/
curl: (28) Connection timed out after 1001 milliseconds

从防御者的角度看看结果如何。

对于技术爱好者,cs-firewall-bouncer 使用 nftables 或 iptables。使用 nftables(Debian 10 默认使用)会创建并维护两个名为 crowdseccrowdsec6 的表(分别用于 IPv4 和 IPv6)

$ sudo nft list ruleset
…
table ip crowdsec {
	set crowdsec_blocklist {
		type ipv4_addr
		elements = { 3.22.63.25, 3.214.184.223,
			     3.235.62.151, 3.236.112.98,
			     13.66.209.11, 17.58.98.156, …
                        }
	}

	chain crowdsec_chain {
		type filter hook input priority 0; policy accept;
		ip saddr @crowdsec_blocklist drop
	}
}
table ip6 crowdsec6 {
	set crowdsec6_blocklist {
		type ipv6_addr
	}

	chain crowdsec6_chain {
		type filter hook input priority 0; policy accept;
		ip6 saddr @crowdsec6_blocklist drop
	}
}

您可以通过将模式从 nftables 更改为 iptables(iptables 模式需要 ipset)来更改 /etc/crowdsec/cs-firewall-bouncer/cs-firewall-bouncer.yaml 中 bouncer 使用的防火墙后端。

参与进来

请分享您对最新 CrowdSec 版本的反馈。如果您有兴趣测试该软件或想与团队联系,请查看以下链接


本文改编自 最先进的 CrowdSec IPS v.1.0.x 发布:操作指南,最初发布在 GBHackers on Security 上。

接下来阅读什么
User profile image.
Philippe Humeau 于 1999 年毕业于 EPITA(法国巴黎),获得 IT 安全工程师学位。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.