饮墨

子安饮墨馀三斗,留与卿儿作赋来

CrowdSec:协作式入侵防御系统,替代 Fail2ban 的现代方案

痛点

Fail2ban 是 Linux 服务器上最经典的暴力破解防护工具,但在现代运维场景下越来越力不从心:

  • 单机视野:每台服务器独立判断,无法共享威胁情报,同一个恶意 IP 打完 A 服务器再打 B 服务器时,B 毫无防备
  • 性能瓶颈:基于正则逐行解析日志,在高流量场景下 CPU 消耗可观
  • 生态单薄:仅支持 iptables/firewalld 封禁,无法原生联动 Nginx、CDN、WAF
  • 缺乏可观测性:没有集中式仪表盘,多节点管理靠手工

CrowdSec 正是为解决这些问题而设计的现代协作式入侵防御系统(IPS)。

方案概述

CrowdSec 是一个开源(MIT 协议)的安全引擎,核心理念是众包威胁情报 + 本地行为分析

  1. 本地引擎(Security Engine):高性能日志解析 + 行为场景检测,速度比 Fail2ban 快 60 倍(Go 实现,多线程流式处理)
  2. 众包威胁情报(Community Blocklists):全球数万节点共享恶意 IP 情报,你的服务器未被攻击就已获得防护
  3. Remediation Components(Bouncers):解耦的封禁执行层,支持 iptables、nftables、Nginx、Cloudflare、AWS WAF 等 30+ 集成
  4. 集中式控制台(Console):多节点统一管理、告警聚合、情报订阅
┌─────────────┐     ┌─────────────┐     ┌──────────────────┐
│  Log Sources │ ──▶ │  CrowdSec   │ ──▶ │   Bouncers       │
│  (syslog/    │     │  Engine     │     │  (firewall/      │
│   nginx/     │     │  (检测+决策) │     │   nginx/cdn)     │
│   journald)  │     └──────┬──────┘     └──────────────────┘
└─────────────┘            │
                           ▼
                  ┌─────────────────┐
                  │  CrowdSec CAPI  │
                  │  (众包情报中心)   │
                  └─────────────────┘

实操步骤

Step 1:安装 CrowdSec Security Engine

# Debian/Ubuntu
curl -s https://install.crowdsec.net | sudo sh
sudo apt install crowdsec

# CentOS/RHEL
curl -s https://install.crowdsec.net | sudo sh
sudo yum install crowdsec

# 验证运行状态
sudo systemctl status crowdsec

安装时会自动检测系统上的服务(Nginx、SSH、MySQL 等),自动下载对应的解析器(Parsers)和场景(Scenarios)。

Step 2:安装 Bouncer(封禁执行组件)

以最常用的防火墙 Bouncer 为例:

# 安装 firewall bouncer(自动管理 iptables/nftables)
sudo apt install crowdsec-firewall-bouncer-iptables

# 或者使用 nftables 版本(推荐现代系统)
sudo apt install crowdsec-firewall-bouncer-nftables

# 验证 bouncer 注册状态
sudo cscli bouncers list

如果需要在 Nginx 层拦截(返回 403 而非 TCP 层丢包):

sudo apt install crowdsec-nginx-bouncer
# 自动在 Nginx 配置中注入 lua 模块
sudo systemctl reload nginx

Step 3:查看检测状态与管理决策

# 查看已安装的场景(检测规则)
sudo cscli scenarios list

# 查看实时告警
sudo cscli alerts list

# 查看当前封禁决策
sudo cscli decisions list

# 手动封禁一个 IP(测试用)
sudo cscli decisions add --ip 1.2.3.4 --duration 4h --reason "manual ban test"

# 手动解封
sudo cscli decisions delete --ip 1.2.3.4

Step 4:订阅社区情报 + 注册控制台

# 注册到 CrowdSec Console(免费)
sudo cscli console enroll <your-enrollment-key>

