给你的 Traefik 加上 Crowsdec 防火墙
2602 还是 failban 吗
CrowdSec 是一个开源的安全防护工具,可以理解为“现代化、协作式的 Fail2ban + 威胁情报网络”。它通过分析服务器、应用、反向代理、防火墙等日志,识别恶意行为,并自动采取封禁、挑战、限速等处置动作。
官方将其核心组件称为 CrowdSec Security Engine,它是一个开源入侵检测/防护引擎,主要通过日志和 HTTP 请求分析来发现攻击行为。CrowdSec 的一个特色是 社区威胁情报共享:用户可以选择加入社区网络,将检测到的恶意 IP 信号贡献出去,同时也能利用其他用户贡献的威胁情报。
CrowdSec 的工作流程大致是:
日志 / 请求
↓
Parser 解析
↓
Scenario 行为规则匹配
↓
Alert 告警
↓
Decision 决策
↓
Bouncer / Remediation Component 执行封禁
而我们所需要的就是部署 Crowdsec Engine 容器并在 Traefik 中添加 Crowdsec Bouncer Traefik plugin 插件
安装容器
crowdsec:
image: crowdsecurity/crowdsec:latest
container_name: crowdsec
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080"
environment:
- COLLECTIONS=crowdsecurity/traefik crowdsecurity/sshd
volumes:
- ./crowdsec/acquis.yaml:/etc/crowdsec/acquis.yaml
- ./logs:/var/log/traefik:ro
- crowdsec-db:/var/lib/crowdsec/data
- crowdsec-config:/etc/crowdsec
- /var/log/journal:/var/log/journal:ro
- /run/log/journal:/run/log/journal:ro
- /etc/machine-id:/etc/machine-id:ro
networks:
- overlay
healthcheck:
test:
- CMD
- cscli
- lapi
- status
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
networks:
overlay:
name: overlay
volumes:
crowdsec-db:
crowdsec-config:
需要注意的有两点
一是 environment 部分
- COLLECTIONS=crowdsecurity/traefik crowdsecurity/sshd
定义了离线状态下会添加的拦截名单
是 volume 部分
- ./crowdsec/acquis.yaml:/etc/crowdsec/acquis.yaml
定义了 traefik 的 日志请求部分,比如我的 acquis.yaml 会这样写
filenames:
- /var/log/traefik/access.log
labels:
type: traefik
---
source: journalctl
journalctl_filter:
- "_SYSTEMD_UNIT=ssh.service"
labels:
type: syslog
而
- ./logs:/var/log/traefik:ro
是 traefik 的 log 位置
并且,此处的 volume 配置还额外添加了对 ssh 日志的读取用于拦截 ssh 攻击(结尾补充)
- /var/log/journal:/var/log/journal:ro
- /run/log/journal:/run/log/journal:ro
docker compose up -d 启动容器后执行 docker exec -it crowdsec cscli console enroll <你的_ENROLL_KEY> 连上官网面板,并在官网授权同意
配置 Crowdsec Bouncer Traefik plugin 插件
在 traefik.yaml 中添加扩展
experimental:
plugins:
bouncer:
moduleName: github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin
version: v1.6.0
使用 Crowdsec Engine 生成 LAPI KEY
docker exec -it crowdsec cscli bouncers add traefik-plugin(bouncers 名称)
并在动态配置文件夹中添加 crowdsec.yaml, 具体内容如下
http:
middlewares:
crowdsec:
plugin:
bouncer:
enabled: true
logLevel: INFO
crowdsecMode: stream
crowdsecLapiHost: crowdsec:8080
crowdsecLapiKey: engine 生成的 LAPI KEY
updateIntervalSeconds: 60
updateMaxFailure: 0
defaultDecisionSeconds: 60
最后执行 docker exec -it crowdsec cscli bouncers list 查看 bouncers 与 engine 的连接情况
之后在 traefik 的 middlewares 中添加,比如
middlewares:
- compress
- crowdsec
Extra:安装 crowdsec-firewall-bouncer 并连接(以 Debian 为例)
# 安装软件包
curl -s https://install.crowdsec.net | sudo sh
sudo apt install crowdsec-firewall-bouncer-nftables
# 配置 bouncer
docker exec -it crowdsec cscli bouncers add firewall-nftables
vim /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
## 找到 api_key 换成生成的 PAPI KEY
# 启动 bouncer
sudo systemctl enable --now crowdsec-firewall-bouncer
sudo systemctl restart crowdsec-firewall-bouncer