Mkungusiops/eBPF

GitHub: Mkungusiops/eBPF

基于eBPF和Tetragon的内核级威胁可观测性工具,通过进程树行为链评分实现主动检测并提供实时SOC仪表盘。

Stars: 0 | Forks: 0

# eBPF 威胁可观测性 PoC 一款主动的内核级威胁可观测性工具。Tetragon 发出内核 事件;Go 关联引擎消费这些事件,构建进程树,对 可疑行为链进行评分,持久化到 SQLite,并提供实时的 SOC 风格仪表盘,支持身份验证、MITRE ATT&CK 映射、告警确认 以及实时的 SSE 更新。 ``` [ kernel ] -- eBPF kprobes --> [ Tetragon ] -- gRPC --> [ engine ] -- HTTPS --> [ browser ] ``` | 文档 | 目的 | |---------------------------------------------------------|------------------------------------------------------| | **README.md** (本文件) | 单页概述 + 快速入门 | | [docs/architecture.md](docs/architecture.md) | 一切如何运作、组件和数据流 | | [docs/deploy-linux-server.md](docs/deploy-linux-server.md) | 在全新 Linux 服务器上的分步部署 | | [docs/multipass-mac-local-vm-deploy.md](docs/multipass-mac-local-vm-deploy.md) | 在 macOS 上通过 Multipass 实现的本地 Linux 虚拟机 | | [docs/build.md](docs/build.md) | 生成此代码库的最初 5 天构建计划| ## 仓库布局 ``` . ├── README.md # this file ├── Makefile # build / test / fake / tarball / clean ├── docs/ # architecture + deployment guides ├── scripts/setup.sh # idempotent Day-1 install on a fresh VM ├── policies/ # Tetragon TracingPolicy YAMLs │ ├── network-watch.yaml # policy name: outbound-connections │ ├── privilege-escalation.yaml │ └── sensitive-files.yaml ├── engine/ # Go correlation engine │ ├── cmd/engine/ # main entrypoint (incl. -fake mode) │ └── internal/ │ ├── api/ # HTTP, SSE, auth, embedded UI │ ├── score/ # per-event + chain scoring rules │ ├── store/ # SQLite (events, alerts) — pure-Go driver │ └── tree/ # in-memory process tree (TTL'd) └── attacks/ # 6 attack-simulation scripts ``` ## 快速路径 | 目标 | 命令 | |---------------------------------------|---------------------------------------------------------------| | 运行单元测试 | `make test` | | 在本地运行引擎 (无 Tetragon) | `make fake` 然后打开 | | 为 Linux 服务器交叉编译 | `make build-linux` | | 打包二进制文件 + 策略 + 攻击 | `make tarball` → `ebpf-poc-amd64.tar.gz` | | 在全新 Linux 服务器上部署 | 参见 [docs/deploy-linux-server.md](docs/deploy-linux-server.md) | | macOS 上的本地 Linux 虚拟机 (Multipass) | 参见 [docs/multipass-mac-local-vm-deploy.md](docs/multipass-mac-local-vm-deploy.md) | ## 系统要求 **用于本地 UI 开发(任意操作系统):** - Go 1.22+ **用于真实的 Tetragon 部署:** - Linux (Ubuntu 22.04 / 24.04 LTS),内核 ≥ 5.15 - 存在 `/sys/kernel/btf/vmlinux` (已启用 BTF) - Docker (用于 Tetragon 容器) - `sudo` (Tetragon 需要 `--privileged --pid=host`) 为了方便开发,Go 代码本身可以在 macOS 上构建,但是 Tetragon 仅在 Linux 上运行 —— 实际的事件流仅存在于 Linux 主机上。 ## 快速开始 ### A. 本地开发 / UI 演示(任意操作系统,无需 Tetragon) ``` make fake # builds engine, runs with -fake on :8080 open http://localhost:8080 ``` 您将被重定向到 `/login`。**默认凭据**: | 用户 | 密码 | |---------|------------------| | `admin` | `ebpf-soc-demo` | 使用 `-user` 和 `-pass` 标志可覆盖默认凭据。`make fake` 会合成 确定性的攻击模式事件流(webshell、reverse-shell、 凭证窃取、权限提升、LOLBin),这些事件将流经 与生产环境中 Tetragon 提供事件相同的处理程序。这对于在没有 Linux 主机的 情况下迭代 UI、评分规则或存储模式非常有用。 ### B. 在 Linux 服务器上的实际部署 有关包含 systemd、TLS 和加固的完整演练,请参阅 **[docs/deploy-linux-server.md](docs/deploy-linux-server.md)**。简明 版本: 1. **从您的开发机**,构建 Linux 产物: make tarball # → ebpf-poc-amd64.tar.gz scp ebpf-poc-amd64.tar.gz user@server:~/ 2. **在服务器上** (Ubuntu 22.04+,内核 ≥ 5.15): mkdir ~/ebpf-poc && tar -xzf ~/ebpf-poc-amd64.tar.gz -C ~/ebpf-poc cd ~/ebpf-poc TETRAGON_IMAGE=quay.io/cilium/tetragon:v1.6.1 bash scripts/setup.sh sudo make policies-apply sudo mkdir -p /var/lib/ebpf-engine sudo ./engine/engine-linux-amd64 \ -tetragon unix:///var/run/tetragon/tetragon.sock \ -db /var/lib/ebpf-engine/events.db \ -http :8080 \ -user admin -pass 'pick-something-strong' 3. **打开 UI**,访问 `http://:8080` (使用 SSH 隧道 — 该引擎仅支持 HTTP;除了用于演示外,请在其前端放置 TLS)。 4. **触发攻击场景**,在服务器上的另一个 shell 中执行: sudo bash ~/ebpf-poc/attacks/01-webshell.sh UI 将在约 1 秒内显示一个告警。点击它可查看完整的行为链。 ### C. macOS 上的本地 Linux 虚拟机 (Multipass) 如果您没有远程 Linux 服务器,您可以在 本地虚拟机中运行完整的堆栈。请参阅 **[docs/multipass-mac-local-vm-deploy.md](docs/multipass-mac-local-vm-deploy.md)**。 ## 检测的工作原理 1. **Tetragon** 将每个 TracingPolicy 作为内核中的 eBPF 程序加载。 每一个 `execve` 已经会产生一个 `process_exec` 事件;YAML 策略为 setuid、敏感文件访问以及由 shell 发起的出站 TCP 连接 增加了 `process_kprobe` 事件。 2. **引擎** 订阅 Tetragon 的 gRPC `GetEvents` 流,并 维护一个以 Tetragon 稳定的 `exec_id` 为键的进程树 (该 ID 在 PID 复用后依然有效)。对于每一个事件,它会: - 在 `events` 表中插入一行。 - 将该事件的分数加到其节点上,然后向上遍历祖先节点 (最多 10 跳) 对链路进行求和计算分数。 - 如果链路得分 ≥ 10,它会插入一条 `alerts` 记录,对严重性进行分类 (`info` < `low` < `medium` < `high` < `critical`),并向 所有 SSE 订阅者广播。 3. **仪表盘** (内嵌在二进制文件中的单页应用) 通过 `/api/events` 和 `/api/alerts` 加载最近的数据切片,然后订阅 `/api/stream` 以获取实时更新。身份验证由 HttpOnly cookie 中间件强制执行;未经身份验证的浏览器请求将重定向到 `/login`,API 请求将收到 401 状态码。 ### 评分 | 触发器 | 分数 | |----------------------------------|-------| | `curl \| sh` / `wget \| sh` | +25 | | `nc -e` / shell-arg netcat | +20 | | 凭证文件 (`shadow`,`.ssh`) | +20 | | 参数中的 `base64 -d` | +15 | | setuid(0) kprobe | +15 | | 来自 shell 的出站 TCP | +12 | | 敏感文件 (其他) | +8 | | `chmod +x` | +5 | | 网络工具执行 | +5 | | 网络下载器执行 | +3 | | `bash -c` | +1 | 严重性阈值:`low` ≥ 5,`medium` ≥ 10,`high` ≥ 20,`critical` ≥ 40。 校准后,任何单一事件最多被评为 "low";"high"/"critical" 需要 一条行为链 —— 这正是检测具备主动性的原因。 ## 攻击模拟脚本 | 脚本 | 触发器 | 预期严重性 | |-------------------------------|------------------------------------------------|-------------------| | `01-webshell.sh` | exec(curl) + chmod +x + cat /etc/shadow | high / critical | | `02-credential-theft.sh` | 读取 shadow, sudoers, ~/.ssh/* | high | | `03-reverse-shell.sh` | bash 打开 TCP socket (回环地址) | medium / high | | `04-privilege-escalation.sh` | setuid(0) + root 读取凭证 | high | | `05-living-off-the-land.sh` | curl \| sh 模式 + base64 解码 | critical | | `06-persistence.sh` | chmod +x 暂存脚本 + dotfile 侦察 | medium | 所有脚本在设计上都是安全的:网络调用指向 `example.com` 或 `127.0.0.1`,不会发生真实的数据渗出,并且任何临时文件都会在 退出时被清理。 ## HTTP API | 方法 | 路径 | 需认证 | 返回 | |--------|----------------------------|------|----------------------------------------------| | GET | `/` | 是 | 仪表盘 HTML | | GET | `/login` | 否 | 登录页面 | | POST | `/api/login` | 否 | 设置 `soc_session` cookie + 303 → `/` | | GET | `/api/logout` | 否 | 清除 cookie + 303 → `/login` | | GET | `/api/whoami` | 是 | `{"user":"admin"}` | | GET | `/api/events` | 是 | 最近 200 条事件 | | GET | `/api/alerts` | 是 | 最近 100 条告警 | | GET | `/api/process/` | 是 | 指定 exec_id 的 `{chain, events}` | | GET | `/api/stream` | 是 | SSE: `data: {"type":"alert"\|"event", ...}` | | GET | `/favicon.svg` | 否 | 图标 (同样在 `/favicon.ico` 提供) | ## 验证状态 在开发过程中进行了端到端测试: - `make test` — `score`、`tree`、`store` 中的所有单元测试均通过。 - `make build` / `make build-linux` — 生成一个 24 MB 的静态链接 Linux ELF (无 CGO,无运行时依赖)。 - `make fake` — 通过生产代码路径合成事件, 仪表盘渲染它们,并且身份验证流程 (登录 → cookie → 受保护的 fetch → 登出) 按预期工作。 - 在 Multipass 虚拟机中的 Ubuntu 22.04 + 内核 5.15 上运行真实的 Tetragon — 所有六个攻击脚本均产生了预期的告警;KPI 计数器、 MITRE 覆盖率、IOC 和网络面板均正确填充。 有关组件级别的详细信息以及在最近的 会话中所做的更改,请参阅 [docs/architecture.md](docs/architecture.md)。 ## 局限性 - **仅检测,无防御。** 向策略中添加 `enforcement` 动作 (`SIGKILL`,`Override`) 可以改变这一点。 - **单主机。** 引擎连接到一个 Tetragon socket 并写入 一个 SQLite 文件。多主机需要一个扇入收集器。 - **单用户身份验证。** 会话存储在内存中,并在引擎 重启时丢失。对于多用户 / 高可用性 (HA),需将 `Auth.sessions` 替换为 Redis 或 类似组件。 - **仅支持 HTTP。** TLS 终端应由反向代理 (Caddy/nginx) 完成 —— 请参阅部署指南。 - **固定的评分规则。** 没有基线学习;调优需通过 `internal/score/scorer.go` 手动完成。 ## 后续计划 - 将 Sigma 规则转换为 TracingPolicies 以扩大覆盖范围。 - 当数据量需要时,从 SQLite 迁移到 ClickHouse。 - 添加 OCSF 事件规范化以用于 SIEM 导出。 - 将策略从 `Post` 切换为 `SIGKILL`,从而将此系统从 检测转变为内核内防御。
标签:CSV导出, Docker镜像, Go语言, gRPC, HTTP工具, IP 地址批量处理, JSONLines, kprobes, Linux服务器部署, MITRE ATT&CK映射, PB级数据处理, Python工具, SQLite, 内核级监控, 前端大屏, 后端开发, 威胁情报, 安全可观测性, 安全渗透, 安全运维, 实时SSE更新, 实时监控仪表盘, 开发者工具, 敏感文件监控, 日志审计, 权限提升监控, 版本控制, 程序破解, 网络安全, 行为关联评分, 警报确认, 请求拦截, 进程树, 隐私保护, 零信任