mental-lab/grumble
GitHub: mental-lab/grumble
基于 Grype 的轻量级多集群容器漏洞扫描系统,通过 Agent 架构汇聚各集群扫描结果并提供热点评分和 Grafana 可视化。
Stars: 1 | Forks: 0
# grumble
Grumble 是一个轻量级的多集群容器漏洞扫描系统。它在每个 Kubernetes 集群中运行一个小型 agent,用于监控运行中的工作负载,使用 [Grype](https://github.com/anchore/grype) 扫描镜像,并将结果流式传输到中央服务器——为您提供跨所有集群的单点热点视图。
## 架构
```
[Cluster A]
grumble-agent ──────────────────────────────→
gRPC (outbound) grumble-server
[Cluster B] ├── SQLite / Postgres
grumble-agent ──────────────────────────────→ ├── HTTP API
└── Grafana dashboard
[Cluster C]
grumble-agent ──────────────────────────────→
```
**关键设计决策(受 GitLab KAS 启发):**
- Agent 发起出站 gRPC 连接——无需入站防火墙规则
- 可在 NAT、跨云和离线环境中工作
- 双向流式传输——服务器可以向 agent 推送配置更改
- 重连时采用带抖动的指数退避策略
## 组件
| 组件 | 描述 |
|---|---|
| `grumble-agent` | 集群内 agent:监控 pod,使用 Grype 扫描镜像,流式传输结果 |
| `grumble-server` | 中央聚合服务器:接收结果,暴露 HTTP API 供 Grafana 使用 |
## 热点评分
Grumble 通过 **风险 × 影响范围** 对镜像进行评分:
```
risk_score = (critical × 10 + high × 3 + medium) × pod_count
```
1 个 pod 中的严重 CVE 的评分会低于跨 10 个团队在 200 个 pod 中运行的高危 CVE。这能揭示哪些问题真正需要优先修复。
## 快速开始
### 运行服务器
```
go run ./cmd/server --grpc-addr=:9090 --http-addr=:8080 --db=/data/grumble.db
```
### 运行 agent(使用 kubeconfig)
```
go run ./cmd/agent \
--cluster-id=prod-us-east \
--server=grumble-server:9090 \
--kubeconfig=~/.kube/config
```
### 部署到 Kubernetes(通过 Helm)
```
# 将 agent 部署到每个集群
helm install grumble-agent ./deploy/helm/agent \
--set agent.clusterID=prod-us-east \
--set agent.serverAddr=grumble.example.com:9090
```
## 构建
```
# 从 proto 生成 gRPC 代码
make proto
# 构建 binaries
make build
# 运行测试
make test
```
## 容器镜像
每次推送到 `main` 分支以及打版本标签时,镜像都会自动发布到 [GitHub Container Registry](https://ghcr.io/mental-lab/grumble-agent)。
| 标签 | 时机 |
|-----|------|
| `sha-` | 每次推送到 `main` |
| `v1.2.3` | 在 git 标签 `v1.2.3` 时 |
| `1.2` | 在 git 标签 `v1.2.x` 时 |
每个镜像都会在 CI 中使用 [Grype](https://github.com/anchore/grype) 进行扫描。如果发现严重 CVE,构建将失败。扫描结果会上传到 GitHub Security → Code scanning。
**本地构建:**
```
make docker-agent
# 生成 grumble-agent:latest
```
**部署到集群:**
```
# 1. 确保 image 可用(已构建并推送,或已加载到你的集群中)
# 2. 通过 Helm 安装
helm install grumble-agent ./deploy/helm/agent \
--set agent.clusterID=prod-us-east \
--set agent.serverAddr=grumble.example.com:9090 \
--set image.repository=ghcr.io/mental-lab/grumble-agent \
--set image.tag=main
```
对于本地开发集群(例如 Rancher Desktop / k3s):
```
# 直接构建并导入 — 无需 registry
docker build -f deploy/Dockerfile.agent -t grumble-agent:dev .
# 对于 k3s:导入到 containerd
docker save grumble-agent:dev | sudo k3s ctr images import -
helm install grumble-agent ./deploy/helm/agent \
--set agent.clusterID=local \
--set agent.serverAddr=grumble-server:9090 \
--set image.repository=grumble-agent \
--set image.tag=dev \
--set image.pullPolicy=Never
```
## Grafana
将 [JSON API 数据源](https://grafana.com/grafana/plugins/marcusolsson-json-datasource/) 指向您的 grumble-server HTTP 地址。
可用端点:
- `GET /hotspots` — 按风险评分(严重 CVE × pod 数量)排名的镜像
- `GET /clusters` — 各集群摘要
- `GET /inventory?cluster=` — 某集群的 pod 清单
## 名称
Grumble 向 [Grype](https://github.com/anchore/grype) 致敬。当它发现您的集群中存在漏洞时,它会发出响亮的“抱怨”(grumble)。
## 名称
Grumble 向 [Grype](https://github.com/anchore/grype) 致敬。当它发现您的集群中存在漏洞时,它会发出响亮的“抱怨”(grumble)。标签:Angular, Chrome Headless, CI/CD安全, CISA项目, Claude, CVE检测, DevSecOps, EVTX分析, Go语言, Grafana, gRPC通信, Grype, Kubernetes代理, Kubernetes安全, Llama, PostgreSQL, Python工具, SQLite, Web截图, 上游代理, 加密, 多集群管理, 子域名突变, 安全合规, 容器安全, 微服务安全, 日志审计, 测试用例, 漏洞扫描器, 热点分析, 程序破解, 网络代理, 网络连接安全, 请求拦截, 风险评分