type
status
date
slug
summary
tags
category
icon
password
 
😀
CrowdSec是一个免费的,开源的和协作的IPS。与Fail2Ban类似,CrowdSec读取日志并检测攻击,随后阻止/缓解这些攻击。除此之外CrowdSec还会与社区共享攻击者的信息,这意味着其他CrowdSec用户在类似环境中默认情况下将阻止攻击你的IP(反之亦然)。

📝 介绍

数据流

CrowdSec通过分析应用程序日志,将用户行为与场景进行匹配,如果发现攻击行为,则将该用户添加到阻止列表,阻止该用户的进一步访问。
notion image

CrowdSec的特点

CrowdSec与传统的IPS相比,最大的特点就是可以订阅社区封锁名单(默认也会共享本地的攻击记录到社区),在攻击者行动前阻止攻击行为。CrowdSec除了与Traefik配合使用,也可以直接用来保护Linux/Windows服务器、路由器等设备。

总体架构

notion image

安全引擎(Security Engine)

安全引擎是CrowdSec的核心组件之一。它负责分析日志,并提供一个API端点,供修复组件获取引擎所做出的决策。
安全引擎运行时围绕几个简单的概念展开:
  1. 它通过数据源配置读取日志。
  1. 这些日志通过解析器进行解析,并最终进行丰富处理。
  1. 标准化后的日志与用户部署的场景进行匹配。
  1. 当一个场景被触发时,CrowdSec会生成一个警报,并可能生成一个或多个关联的决策:
      • 警报主要用于可追溯性,即使决策过期后仍然存在。
      • 决策则具有短暂的生命周期,告知针对违规的IP/范围/用户应采取的行动。
  1. 这些信息(信号、关联的决策)随后被发送到本地API并存储在数据库中。
  1. 正如你现在可能已经猜到的那样,安全引擎本身负责检测部分并存储这些决策。然后,修复组件可以通过相同的本地API“消费”这些决策,并应用修复措施。
💡
什么是解析器(Parsers)
解析器将日志格式分解为可读的信息,供CrowdSec应用程序使用。我们将使用Traefik解析器来获取Traefik访问日志,并将该信息传递给CrowdSec应用程序进行决策。
💡
什么是场景(Scenarios)
一个场景是一种行为,即正在发生的暴力攻击。您可以选择要针对哪些场景检查流量。在这个Traefik集合中,我们将使用典型的HTTP行为。

修复组件(Remediation Components)

修复组件是负责根据安全引擎提供的决策采取行动的软件包,一般被称为保镖(Bouncers)。
💡
什么是保镖(Bouncers)
保镖会对CrowdSec做出的决策做出反应。在这种情况下,Traefik保镖将根据CrowdSec做出的决策,决定是允许还是拒绝通过Traefik的流量。CrowdSec本身只会做出封禁IP的决策。它会通过连接到安全引擎获取所需的信息,以便在本地做出决策。请查看Hub上可用的bouncers。
  • blocklist mirror将通过HTTP服务器将阻止列表提供给pfsense、fortinet、untangle等设备。

🆗简单来说

安全引擎中有一个日志解析器实时监控服务日志,并根据预设的场景匹配如登录失败,未授权访问等条目,并对相应的IP做出决策。所以他需要部署在能够读取服务日志的地方。
修复组件安全引擎决策的IP下发到防火墙或其它带有访问控制的程序,它可以在多处部署,同时对决策IP进行处理。
攻击者触发一处⚠️警报,所有保镖都会将ta🚫拉黑。更严重的可能导致全网CrowdSec用户将ta封禁。

💿 安装

Crowdsec安装

在主 appdata 文件夹中创建一个子文件夹,用于告诉服务和 Crowdsec 在其中写入日志文件。这些日志文件将被 Crowdsec 集中和分析。在本文中,这个子文件夹命名为“share/Crowdsec”(appdata/share/Crowdsec)。
 
notion image

Bouncers

可以只安装对你有用的bouncer,它们分别在不同的地方起作用。
更多bouncer可在HUB - Remediation components中找到。
traefik-bouncer: 对决策IP返回403
OpenWRT-bouncer: 决策IP加入防火墙阻止列表,丢弃数据包
cloudflare-bouncer: 决策IP同步到cloudflare WAF进行托管质询(人机验证)

Traefik-bouncer安装

😀
traefik-bouncer的目标是为Traefik实现一个CrowdSec防火墙,以阻止恶意IP访问您的服务。为此,它利用Traefik v2 ForwardAuth中间件,并使用CrowdSec查询客户端IP。如果客户端IP在禁止列表中,它将收到HTTP代码403的响应。否则,请求将像往常一样继续进行。
在Crowdsec容器运行以下命令获取API KEY:
cscli bouncers add traefik-bouncer
安装traefik-bouncer容器,CROWDSEC_BOUNCER_API_KEY填写上一步获得的API key。
notion image
使用cscli bouncer list查看状态bouncer状态

openwrt-bouncer(可选)

