给你的 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