type
status
date
slug
summary
tags
category
icon
password
CrowdSec是一个免费的,开源的和协作的IPS。与Fail2Ban类似,CrowdSec读取日志并检测攻击,随后阻止/缓解这些攻击。除此之外CrowdSec还会与社区共享攻击者的信息,这意味着其他CrowdSec用户在类似环境中默认情况下将阻止攻击你的IP(反之亦然)。
📝 介绍
数据流
CrowdSec通过分析应用程序日志,将用户行为与场景进行匹配,如果发现攻击行为,则将该用户添加到阻止列表,阻止该用户的进一步访问。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fd830565e-330b-4d2f-b216-b572f545000b%2F578f9c0e-d09c-4544-ae90-d4c559049192%2F%25E6%2595%25B0%25E6%258D%25AE%25E6%25B5%2581.webp?table=block&id=7487473c-d87f-47a9-8ec9-0a1384649d7f&t=7487473c-d87f-47a9-8ec9-0a1384649d7f&width=744.6666870117188&cache=v2)
CrowdSec的特点
CrowdSec与传统的IPS相比,最大的特点就是可以订阅社区封锁名单(默认也会共享本地的攻击记录到社区),在攻击者行动前阻止攻击行为。CrowdSec除了与Traefik配合使用,也可以直接用来保护Linux/Windows服务器、路由器等设备。
总体架构
![notion image](https://img.biliko.net/2024/04/a4f97f7f258e807dedd2fc3cbc819b39.png?t=3a8791a7-da80-4388-986c-8f065603a55b)
安全引擎(Security Engine)
安全引擎是CrowdSec的核心组件之一。它负责分析日志,并提供一个API端点,供修复组件获取引擎所做出的决策。
安全引擎运行时围绕几个简单的概念展开:
- 它通过数据源配置读取日志。
- 这些日志通过解析器进行解析,并最终进行丰富处理。
- 标准化后的日志与用户部署的场景进行匹配。
- 当一个场景被触发时,CrowdSec会生成一个警报,并可能生成一个或多个关联的决策:
- 警报主要用于可追溯性,即使决策过期后仍然存在。
- 决策则具有短暂的生命周期,告知针对违规的IP/范围/用户应采取的行动。
- 这些信息(信号、关联的决策)随后被发送到本地API并存储在数据库中。
- 正如你现在可能已经猜到的那样,安全引擎本身负责检测部分并存储这些决策。然后,修复组件可以通过相同的本地API“消费”这些决策,并应用修复措施。
什么是解析器(Parsers)?
解析器将日志格式分解为可读的信息,供CrowdSec应用程序使用。我们将使用Traefik解析器来获取Traefik访问日志,并将该信息传递给CrowdSec应用程序进行决策。
什么是场景(Scenarios)?
一个场景是一种行为,即正在发生的暴力攻击。您可以选择要针对哪些场景检查流量。在这个Traefik集合中,我们将使用典型的HTTP行为。
修复组件(Remediation Components)
修复组件是负责根据安全引擎提供的决策采取行动的软件包,一般被称为保镖(Bouncers)。
什么是保镖(Bouncers)?
保镖会对CrowdSec做出的决策做出反应。在这种情况下,Traefik保镖将根据CrowdSec做出的决策,决定是允许还是拒绝通过Traefik的流量。CrowdSec本身只会做出封禁IP的决策。它会通过连接到安全引擎获取所需的信息,以便在本地做出决策。请查看Hub上可用的bouncers。
- Traefik-crowdsec-bouncer用于验证请求并根据CrowdSec做出的决策进行拒绝。
- firewall bouncer 会将IP添加到nftables/ipset集合中
- Cloudflare Bouncer将向Cloudflare防火墙添加IP。
- blocklist mirror将通过HTTP服务器将阻止列表提供给pfsense、fortinet、untangle等设备。
🆗简单来说
安全引擎
中有一个日志解析器
实时监控服务日志,并根据预设的场景
匹配如登录失败,未授权访问等条目,并对相应的IP做出决策。所以他需要部署在能够读取服务日志的地方。修复组件
将安全引擎
决策的IP下发到防火墙或其它带有访问控制的程序,它可以在多处部署,同时对决策IP进行处理。攻击者触发一处⚠️警报,所有
保镖
都会将ta🚫拉黑。更严重的可能导致全网CrowdSec用户将ta封禁。💿 安装
Crowdsec安装
在主 appdata 文件夹中创建一个子文件夹,用于告诉服务和 Crowdsec 在其中写入日志文件。这些日志文件将被 Crowdsec 集中和分析。在本文中,这个子文件夹命名为“share/Crowdsec”(appdata/share/Crowdsec)。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fd830565e-330b-4d2f-b216-b572f545000b%2F3d6f6ff4-0472-4575-b466-717e5d51e413%2Finstall.png?table=block&id=89c619a3-13b0-4077-963a-b28d9f05e2ff&t=89c619a3-13b0-4077-963a-b28d9f05e2ff&width=336&cache=v2)
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](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fd830565e-330b-4d2f-b216-b572f545000b%2F445cea78-0927-4373-965b-464a1bac0760%2Fbouncerinstall.png?table=block&id=c19688c2-44d2-4a22-9582-4b94d006bbc5&t=c19688c2-44d2-4a22-9582-4b94d006bbc5&width=336&cache=v2)
使用
cscli bouncer list
查看状态bouncer状态openwrt-bouncer(可选)
在Crowdsec容器运行以下命令获取API key:
cscli bouncers add openwrt-bouncer
更新软件包列表并找到luci-app-crowdsec-firewall-bouncer安装
![notion image](https://img.biliko.net/2024/04/c3388e18ab91d8d088f532ea22d56c52.png?t=cd138f04-7331-4c67-93e7-017f4406dd37)
或使用下面的命令安装
opkg install crowdsec-firewall-bouncer
安装完成之后进行配置
![notion image](https://img.biliko.net/2024/04/79dffc4552ead9f95b5065ce0b4e69cd.png?t=4e6f7980-556f-4c6c-9b25-d7c67c6f9579)
或直接修改配置文件,位于/etc/config/crowdsec,然后重新加载bouncer
/etc/init.d/crowdsec-firewall-bouncer reload
查看防火墙状态
![notion image](https://img.biliko.net/2024/04/9d0f249fd1ff7ebfd5f4f46a447553e7.png?t=6487027a-4e5d-4d69-9c24-b793e3e4fb22)
可以看到规则已生效
![notion image](https://img.biliko.net/2024/04/1a7f4e522b38ffdf6ded216a48789fec.png?t=cd0263ee-7235-429e-9b6a-df2d59ece08c)
cloudflare-bouncer(可选)
创建API token并设置权限
![notion image](https://img.biliko.net/2024/04/e28fabd443133506eb8f3bcc03ae3104.png?t=cbbfb9e9-c2c6-4683-8a07-ff19e67e0c83)
在
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](https://img.biliko.net/2024/04/1ab153c7daa871a28b87975b828f6159.png?t=1d1fccdc-7205-4341-be22-7de217286b92)
⚙️ 配置
Traefik启用日志
在 traefik 模板中创建路径映射,以便将日志文件写入之前创建的共享文件夹中。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fd830565e-330b-4d2f-b216-b572f545000b%2F2f8a88e8-9b79-4c95-8ae9-26afa4b448e8%2Ftralog.png?table=block&id=065325a6-4894-475b-97d4-3ffde9327ee4&t=065325a6-4894-475b-97d4-3ffde9327ee4&width=1214&cache=v2)
编辑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](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fd830565e-330b-4d2f-b216-b572f545000b%2F91e1f75a-d151-440e-9087-081dd551c7e1%2Fauthlog.png?table=block&id=ca22b170-5183-46a0-ae30-9bde9e52986a&t=ca22b170-5183-46a0-ae30-9bde9e52986a&width=1214&cache=v2)
然后编辑Authelia的配置文件(appdata/authelia)中的
configuration.yml
文件,以启用日志记录(找到log部分,添加配置)。启用集合
编辑docker crowdsec模板以启用 Authelia 集合,方法是将
crowdsecurity/traefik
LePresidente/authelia
添加到 COLLECTIONS 变量:![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fd830565e-330b-4d2f-b216-b572f545000b%2Ff7872ba0-a871-4a95-a54c-8c6ae95fc54f%2Fauthcoll.png?table=block&id=5a54b63b-d919-4c63-a577-269e439e4710&t=5a54b63b-d919-4c63-a577-269e439e4710&width=672&cache=v2)
同样,也可以使用命令:
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](https://img.biliko.net/2024/04/7774059ef2bb0e292dc28d2b50f5bb0c.png?t=36ed056c-ae00-4644-b9d8-fb9313628be6)
订阅黑名单
![notion image](https://img.biliko.net/2024/04/8d3028d3cf0006cc3f49fd1cddc1f169.png?t=f2062ecb-2518-4513-a1f4-81348c979aa6)
成功阻止坏蛋✨
![notion image](https://img.biliko.net/2024/04/3f933a8a992c22bebe2b97f716a6967a.png?t=7d317c8c-a47d-450c-8570-ef508fc8eba2)
💻 常用命令
这些命令可以使用
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安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
- 作者:Biliko
- 链接:https://biliko.net/article/traefik-part6
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章