最后更新: 2026-05-22 | 对应版本: 0.1.3
rust-tokio-supervisor 的安全设计遵循最小暴露、编译期保证、逐层检查原则. 核心监督库在所有 Rust 支持平台上可编译, dashboard IPC(进程间通信) 仅限 Unix 域套接字, 通过 #[cfg(unix)] 在非 Unix 平台编译期排除.
| 维度 | 策略 | 说明 |
|---|---|---|
| 网络暴露 | 目标进程不监听任何 TCP 端口 | 仅 Unix 域套接字 IPC, #[cfg(unix)] 编译期保证 |
| 非 Unix 平台 | Dashboard/IPC 模块编译期排除 | ipc 和 dashboard 模块被剥离, 核心监督能力保持可用 |
| 跨平台替代方案 | 通过 relay 实例间接访问 dashboard | 在 Unix 主机部署 relay, 目标进程通过注册协议连接 |
看板 IPC 配置了 9 项安全控制点, 经 IpcSecurityPipeline 统一编排. C7 审计持久化不在 dashboard.security_config 中重复配置, 它使用顶层 audit 配置.
连接建立
│
▼
C1: Socket Owner (bind 时校验)
│
▼ (每个请求)
C6: Rate Limit ──→ C5: Size Limit ──→ C2: Peer Credentials
│
▼
C4: Replay Protection ──→ C3: Authorization ──→ C8: Idempotency
│
▼
[Dispatch 执行]
│
▼
C7: Audit Persistence
C9: Allowlist (在扩展点上执行, 不属于主线)
| 编号 | 控制点 | 触发时机 | 默认配置 | 绕过后果 |
|---|---|---|---|---|
| C1 | Socket Owner(套接字所有者) | bind() | 进程 UID 与 socket 文件 owner 一致 | 未授权进程可连接 |
| C2 | Peer Credentials(对端身份) | 每个请求 | PeerIdentity 验证 |
身份伪造 |
| C3 | Authorization(命令授权) | 分派前 | IpcMethod + PeerIdentity |
命令越权执行 |
| C4 | Replay Protection(重放防护) | 每个请求 | window=1024, TTL=60s | 重放攻击 |
| C5 | Size Limit(请求大小) | 读取后 | max_bytes=65536 | 缓冲区溢出 |
| C6 | Rate Limit(速率限制) | 每个请求 | 100/s, burst=20 | DoS 攻击 |
| C7 | Audit Persistence(审计持久化) | 分派后 | ring buffer=4096 (内存) | 审计缺失 |
| C8 | Idempotency(幂等键) | 分派前 | cache TTL=60s, max=1024 | 命令重复执行 |
| C9 | Allowlist(白名单) | 扩展点 | 默认空 (禁用) | 未授权外部命令执行 |
任一控制点不达标时, 高风险写指令一律拒绝并写入带流水号的审计条目. 审计卷满载时的策略:
- 默认: fail closed(拒绝高风险写动作)
- 可配置: defer with bounded queue(延迟落盘且有界队列)
- 禁止: 静默丢弃审计条目
| 检查项 | 工具 | 策略 |
|---|---|---|
| 已知漏洞 | cargo audit |
deny (阻断) |
| 许可证合规 | cargo deny check licenses |
allow MIT/Apache-2.0/BSD-3-Clause/ISC/Unicode-3.0/Zlib |
| 安全公告 | cargo deny check advisories |
vulnerability=deny, unsound=deny, yanked=deny |
| 许可证类型 | cargo deny |
copyleft=warn, unlicensed=deny |
发布时生成两份 SBOM:
artifacts/sbom/rust-supervisor.cdx.json— CycloneDX 1.5artifacts/sbom/rust-supervisor.spdx.json— SPDX 2.3
SBOM 包含所有直接依赖和传递依赖, 每条依赖记录版本、许可证、校验和、注册表来源. 拒绝 secret、token、本地绝对路径和构建临时目录进入发布产物.
发布时生成 artifacts/attestation.json, 包含:
- 版本号和 Git commit hash
- 质量门禁结果摘要
- 所有产物的 SHA256 校验和
验证方式: bash scripts/verify-attestation.sh. 比对 artifacts/release-record.json 中登记的哈希值.
- 使用
TaskFailureKind枚举而非字符串表达失败类别, 消除字符串注入风险 - 策略管线产出结构化的
RestartDecision, 不依赖字符串推断 SupervisorEvent是类型化结构体, 非自由格式 JSON
CancellationToken提供单向关闭传播: 父令牌可取消子令牌, 子令牌不可反向取消父令牌mpsc通道承载控制命令,broadcast通道分发事件Mutex保护共享状态,Arc管理所有权- Loom 测试在夜间 CI 中检测并发正确性
#[cfg(unix)]保证 dashboard/IPC 模块不在非 Unix 平台编译unsafe代码仅限 Unix peer credentials(对端凭据) 提取 (已审计, 6 处unsafe调用, 均在peer_identity.rs中)- 禁止 inline unit test 注入生产代码
每个控制命令生成 audit event, 包含:
command_id: 命令唯一标识requested_by: 请求者标识 (非空)reason: 操作原因 (非空)target_path: 目标路径accepted_at: 接受时间result: 执行结果
dashboard:
enabled: true
path: /run/rust-supervisor/target.sock
permissions: "0600" # 仅所有者可读写
bind_mode: create_new # 拒绝覆盖现有 socket (防符号链接攻击)- IPC socket 路径使用绝对路径
- socket 权限设置为
0600(仅进程所有者) -
bind_mode使用create_new拒绝符号链接覆盖 - IPC 注册不使用网络中继
- 审计功能开启 (
audit_enabled: true) - 依赖审计通过 (
cargo audit --deny warnings) - SBOM 校验通过
- 签名标签已验证
| 限制 | 说明 | 缓解措施 |
|---|---|---|
| IPC 仅 Unix | Windows 等非 Unix 平台无法使用 dashboard | 通过 Unix relay 间接访问 |
| 审计持久化默认内存 | AuditBackend 默认使用 ring buffer, 重启丢失 |
配置 audit.backend: file 和 audit.file_path 落盘 |
| 配置不支持热更新 | 修改安全配置需重启 supervisor | 使用配置管理工具自动化重启 |
| 无内置 mTLS | target 侧不处理 mTLS | mTLS 由 relay 侧管理, 参考 rust-supervisor-relay 文档 |
混沌测试套件遵循以下安全约束,确保不会影响生产环境安全:
- 不修改生产代码: 所有混沌场景代码位于
tests/chaos/,仅通过[dev-dependencies]引用,cargo build --release不包含混沌代码。 - 进程级隔离: 混沌 harness 仅通过测试夹具注入故障,不允许修改默认发布二进制行为。宪章要求"混沌 harness 只允许通过测试夹具注入故障"。
- panic 隔离: 子任务 panic 通过
std::panic::catch_unwind捕获。控制循环已配置std::panic::set_hook记录结构化错误并继续执行,不会因子任务 panic 而终止。Spec 中"panic"指 Rust 语言级 panic;进程级崩溃使用"crash"表述。 - 时间隔离: 时钟回拨场景仅模拟 wall clock 回退,不修改系统
CLOCK_MONOTONIC。滑动窗口和熔断器使用std::time::Instant(monotonic clock),不受 wall clock 回退影响。 - 网络隔离: IPC 连接风暴场景使用独立临时 socket 路径,不影响生产 IPC 端点。