GorgnyxRukh0x1/ChronosMesh
GitHub: GorgnyxRukh0x1/ChronosMesh
一个基于 eBPF 与时间哈希链的内核级零信任网络引擎,解决数据包临时身份与重放攻击问题。
Stars: 0 | Forks: 0
# ChronosMesh
ChronosMesh 是一个高性能、零信任的网络引擎,旨在强制实施数据包级临时身份。通过将 eBPF 流量控制(TC)钩点与时间哈希链集成,ChronosMesh 在数据包到达用户空间应用程序之前在内核边缘验证网络流量。
## 哲学与问题解决
传统的基于周界的安全模型依赖 IP 地址和静态防火墙规则,在动态的零信任环境中是不够的。网络欺骗和重放攻击仍然是重大威胁。ChronosMesh 通过将每个数据包视为独立的、可加密验证的实体来解决这个问题。
ChronosMesh 的核心哲学是 **在边界强制实施临时身份**。而不是依赖静态隧道或重量级用户空间代理,ChronosMesh 使用 eBPF 直接在内核中拦截数据包。它利用时间哈希链算法结合 X25519 椭圆曲线 Diffie-Hellman(ECDH)密钥交换来持续旋转会话密钥。这确保了严格的向前安全性,并保证拦截的数据包无法被重放或修改而不会被立即发现。
## 架构
ChronosMesh 在内核-用户空间边界上运行,将职责分离以在满足 eBPF 验证器的严格约束的同时最大化吞吐量。
```
flowchart TD
subgraph Userspace[Userspace Daemon]
A[Control API] --> B[Session Synchronizer]
B --> C[Peer Discovery]
B --> D[Policy Engine]
D --> E[BPF Loader / Map Manager]
F[HMAC Authenticator]
end
subgraph Kernel[Linux Kernel eBPF]
G[TC Egress Hook]
H[TC Ingress Hook]
I[(BPF Hash Maps)]
end
subgraph Network[Wire]
J[Untrusted Network]
end
E <-->|Update Maps| I
AppOut[Application TX] --> G
G -->|Stamp Header| J
J --> H
H -->|O1 Checks| I
H -->|Valid| F
F -->|Full Verify| AppIn[Application RX]
H -->|Invalid| Drop[Drop Packet]
```
### 内核-用户空间边界
eBPF 程序在内核中执行 O(1) 快速路径检查:
1. **会话存在性:** 在 BPF 哈希映射中查找对等 IP。
2. **时间戳新鲜度:** 确保数据包时间戳在可配置的时间偏差容忍范围内。
3. **序列单调性:** 基于序列号执行粗略的重放检测。
完整的 HMAC-SHA256 验证在用户空间执行。这种权衡是必要的,因为 Linux 内核 BPF 验证器严格限制了循环展开和堆栈使用,使得在 eBPF 上下文中实现完整的 SHA-256 既不可行又危险。
### 组件
| 组件 | 路径 | 描述 |
|-----------|------|-------------|
| Crypto Core | `internal/crypto/` | X25519 ECDH、HMAC-SHA256、时间哈希链、重放窗口 |
| BPF 层 | `internal/bpf/` | TC 钩点 eBPF 程序(C)和 Go 加载器/映射管理器 |
| Mesh | `internal/mesh/` | UDP 组播对等发现、会话同步、密钥旋转 |
| Policy | `internal/policy/` | YAML 配置、基于 CIDR 的策略评估引擎 |
| Telemetry | `internal/telemetry/` | 结构化日志(slog)、无锁原子指标 |
| API | `pkg/api/` | Unix 套接字 JSON 控制服务器 |
| Client | `pkg/client/` | 控制 API 的 Go 客户端库 |
| Daemon | `cmd/chronosd/` | 主守护进程 |
| CLI | `cmd/chronosctl/` | 命令行接口 |
## 算法
### 时间哈希链
为了验证数据包,ChronosMesh 为传出流量添加一个 48 字节的头部。数据包的完整性和真实性使用加密哈希链进行验证。
每个数据包的 HMAC 基于前一个数据包迭代计算:
`H_n = HMAC(K_session, P_n || H_{n-1} || T_current || SeqID)`
其中:
- `K_session`:通过 X25519 ECDH 和 HKDF-SHA256 派导出的活动 256 位会话密钥。
- `P_n`:当前数据包负载。
- `H_{n-1}`:链中前一个数据包的 HMAC。
- `T_current`:64 位内核时间戳。
- `SeqID`:64 位单调递增序列号。
这种链式机制确保数据包顺序严格绑定在密码学上。
### 重放窗口
因为网络数据包可能乱序到达,ChronosMesh 实现了一个滑动位图重放窗口算法。以 O(1) 时间复杂度运行,该窗口跟踪最高观察到的 `SeqID` 并维护一个 1024 位的先前序列号窗口。任何序列号在窗口尾边缘之外到达的数据包,或其位已被设置,都会被立即丢弃。
## 构建与安装
### 先决条件
- Go 1.21 或更高版本
- Clang 12 或更高版本(BPF 编译必需)
- Linux 内核 5.10 或更高版本(BPF CO-RE 支持必需)
- llvm-strip
### 构建指令
要编译二进制文件和 eBPF 对象:
```
# Compile the BPF C program into an ELF object
./scripts/build_bpf.sh
# Build the userspace daemon and CLI
go build -o bin/chronosd ./cmd/chronosd
go build -o bin/chronosctl ./cmd/chronosctl
```
### 安装
安装脚本编译二进制文件,将它们复制到 `/usr/local/bin`,创建 `/etc/chronosmesh` 配置目录,并注册一个 systemd 服务。
```
sudo ./scripts/install.sh
```
## 用法与命令语法
### 守护进程(`chronosd`)
主守护进程协调加密身份、BPF 生命周期管理和对等发现。它在后台持续运行。
**语法:**
`chronosd [-config path] [-interface name] [-log-level level]`
**标志:**
- `-config `:指定 YAML 配置文件的路径。默认为 `/etc/chronosmesh/default.yaml`。如果文件不存在,守护进程回退到内部默认参数。
- `-interface `:覆盖配置文件中定义的网络接口。如果两处都省略,守护进程自动检测与默认网络路由关联的接口。
- `-log-level `:覆盖日志详细程度。有效选项为 `debug`、`info`、`warn` 和 `error`。
**信号:**
- `SIGTERM` / `SIGINT`:触发优雅关闭。守护进程分离 BPF 程序,排空连接并退出。
- `SIGHUP`:指示守护进程在不终止进程或中断活动会话的情况下从磁盘重新加载配置文件。
### 命令行接口(`chronosctl`)
CLI 通过 UNIX 域套接字与运行中的守护进程交互。
**语法:**
`chronosctl [-socket path] `
**标志:**
- `-socket `:chronosd 控制套接字的路径。默认为 `/var/run/chronosd.sock`。
**命令:**
- `status`:显示守护进程的当前运行状态,包括 BPF 模式(活动或存根)和活动会话计数。
- `peers`:检索当前发现的所有对等方的表格列表,包括它们的网络地址和会话状态。
- `rotate`:强制在所有活动对等会话上立即进行密钥旋转,丢弃当前会话密钥并启动 ECDH 重新协商。
- `metrics`:以 JSON 格式输出原子操作计数器,详细说明数据包摄取、丢弃、HMAC 失败和重放阻塞。
- `reload`:通过 API 触发配置重载,其功能与发送 `SIGHUP` 信号相同。
## 配置
ChronosMesh 使用 YAML 配置文件。以下是支持的参数的详尽列表。
```
# Network interface to attach BPF programs to. Leave empty for auto-detection.
interface: "eth0"
# Frequency of session key rotation. Lower values increase forward secrecy
# at the cost of higher CPU overhead for key derivation.
rotation_interval: 30s
# Duration that old session keys remain valid after a rotation event.
# This accommodates in-flight packets during the rotation window.
grace_period: 5s
# Maximum acceptable clock difference between peers. Packets exceeding
# this threshold are dropped by the eBPF ingress program.
max_clock_skew: 5s
# Location of the UNIX domain socket for the control API.
socket_path: /var/run/chronosd.sock
# Output verbosity.
log_level: info
# Network access policies evaluated top-to-bottom. First match dictates action.
policies:
- name: default-allow
src: "any"
dst: "any"
action: allow
```
## 安全模型
- **零信任默认值:** 每个源自已知对等方的数据包必须拥有有效的、经过加密签名的 Chronos 头部。来自未知 IP 地址的流量未经修改通过,作为可选加入的网络覆盖。
- **向前安全性:** 会话密钥是临时的。它们严格在 `rotation_interval` 旋转。单个会话密钥的泄露仅暴露该有限时间范围内的数据包。
- **重放保护:** O(1) 滑动位图窗口显式丢弃重复的序列号或超出可接受年龄阈值的序列号,完全缓解数据包重放攻击。
- **标准化密码学:** ChronosMesh 避免自定义密码学实现。它严格使用 `golang.org/x/crypto` 库的标准原语,具体使用 X25519 进行密钥交换,使用 HMAC-SHA256 进行身份验证。
## 故障排除
- **BPF 加载失败(存根模式):** 如果守护进程记录“进入存根模式”,表示未能加载 eBPF 对象。确保守护进程以 `root` 身份运行(或具备 `CAP_SYS_ADMIN`、`CAP_NET_ADMIN` 和 `CAP_BPF` 能力),并且内核支持 BPF CO-RE(内核 5.10+)。
- **套接字权限被拒绝:** 如果 `chronosctl` 返回权限错误,请验证执行用户对位于 `/var/run/chronosd.sock` 的 UNIX 域套接字具有读/写权限。
- **时钟偏差丢弃:** 如果对等方成功发现但数据包持续在入口钩点被丢弃,请验证所有参与节点的系统时钟是否通过 NTP 同步。或者,增加 `max_clock_skew` 配置参数。
## 贡献
对 ChronosMesh 的贡献需遵循严格的质量保证标准。
1. **开发环境:** 确保已安装 Go 1.21+ 和 Clang 12+。修改 `internal/bpf/c/` 中的 C 代码需要运行 `go generate ./internal/bpf/...` 以重新生成 Go 绑定。
2. **测试:** 所有拉取请求必须通过单元测试套件和竞态检测器,无错误。执行 `go test ./... -race -count=1`。
3. **性能:** 对热路径数据包处理(密码验证、BPF 映射交互)的修改必须通过基准测试验证以确保零分配合规。执行 `go test ./tests/unit/... -bench=. -benchmem`。
4. **代码风格:** Go 代码必须使用 `gofmt` 格式化。项目严格禁止不必要的动态特性利用和依赖膨胀。
## 许可证
本软件在 MIT 许可证下发布。详见 `LICENSE` 文件。
标签:0day挖掘, Docker镜像, ECDH, EVTX分析, JSONLines, MacOS取证, TC钩子, X25519, 会话密钥轮换, 内核安全, 内核态, 前向安全性, 加密验证, 包级身份, 哈希链, 日志审计, 时间戳, 流量控制, 用户态, 网络安全, 网络边界, 防篡改, 防重放, 隐私保护, 零信任