# 在 https://app.crowdsec.net 获取 enrollment key
# 注册后可在 Web 控制台看到所有节点的告警聚合

订阅社区 Blocklist 后,引擎启动时会拉取全球恶意 IP 列表,实现零日攻击前置防御

Step 5:自定义场景(可选进阶)

创建自定义检测场景,例如检测 API 接口暴力调用:

# /etc/crowdsec/scenarios/api-bruteforce.yaml
type: leaky
name: custom/api-bruteforce
description: "Detect API brute force attempts"
filter: evt.Meta.log_type == 'nginx_access' && evt.Parsed.request contains '/api/login'
groupby: evt.Meta.source_ip
capacity: 10
leakspeed: 30s
blackhole: 5m
labels:
  remediation: true
# 重载配置
sudo systemctl reload crowdsec

# 测试场景是否生效
sudo cscli scenarios list | grep custom

避坑指南

1. Bouncer 和 Engine 版本不匹配

问题:升级 CrowdSec Engine 后 Bouncer 报 API 认证失败。

解决:Bouncer 的 API key 存储在 /etc/crowdsec/bouncers/ 对应配置中。升级后如遇问题:

# 重新生成 bouncer API key
sudo cscli bouncers add my-firewall-bouncer
# 将新 key 写入 bouncer 配置文件
sudo systemctl restart crowdsec-firewall-bouncer

2. 误封合法 IP(白名单配置)

问题:办公网络或监控探针被误判为暴力破解。

解决:配置白名单文件:

# /etc/crowdsec/parsers/s02-enrich/whitelist.yaml
name: custom/whitelist
description: "Whitelist internal IPs"
whitelist:
  reason: "internal networks"
  ip:
    - "10.0.0.0/8"
    - "172.16.0.0/12"
    - "192.168.0.0/16"
    - "203.0.113.50"  # 办公出口 IP

3. 高并发场景下日志积压

问题:Nginx 日志量大时,CrowdSec 处理延迟增加。

解决

# /etc/crowdsec/acquis.yaml 中调整
---
filenames:
  - /var/log/nginx/access.log
labels:
  type: nginx
---
# 对于超高流量,使用 journald 数据源替代文件轮询
source: journalctl
journalctl_filter:
  - "_SYSTEMD_UNIT=nginx.service"
labels:
  type: nginx

同时确保 logrotate 配置合理,避免单文件过大。

CrowdSec vs Fail2ban 对比

维度 CrowdSec Fail2ban
语言/性能 Go,多线程流式处理 Python,单线程正则匹配
威胁情报 众包社区情报 + 商业情报源 无,纯本地检测
封禁方式 30+ Bouncers(防火墙/Nginx/CDN/WAF) 主要 iptables
可观测性 Web Console + Prometheus metrics 基本无
多节点管理 Console 集中管理 每台独立配置
容器支持 原生 Docker/K8s 部署 需额外适配
协议 MIT GPL

生产部署建议

  • 最小部署:单台服务器安装 Engine + Firewall Bouncer,5 分钟完成,零配置即可防护 SSH + Nginx
  • 中型集群:每台节点部署 Engine,统一注册到 Console,共享内部情报
  • K8s 环境:使用官方 Helm Chart 部署,配合 Ingress Controller Bouncer 在入口层拦截
# Prometheus metrics 端点(默认开启)
curl http://localhost:6060/metrics | grep cs_

# 关键指标
# cs_decisions — 当前活跃封禁数
# cs_alerts_total — 累计告警数  
# cs_parsed_total — 已处理日志条数

总结

CrowdSec 是 Fail2ban 的现代替代方案,核心优势在于协作式威胁情报解耦的 Bouncer 架构。对于管理多台服务器的运维团队,它能将安全防护从"各自为战"升级为"群体免疫"。部署门槛低,5 分钟即可完成基础防护,社区版功能已完全满足中小规模生产需求。建议从替换 Fail2ban 开始,逐步接入 Console 实现多节点统一管理。

您还没有登录,请登录后发表评论。