安全模型
默认只读、明确授权、序列化执行和可恢复证据。
内容经过人工双语校对
opsctl 的安全目标不是“自动完成更多操作”,而是让每一步都拥有明确的目标、边界、恢复路径和责任人。
默认只读
大多数检查命令只读取 registry、state 和系统观察结果。具备写入能力的子命令通常要求显式 --execute,并在执行前输出相同参数的计划。
opsctl backup plan <service-id> --dry-run --json
opsctl backup run <service-id> --json
# 只有经过审查后才使用 --execute三种决策
| 状态 | 含义 | 下一步 |
|---|---|---|
passed | 当前事实满足策略 | 可以继续下一个受控阶段 |
needs_approval | 风险可解释,但需要具体人工授权 | 创建作用域匹配的审批请求 |
blocked | 缺少证据、存在冲突或操作被禁止 | 修复前置条件,不应绕过 |
审批不是万能令牌
有效审批必须绑定计划、风险作用域、审批人和有效期。泛化的“全部同意”不能满足执行门禁。执行阶段会重新计算当前 readiness,避免使用过期 preflight 结论。
全局串行锁
所有会修改 opsctl 状态或备份历史的操作共享一个全局 advisory lock:
- 交互命令默认快速失败,防止操作员误以为命令正在排队。
- 经过审查的 systemd 定时任务可以使用有限等待。
- 等待有硬上限,锁文件不会被删除或替换。
破坏性边界
永久边界
清理工作流可以收集证据、生成请求并记录人工交接,但不能批准自己,也不能删除 Docker 卷。MCP 始终只读。
凭据与日志
- 凭据文件必须限制权限;生产推荐
root:opsctl、模式0600。 - JSON 输出和审计日志只显示变量名与经过清洗的失败分类。
- 临时签名、归档和恢复目录使用 create-new 语义,并拒绝符号链接逃逸。