hi-heisenbug/goodman

GitHub: hi-heisenbug/goodman

Goodman 利用 eBPF 将 Linux 系统调用精确归因到具体 npm 包,通过学习依赖行为基线来检测并告警运行时依赖漂移。

Stars: 0 | Forks: 0

# Goodman [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/hi-heisenbug/goodman/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) [![Go](https://img.shields.io/badge/go-1.23+-00ADD8.svg)](go.mod) [![Kubernetes](https://img.shields.io/badge/kubernetes-helm-326CE5.svg)](deploy/helm/goodman) Goodman 是一个运行时依赖安全传感器。它将与安全相关的 Linux syscalls 归因于引发它们的准确 npm package,学习每个 `(service, package, version)` 的行为基线,并在依赖项版本开始执行新操作时发出警报。 简短版本:内核可以告诉你某个进程打开了文件或连接到了某个 IP。Goodman 会告诉你该进程中的哪个依赖项执行了此操作。 ![显示严重依赖漂移警报的 Goodman dashboard](https://raw.githubusercontent.com/hi-heisenbug/goodman/main/docs/images/dashboard.png) 由 Heisenbug 嵌入的 Goodman dashboard 是一个生产级 React/Vite UI,具有实时警报审查、指纹探索、SSE 更新和响应式移动布局。 ## 演示 观看 54 秒的产品演示: [打开演示视频](demo_build/goodman_demo.mp4) ## 检测内容 Goodman 专为依赖项行为漂移而构建: - 某个 package 版本开始读取 secrets、tokens、SSH keys、`.npmrc` 或云凭证 - 某个依赖项开始连接到云元数据或新的出站主机 - 某个 package 更新在原有基线没有的情况下增加了 process execution - 与该 package 学习到的基线相比,任何新的规范行为 在 v1.0 中它是检测优先的。Goodman 负责观察、归因、指纹识别和警报;它不进行拦截或沙盒隔离。 ## 工作原理 ``` kernel tracepoints open/openat/openat2/connect/execve | v eBPF sensor captures syscall + user stack | v userspace attribution maps stack frame -> package@version | v collector learns fingerprints and diffs new behavior | v REST API, SSE stream, Prometheus metrics, dashboard ``` 1. **捕获:** CO-RE eBPF 挂钩被监视的 Node/Python 进程的 `open`、`openat`、`openat2`、`connect` 和 `execve`,并记录用户空间堆栈。 2. **归因:** 用户空间通过 V8 perf maps 和 `/proc//maps` 解析堆栈地址,然后将最深层的 `node_modules//` 帧映射到其 `package.json` 版本。 3. **指纹识别:** 事件被规范化为稳定的行为,例如 `READ /app/node_modules/pkg/**` 和 `CONNECT 169.254.169.254:80`。 4. **比对:** 收集器将实时行为与学习到的基线进行比较,并应用可配置的高风险规则。 Goodman 宁愿选择 `` 也不愿猜测 package 名称。错误的归因比没有归因更糟糕。 ## 快速开始 你需要一台具备内核 5.8+ 和 BTF 的 x86-64 Linux 主机,如果你还想重新构建 dashboard,则需要 Go、clang/LLVM、bpftool 和 Node。 完整的设置和使用指南位于 [docs/setup-and-usage.md](docs/setup-and-usage.md) 中。最简短的本地路径是: ``` make doctor make build make test make smoke ``` `make smoke` 是无需 root 权限的演示。它会启动收集器,输入合成的基线和漂移事件,并准确断言一个 CRITICAL 警报。 要使用真实数据探索产品 UI: ``` make demo ``` 然后打开 `http://127.0.0.1:8844`。这条无需 root 权限的路径会使用本地 SQLite 数据库启动收集器,植入基线指纹和依赖漂移警报,并保持 dashboard 运行,直到你按下 `Ctrl-C`。 对于真实的 eBPF 路径: ``` sudo make e2e ``` 这会针对包含的 Node 工作负载运行良性漂移重放: `good-pkg@1.0.0` 作为基线被学习,随后 `good-pkg@1.0.1` 会读取一个虚假的凭证文件并连接到一个 localhost sink。预期结果是针对新行为产生一个 CRITICAL 警报。 ## 本地 Dashboard ``` GOODMAN_DSN=goodman.db GOODMAN_LEARN_OBS=50 GOODMAN_LEARN_MIN_AGE=1s \ ./bin/collector -listen :8844 ``` 打开 `http://localhost:8844`。dashboard 内嵌在 collector 二进制文件中,因此新构建的 Go 版本可以直接提供 UI 服务,而无需单独的 Node 服务器。 ## Kubernetes ``` scripts/install-k8s.sh --cluster prod ``` 在你想让 Goodman 监视的 Node 工作负载上启用 package 归因: ``` scripts/enable-node-attribution.sh --namespace checkout --selector app=api ``` 或者给某个命名空间内的每个 Deployment 打补丁: ``` scripts/enable-node-attribution.sh --namespace checkout --all ``` 打开 dashboard: ``` kubectl -n goodman-system port-forward svc/goodman-collector 8844:8844 ``` 对于被监视工作负载,Tier-1 Node 归因仅需设置一个环境变量: ``` env: - name: NODE_OPTIONS value: "--perf-basic-prof --interpreted-frames-native-stack" ``` 有关生产环境的详细信息、Postgres 配置、镜像发布和 chart 资源,请参阅 [docs/deployment.md](docs/deployment.md)。 ## 仓库地图 | Path | Purpose | |---|---| | `bpf/` | eBPF C 程序、共享网络结构、生成的 `vmlinux.h` | | `cmd/sensor` | 特权 sensor:加载 eBPF、归因事件、发布批次 | | `cmd/collector` | 摄取、指纹识别、比对、API、dashboard | | `cmd/goodmanctl` | 用于查看事件、警报、确认/解决、指纹的 CLI | | `internal/attribute` | 堆栈到 package 的归因 | | `internal/fingerprint` | 行为聚合和基线提升 | | `internal/diff` | 基线比较和高风险规则评估 | | `dashboard/` | React/Vite dashboard 源码 | | `deploy/` | Dockerfiles、Helm chart、示例规则 | | `test/` | 合成的冒烟测试驱动程序、工作负载 fixtures、e2e 测试工具 | ## 文档 - [入门指南](docs/getting-started.md) - [设置和使用](docs/setup-and-usage.md) - [架构](docs/architecture.md) - [归因](docs/attribution.md) - [配置](docs/configuration.md) - [部署](docs/deployment.md) - [API 参考](docs/api.md) - [开发](docs/development.md) - [故障排除](docs/troubleshooting.md) - [Agent 指令](AGENTS.md) ## 开发 ``` make doctor make build make vet make test make smoke ``` 关于完整的本地、dashboard、CLI 和 Kubernetes 工作流,请使用 [docs/setup-and-usage.md](docs/setup-and-usage.md)。 在将更改合并到 `bpf/`、`internal/loader/` 或 `internal/attribute/` 之前,请运行 `sudo make e2e`。 最高严重性的不变条件是共享的事件布局: `bpf/goodman.h` 中的 `struct event` 和 `internal/model/types.go` 中的 `RawEvent` 必须保持逐字节一致。这由 `internal/model/types_test.go` 强制执行。 ## 状态 Goodman v0.1.0 包括: - 针对 file open、network connect 和 process exec 的 eBPF 捕获 - 通过 V8 perf maps 进行的 Tier-1 npm 归因 - SQLite 和 Postgres 存储 - 基线学习和行为漂移检测 - 可配置的高风险规则 - REST API、SSE 流、Prometheus 指标和内嵌的 dashboard - Docker 镜像和 Helm chart 后续跟进项记录在 [plan.md](plan.md) 中:mutating-webhook 自动注入、Python/PyPI 归因以及 Tier-2 原生 V8 堆栈展开。 ## 许可证 Apache-2.0。参见 [LICENSE](LICENSE)。
标签:Docker镜像, Go, Ruby工具, StruQ, 依赖安全, 子域名突变, 客户端加密, 异常检测, 插件系统, 日志审计, 时间线生成, 测试用例, 自定义请求头, 行为基线, 请求拦截