在Crowdsec容器运行以下命令获取API key:
cscli bouncers add openwrt-bouncer
更新软件包列表并找到luci-app-crowdsec-firewall-bouncer安装
notion image
或使用下面的命令安装
opkg install crowdsec-firewall-bouncer
安装完成之后进行配置
notion image
或直接修改配置文件,位于/etc/config/crowdsec,然后重新加载bouncer /etc/init.d/crowdsec-firewall-bouncer reload
查看防火墙状态
notion image
可以看到规则已生效
notion image

cloudflare-bouncer(可选)

创建API token并设置权限
notion image
crowdsec容器运行下面的命令得到crowdsec_lapi_key
cscli bouncers add cloudflarebouncer
创建CF bouncer配置
修改其中的crowdsec_lapi_key , crowdsec_lapi_url
由于cloudflare免费计划最多只能使用一个IP列表,限制10000个IP,所以我们只同步本地决策列表。
安装并启动crowdsec-cloudflare-bouncer
notion image
 

⚙️ 配置

Traefik启用日志

在 traefik 模板中创建路径映射,以便将日志文件写入之前创建的共享文件夹中。
notion image
编辑traefik静态配置文件:/mnt/user/appdata/traefik/traefik.yml

添加受信任的IP

如果您的日志中没有显示命中Traefik代理的用户的外部IP,而只显示docker网关的IP(例如:在这种情况下为172.18.x.x),那么请编辑traefik.yml文件,并在受信任的IP下添加您的docker网关IP。

Authelia启用日志

和上面一样,编辑Authelia docker模板,将Authelia日志输出文件夹映射到共享文件夹:
notion image
然后编辑Authelia的配置文件(appdata/authelia)中的 configuration.yml 文件,以启用日志记录(找到log部分,添加配置)。

启用集合

💡
什么是集合(Collections)
集合由一组解析器场景组成。通常每个应用服务有一个相应的集合,用来对不同结构的日志内容进行解析,如Nginx,sshdBitwarden等等。在Hub查看更多Collections。
编辑docker crowdsec模板以启用 Authelia 集合,方法是将crowdsecurity/traefik LePresidente/authelia 添加到 COLLECTIONS 变量:
notion image
同样,也可以使用命令:
cscli collections install crowdsecurity/traefik
cscli collections install LePresidente/authelia
最后,在crowdsec的appdata文件夹(appdata/crowdsec)中编辑acquis.yml文件以添加以下行:(不要留下任何空格)

添加CrowdSec中间件

再次编辑traefik静态配置文件(traefik.yml),然后编辑动态配置文件(fileConfig.yml)在对应的节点位置添加
traefik.yml
fileConfig.yml
重启CrowdSec和Traefik。

☁️ 注册CrowdSec

注册账号

添加安全引擎

notion image

订阅黑名单

notion image

成功阻止坏蛋✨

notion image

💻 常用命令

💡
这些命令可以使用docker exec crowdsec cscli [命令]通过主机运行,也可以使用docker exec -it crowdsec /bin/bash命令和普通cscli [命令]从容器内运行。

Metrics

这个命令将显示指标(解析的日志、存储桶、各种统计信息)。如果您想在容器内运行这个命令,可以运行:
docker exec -it crowdsec /bin/bash
cscli metrics
或者直接从主机运行:
docker exec crowdsec cscli metrics

Hub列表

这个命令将让您看到部署了哪些解析器和场景。
cscli hub list

决策列表

这个命令可以查看哪些IP被禁止访问,非常有用,可以检查是否在访问服务器时突然出现了“Forbidden”页面如果您想在容器内运行这个命令,可以运行:
cscli decisions list

告警列表

告警列表将允许您查看和检查 CrowdSec 通知,即检测到对服务器的攻击。
cscli alerts list

阻止IP

添加一个 IP 到阻止列表,你可以添加你的 IP 来测试它是否阻止请求。
cscli decisions add --ip 1.2.3.4

允许IP

从阻止列表中删除一个 IP,在某些情况下,这将有助于解除自己的禁令。
cscli decisions delete -i 1.2.3.4

🤔问题(已解决):

⚠️
以下内容作为备忘,不再有效
crowdsecurity/traefik-logs日志解析器默认读取Traefik日志中ClientHost字段作为源IP,如果客户端通过cloudflared访问,CrowdSec可能无法获取到真实客户端IP,这时可以修改日志解析器来获取真实IP。
traefik访问日志保留Cf-Connecting-Ip,详细配置可以看这里
修改/crowdsec/hub/parsers/s01-parse/crowdsecurity/traefik-logs.yaml
traefik.ClientHost修改为traefik["request_Cf-Connecting-Ip"]traefik["request_X-Real-Ip"]
运行下面的命令检查是否解析成功,复制一行Traefik的日志替换**log**
应该能够看到remote_addr为客户端真实IP

📎 参考文章

 
💡
有关CrowdSec安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
 
Traefik 篇七:Cloudflare内网穿透Traefik 篇五:进阶的代理配置
Loading...