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更新, 实时监控仪表盘, 开发者工具, 敏感文件监控, 日志审计, 权限提升监控, 版本控制, 程序破解, 网络安全, 行为关联评分, 警报确认, 请求拦截, 进程树, 隐私保护, 零信任