开始使用开源的大型多人防火墙CrowdSec v.1.0.X
前言
CrowdSec v.1.0.x的正式发布版本对之前的版本做了几处改进,其中包括引入本地REST API这一重大架构变化。
该本地API使所有组件能够更有效地彼此通信,为更复杂的体系结构提供了支持,而同时针对单机用户保持了其简单易用的特性。此外,该版本简化了保镖组件(修复组件)的创建,使它们对今后的变化更具弹性,以限制维护时间。
在新的1.0版本中,CrowdSec架构经历了深度改造:
CrowdSec的所有组件(代理读取日志、人类cscli和阻止坏人的保镖组件)现在都可以通过REST API进行通信,而不是直接在数据库中读取或写入。在新版本下,只有本地API服务与数据库进行交互(例如SQLite、PostgreSQL和MySQL)。
CrowdSec是一个安全自动化引擎,通过服务器端代理保护暴露在互联网上的服务器、服务、容器或虚拟机。本应用是受到Fail2Ban的启发,其目标是成为入侵防御工具的现代化协作版本。
CrowdSec使用行为分析系统,根据你的日志来判断是否有人试图入侵。如果你的代理检测到这种攻击行为,违规的IP将被处理并进行甄别。如果这个信号通过了甄别,该IP将被重新分配给所有共享类似技术档案的用户,让他们对这个IP“免疫”。
目标是利用集体力量,建立某种形式的互联网邻里监督守望。对于对机器发动攻击的IP,你可以选择以任何你认为合适的方式来解决其威胁。总之,CrowdSec通过利用集体的力量创建极其准确的IP信誉系统,使所有用户受益。
CrowdSec免费、开源(在MIT的许可之下),其源代码可以在GitHub上获得。CrowdSec目前有Linux版本,今后还会移植到macOS和Windows。
本教程将介绍如何在Linux服务器上安装和运行CrowdSec:
- CrowdSec设置
- 测试检测能力
- 保镖组件设置
- 可观测性
设置环境
本次测试使用的机器是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 - |
也可以从我们的GitHub页面下载。
以下是安装过程:
$ tar xvzf crowdsec-release.tgz $ cd crowdsec-v1.0.0/ $ sudo ./wizard.sh -i |
可使用该向导完成安装和配置。
首先,向导识别机器上已存在的服务
它允许选择要监控的服务。本教程使用默认选项,监控Nginx、SSHD和Linux系统等所有三项服务。
对于每项服务,向导会识别相关的日志文件并要求用户确认(仍然使用默认值):
正确识别了服务和相关的日志文件后(CrowdSec通过该步骤获取信息,非常重要),向导会提示建议的集合。
集合是一组配置,其目标是创建一个连贯的整体来保护技术堆栈。例如,crowdsecurity/SSH这一集合包含一个SSHD日志解析器和一个用于检测SSH暴力破解和SSH用户枚举的场景。
向导给出的集合建议是基于你选择保护的服务。
向导的最后一步是部署用于防止禁止私有IP地址的通用白名单。它还提醒用户,CrowdSec仅检测恶意IP地址,但不会对其进行屏蔽。你需要下载一个保镖组件来阻止攻击。
请务必记住:CrowdSec负责检测攻击;保镖组件负责阻止攻击。
初始设置完成后,CrowdSec应可启动并运行。
使用CrowdSec阻止攻击
安装CrowdSec后,用户应该已经覆盖了常见的互联网攻击。让我们来看一看吧!
使用wapiti攻击web服务器
使用Wapiti这个网络应用漏洞扫描组件模拟对Nginx服务进行网络应用漏洞扫描。用户需要通过外部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触发了不同的场景:
- crowdsecurity/httppath-traversal-probing:检测URI 或GET参数中的路径遍历探测尝试模式
- crowdsecurity/http-sqli-probbing-detection:检测URI 或GET参数中明显的SQL注入尝试模式
要记住,你攻击的网站是一个空白Nginx服务器。如果它是一个真实的网站,扫描组件会执行许多其他动作,从而导致更多的检测。
使用cscli检查结果
Cscli是与CrowdSec服务交互的主要工具之一,其功能之一是活动决策可视化和过往警报。
Cscli decisions list命令随时显示活动决策,而cscli alert lists可显示过往警报(即使决策已过期或警报没有导致决策)。
你也可以通过cscli警报检查-d <ID>来检查特定警报,以获取更多详细信息(使用警报列表左侧栏中显示的ID)。
cscli还有其他功能,但是现在要看的是找出默认设置中安装了哪些解析器和场景。
可观测性
可观测性(尤其是对于可能采取了防御对策的软件)始终是安全解决方案的关键点。除了“跟踪日志文件”的功能之外,CrowdSec还提供了两种方式来实现可观测性:元数据库仪表板(Metabase dashboards)和普罗米修斯指标(Prometheus metrics)。
元数据库仪表板
用户可使用cscli部署新的元数据库和Docker。首先,使用Docker的官方文档安装Docker。
如果你使用的是AWS EC2实例,请确保公开tcp/3000来访问仪表板。
用户可使用cscli dashboard setup部署新的使用随机密码的元数据库仪表板,在Docker上运行。
普罗米修斯指标
有些人喜欢可视化仪表板,而有些人更喜欢不同类型的指标。这就是CrowdSec集成普罗米修斯发挥作用的地方。
使这些指标可视化的方法之一是使用cscli metrics:
cscli metrics命令只显示对系统管理员很重要的普罗米修斯指标度量的某个子集。你可以在文档中找到指标的详细描述。这些指标分为不同的部分:
- 组桶:自守护进程启动以来,创建、倾倒或溢出的每种类型的组桶有多少?
- 获取:从每个指定的源中读取了多少行或多少事件,以及它们是否被解析和/或之后被注入组桶
- 解析器:每个解析器传递了多少行/事件,解析器是否成功处理了提到的事件?
- 本地API:每条路线被击中多少次等等?
通过cscli metrics查看Crowdsec的普罗米修斯指标会更方便,但对普罗米修斯不公平。深入探讨普罗米修斯已经超出了本文的讨论范围,但是,通过下面的截图可以快速浏览CrowdSec的普罗米修斯指标在Grafana中的样子。
使用保镖组件防御攻击
CrowdSec的检测能力提供了可观测的当下情况。然而,用户如果要自我保护就需要阻止攻击者,这是保镖组件发挥重要作用的地方。请牢记:CrowdSec负责检测攻击;保镖组件负责阻止攻击。
保镖组件的工作原理是通过查询CrowdSec的应用编程接口来获知是否应该屏蔽某个IP。你可以直接在CrowdSec Hub下载保镖组件:
这个例子使用了cs-firewall-bouncer。它可以在防火墙层面使用iptables或nftables直接屏蔽任何恶意IP。
注意:如果你使用自己IP来模拟攻击,请先取消对该IP的屏蔽,然后再继续:
sudo cscli decisions delete -i X.X.X.X)
安装保镖组件
首先,下载保镖组件:
$ 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/ |
保镖组件可以用简单的安装脚本安装:
安装脚本首先检查是否安装了iptables或nftables,如果没有,将提示安装。
由于保镖组件通过REST API与CrowdSec通信,所以需要检查保镖组件是否在API上注册。
最后一个命令(sudo cscli bouncers list)显示我们新安装的保镖组件。
测试保镖组件
警告:在继续之前,请确保有另一个可用的IP来访问机器,并且不会把自己踢出去。可以使用智能手机的互联网连接。
有了保镖组件的保护后,可以再次进行测试。
请在扫描结束时访问服务器:
ATTACKER$ curl --connect-timeout 1 http://34.248.33.108/ curl: (28) Connection timed out after 1001 milliseconds |
让我们从防御者的角度看看结果。
如果你对技术好奇,cs-防火墙-保镖组件使用了nftables或iptables。使用nftables(在Debian 10上默认使用nftables)创建并维护两个名为crowdsec和crowdsec6的表(分别用于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 } } |
你如果要更改保镖组件使用的防火墙后端,可以在/etc/crowd sec/cs-firewall-bounger/cs-firewall-bounger.YAML中将模式从nftables更改为iptables(iptables模式需要使用ipset)。
欢迎参与
我们希望听到大家对最新版本的反馈。如果你对测试软件感兴趣或希望与团队取得联系,请查看以下链接:
- 下载CrowdSec v.1.0.x。
- 我们的网站
- GitHub存储库
- Gitter