WuKongIM 云仿真分析:在本地用加密 Analysis Session 运行 Codex,彻底不落盘任何云端 AI 凭据

📅 发布时间:2026/10/13 1:39:01
WuKongIM 云仿真分析:在本地用加密 Analysis Session 运行 Codex,彻底不落盘任何云端 AI 凭据
即时通讯后端【免费下载链接】WuKongIMMore than just IM 不只是即时通讯(IM)项目地址https://gitcode.com/gh_mirrors/wu/WuKongIM点击查看免费下载导读本文围绕 WuKongIM 仓库中的架构决策记录 ADR-0037Run Codex locally with an encrypted Analysis Session 展开完整讲解其核心设计云仿真Cloud Simulation的分析环节全部在操作者本地机器完成——本地 Codex CLI 通过 ChatGPT 订阅登录云端只充当身份中介cloud-identity brokerGitHub 与云厂商不保存、不执行任何 OpenAI API Key、Codexauth.json或 ChatGPT 会话。读完后你将掌握Analysis Token 的签发与 RSA-OAEP 加密交接协议、本地 Codex 最小权限沙箱的构建方式、analyze.sh/finalize.sh的完整分析流程、结构化 Diagnosis Result 的语义以及可选的独立修复工作流Draft PR如何与云资源清理解耦。为什么要把 Codex 从云端拉回本地在 ADR-0037 之前仓库先后采纳过 0003、0005、0018、0019、0023、0027、0029、0030 等多条 ADR它们共同构成了云上分析、云上诊断、GitHub 持有 API 凭据的早期方案。ADR-0037 一次性取代了这些决策确立了新的边界GitHub 不持有OpenAI API Key、Codexauth.json或 ChatGPT 会话云厂商不执行分析过程只承载被分析的工作负载本身本地机器负责推理、诊断与可选的代码修复云端只做一件事证明身份与存活证据并把一次性的 Analysis Token 加密交给请求方。这套设计的直接收益是无论代码库还是云端流水线泄露攻击者都无法拿到可复用的 AI 凭据AI 分析消耗的是操作者自己的 ChatGPT 订阅额度不依赖任何专用 API 凭据的托管与轮换。Analysis Session 工作流云端只当身份中介ADR-0037 把整个分析会话定义为一条严格的六步流水线Run Locator 校验云端基于 provider inventory云厂商资源清单证明操作者请求的那个精确 Run保留的 Run Locator真实存在GitHub OIDC 交换用 GitHub Actions OIDC 换取一个短期、run 作用域的 Analysis TokenRSA-OAEP 加密交接云端把该 Token 用操作者本地生成的临时公钥按RSA-OAEP SHA-256加密后交付准入窗口云端只在 Token 过期前向请求方客户端的公开/32地址开放 MCP 入口本地持有私钥私钥始终留在本地进程内Token 密文只有本地能解开精确校验本地钉住 run 证书、检出实际部署的源 SHA通过白名单只读 MCP 调用该版本的 Analysis Skill。加密交接的源码落点Token 交换协议的 HTTP 适配器位于 internal/access/cloudanalysismcp/token.goNewTokenExchangeHandler只接受POST先经VerifyGitHub OIDC 校验再调Issue返回access_token、token_type与expires_at。它的测试 token_test.go 验证了方法限制、缺失/非法身份返回 401、会话不可用返回 409 的 fail-closed 语义。会话存储与签发在 cmd/wkanalysis/session.goToken 为 32 字节加密随机数Base64 URL 编码默认有效期45 分钟且被Run Lease 到期前 5 分钟这一上限钳制若 Run Lease 剩余不足 30 分钟则拒绝签发errInvalidAnalysisSession服务端只保存 token 的 SHA-256 摘要签发时顺手清理已过期条目Token不可续期non-renewableVerify只接受仍存活、长度 ≥32 的摘要。TestAnalysisSessionStoreIssuesNonRenewableLeaseBoundTokensession_test.go直接验证了租约 40 分钟 → Token 35 分钟的钳制行为与过期即失效。OIDC 身份校验的严格性OIDC 校验器在 cmd/wkanalysis/oidc.go 中实现了精确声明匹配除了 RS256 签名、Issuerhttps://token.actions.githubusercontent.com、Audience 与过期时间外还逐一比对repository、ref、job_workflow_ref、environment以及两种 subject 之一。配置端oidc.go只接受两类被评审过的会话方言云仿真Audiencewukongim-cloud-sim:run_id工作流cloud-sim-analyze.ymlrefs/heads/ref环境cloud-sim-analysisChat Lifecycle 云租约Audiencewukongim-cloud-lease:run_id工作流cloud-lease-analyze.ymlrefs/heads/ref环境cloud-lease-provision。测试 oidc_test.go 专门验证了交叉环境未评审工作流等组合都会被拒绝JWKS 公钥加载则遵循 fail-closed 且带 10 分钟缓存oidc.go。网关进程wkanalysisAnalysis 网关由 cmd/wkanalysis/main.go 组装启用 OIDC 时创建analysisSessionStore并把sessions.Verify挂到网关的 MCP Token 校验器上同时暴露POST /analysis/token、GET /healthz与GET /self-check后者会主动探测 Prometheus、三个节点与 Manager 的就绪状态。其运行期配置全部来自环境变量核心参数如下环境变量默认值说明WK_ANALYSIS_RUN_ID必填Run 身份缺失即启动失败WK_ANALYSIS_MCP_TOKEN/WK_ANALYSIS_GITHUB_OIDC_*二选一32 字节 MCP Token或 GitHub OIDC 配置组WK_ANALYSIS_SCENARIO_PATH必填生效场景文件要求wkbench/v1且随机种子非零WK_ANALYSIS_SCENARIO_DIGEST可选场景摘要校验不匹配即拒绝启动WK_ANALYSIS_RUN_LOCATOR_PATH可选Run Locator须与WK_ANALYSIS_FAKE_INVENTORY_PATH成对出现WK_ANALYSIS_RUN_EXPIRES_AT当前时间 2hRun Lease 到期须距当前 ≥30 分钟WK_ANALYSIS_TOKEN_EXPIRES_AT45 分钟受租约钳制仅非 OIDC 模式可用不得超过租约前 5 分钟WK_ANALYSIS_LISTEN_ADDR0.0.0.0:19092监听地址MCP 端口 19092Chat Lease 为 19444WK_ANALYSIS_TLS_CERT_FILE/WK_ANALYSIS_TLS_KEY_FILE空云 OIDC 模式强制要求 TLS 证书密钥WK_ANALYSIS_NODE_API_URLS三个默认节点JSON 对象必须同时包含节点 1、2、3WK_ANALYSIS_PROVIDER/WK_ANALYSIS_REGION/WK_ANALYSIS_SOURCE_SHAlocal-compose/local/ 空若提供 Run Locator须与 Locator 完全一致WK_ANALYSIS_MANAGER_BASE_URLhttp://wk-node1:5301Manager 地址WK_ANALYSIS_PROMETHEUS_BASE_URLhttp://prometheus:9090Prometheus 地址配置解析的边界校验如节点 URL 个数、过期时间先后、租约与 Locator 一致性集中在 cmd/wkanalysis/config.go并有 runtime_contract_test.go 逐项覆盖缺场景、摘要不匹配、租约过短、节点 URL 非法等拒绝路径。本地编排入口analyze.sh 与 finalize.sh本地侧的核心编排脚本都位于 scripts/cloud-sim/它们共享 local-runtime.sh 提供的有界进程组执行器wk_run_bounded每条本地命令都落在独立进程组、带墙钟截止时间超时统一返回 124并在退出前强杀整个孤儿组——这是本地编排的安全地基。analyze.sh一次精确 Run 的完整分析analyze.sh 的用法./scripts/cloud-sim/analyze.sh RUN_ID [options] # --repository OWNER/REPO 指定 GitHub 仓库默认从当前 checkout 探测 # --chat-request-id REQUEST_ID 分析精确的 chat-lifecycle Cloud Lease 交接 # --diagnostic-focus TEXT 可选的受限诊断关注点仅作为主题数据不是指令 # --allow-fix-pr 兼容标志修复延后到 provider 资源释放之后 # --result-file ABSOLUTE_PATH 原子写出结构化分析结果一次本地前提gh auth logincodex login选择ChatGPT无需任何 OpenAI API Key。Codex 版本要求 ≥ 0.140.0脚本会从 PATH 与 ChatGPT App 内置路径中挑选最高兼容版本WK_CODEX_BIN可显式覆盖并校验登录态必须是Logged in using ChatGPTanalyze.sh 与 #L726-L750。主流程按顺序执行以下阶段Inspectpreflight通过 GitHub Actions 派发cloud-sim-analyze.yml的inspect操作下载并校验 preflight 描述符。若云厂商已确认released资源为空直接输出已自动销毁并成功退出unknown_run与insufficient_evidence则是不同的显式失败analyze.sh生成临时密钥openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072生成本地私钥analyze.sh确认本机公网 IPv4通过公网 echo 服务或同主机 Cloud View 状态接口探测随后把client_ipv4与client_public_key作为prepare操作的输入派发——云端据此只向该/32开放入口。若同主机探测发现出口 IP 不一致脚本会执行一次close → rebind → prepare重绑定analyze.sh准备会话并解密 Token下载session.json、encrypted-token.bin、pinned-ca.pem校验 MCP URL 精确匹配https://公网IP:19092/mcp、CA 指纹为sha256:...然后用私钥执行pkeyutl -decrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256解密 Token解密成功后立即删除私钥与密文文件analyze.sh健康探测绕开代理直连--noproxy *并使用钉住的 CA 证书12 次尝试确认healthz返回.statusok且run_id匹配#L795-L825本地桥接go build编译 cmd/wkcloudanalysisbridge在127.0.0.1随机端口发布一个仅回环的 MCP 反向代理#L827-L847检出精确源确保本地已有source_sha缺失则无凭据提示地静默 fetch 一次git worktree add --detach检出部署版本然后拒绝项目级 Codex 覆盖——若 worktree 中存在.codex/config.toml或.codex/hooks.json直接失败#L849-L856函数见 #L171-L179启动隔离的 Codexenv -i清空调用方环境仅注入PATH、私有HOME、CODEX_HOME与WK_ANALYSIS_MCP_TOKEN--ephemeral --ignore-user-config --ignore-rules --strict-config并通过严格权限配置把文件系统限制为:minimalread workspace 根只读、network.enabledfalse、shell_environment_policy.inheritnoneMCP 服务器只允许 14 个白名单只读工具#L863-L900Schema 校验用wkclouddiagnosis validate对 JSON Schema 做严格校验并核对run_identityrun_id/source_sha/scenario_digest与会话一致#L934-L947随后显式 close 会话、原子写出--result-file。# 关键 Codex 调用节选自 analyze.sh字段语义不变 env -i PATH$PATH HOME$analysis_home CODEX_HOME$local_codex_home \ WK_ANALYSIS_MCP_TOKEN$analysis_token \ $codex_bin exec --ephemeral --ignore-user-config --ignore-rules --strict-config \ -C $analysis_worktree \ -c default_permissionscloud-analysis \ -c permissions.cloud-analysis.filesystem{:minimalread,:workspace_roots{.read}} \ -c permissions.cloud-analysis.network.enabledfalse \ -c shell_environment_policy.inheritnone \ -c shell_environment_policy.set{PATH...,HOME...} \ -c mcp_servers.wukongim_cloud_analysis.urlhttp://127.0.0.1:PORT/mcp \ -c mcp_servers.wukongim_cloud_analysis.bearer_token_env_varWK_ANALYSIS_MCP_TOKEN \ -c mcp_servers.wukongim_cloud_analysis.requiredtrue \ -c mcp_servers.wukongim_cloud_analysis.startup_timeout_sec10 \ -c mcp_servers.wukongim_cloud_analysis.tool_timeout_sec70 \ -c mcp_servers.wukongim_cloud_analysis.enabled_tools[...14 个只读工具...] \ --output-schema $REPO_ROOT/.github/cloud-sim/diagnosis.schema.json \ -o $diagnosis_json $prompt本地桥接为何需要钉住证书cmd/wkcloudanalysisbridge 的职责是让 Codex 只需连本地回环地址由桥接转发到云端精确端点。它做了四重收紧只接受 HTTPS 上游且主机必须是一个全局公网 IPv4拒绝私网、回环、链路本地、多播端口只能是 19092 或 19444main.go证书精确钉住TLS 握手时用 SHA-256 指纹比对叶子证书、校验有效期窗口与 IP SAN而不是依赖系统信任链main.go剥离转发头清除Forwarded/X-Forwarded-*防止放大攻击面回环监听仅绑定127.0.0.1:0不接收任何远程绑定参数。其边界测试 main_boundary_test.go 验证了指纹不匹配、IP SAN 错误、证书过期分别失败且错误响应绝不泄露上游细节#L182-L206。FLOW 文档 cmd/wkcloudanalysisbridge/FLOW.md 对边界做了补充说明。Diagnosis Result有结构、有身份、语义明确Codex 的输出必须落到 .github/cloud-sim/diagnosis.schema.json 定义的wukongim/cloud-simulation-diagnosis/v1结构里字段完全封闭additionalProperties: false。关键语义由 analyze.sh 的 prompt 强制verdictseverityroot_cause_scope是否可修复healthynonenone否insufficient_evidencenoneunknown否product_defect非 noneproduct是唯一可修复infrastructure_interrupted非 noneinfrastructure否scenario_invalid非 nonescenario否observation_references中只有workload_inspect工具可携带state/status且遵循completed必须completetrue其他工具一律为null。这份结果是已完成命令completed command——无论 verdict 如何只要身份匹配并通过 schema 校验就算成功完成只有 Session preflight 失败、超时、schema 非法、身份不匹配才构成非零退出。健康与否只由结构化 verdict 确立。Schema 校验器是 cmd/wkclouddiagnosis/main.gowkclouddiagnosis validate FILE底层走 internal/usecase/cloudanalysis 的DecodeDiagnosisResult。finalize.sh等待、重试、然后证明账单已停Provision供给阶段还会发布一份最小的非诊断型 Finalization Schedulewukongim/cloud-simulation-finalize/v1含active_until/analysis_ready_at/expires_at三个有序截止时间。finalize.sh 的流程./scripts/cloud-sim/finalize.sh RUN_ID [--repository OWNER/REPO] [--diagnostic-focus TEXT] [--allow-fix-pr] # 前提gh auth login全程无需 OpenAI API Key保持本命令在本地运行下载并校验 Finalization Schedulewait_until等待第一个有界的分析时间窗复用同一个加密 Analysis Session 调用analyze.sh尝试终态分析若校验后的workload_inspect状态仍是in_progress且租约还能安全接纳下一次会话则保留 run 并在 60 秒后重试minimum_retry_lease_seconds2100即重试前必须给后续清理留足时间余量无论分析成功与否随后必定执行精确 Cleanup派发cloud-sim-cleanup.yml带run_id与finalize-hex关联 ID停止计费再通过analyze.sh的 released 形态做独立 provider 释放验证要求结构化结果满足.statereleased .provider.statereleased .provider.resources[]若 provider 已确认released自动销毁则打印终态提示并在 Codex 运行前成功退出——unknown_run与活证据不可达仍是两种不同的失败诊断失败或可选修复失败不会抑制清理而 provider 已确认释放的 run 则直接终止、不再发起第二次清理请求。中途 Ctrl-CHUP/INT/TERM也不会跳过计费兜底信号处理器会把精确清理标记为必需EXIT 陷阱确保清理与释放验证在退出前完成finalize.sh 与 #L256-L277。即使本地清理全部失败远端租约与定时 sweeper 仍是最后一道账单防线。可选修复与诊断完全隔离的独立进程修复只在访问确认关闭之后才开始并且运行在独立的本地 worktree 与独立的 Codex 进程隔离的HOME且没有 GitHub 凭据、云身份、MCP 配置或 Analysis Token严格权限只写修复 worktree 与隔离的 Go cache/temp 根只读测试所需的 Go 工具链/模块缓存禁用工具网络访问。修复的门槛是高置信度的、可归因于仓库的产品缺陷 回归覆盖对应 Diagnosis Result 中的remediation_eligibilityrepository_attributable与testable都为真。本地编排绝不以操作者主机权限直接执行生成测试它先推送受保护分支等待该精确 commit 通过仓库既有的只读 CI Workflow然后才打开一个正确标注的 Draft PRPR 正文不含任何模型生成的诊断文本且自动合并始终被禁止。这也是--allow-fix-pr被标为兼容标志的原因修复天然延后到付费资源清理完成之后。安全模型小结与可验证依据把 ADR-0037 与实现对照可以归纳出四层防护凭据不落盘云端只经 RSA-OAEP 交付一次性 Token本地解密后立即删除私钥与密文GitHub 无 API Key、无auth.json、无 ChatGPT 会话访问窗口有界Token ≤45 分钟且受租约钳制、只对请求方/32开放、不可续期、有独立 close 操作与窗口过期兜底分析沙箱最小权限env -i 只读 worktree 禁网 只读工具白名单 拒绝项目级.codex配置覆盖fail-closed清理不可绕过诊断/修复失败不抑制清理Interrupt 也不抑制清理最终以 provider 确认的空资源清单作为账单已停的证据。想深入验证上述事实可以直接阅读决策记录docs/adr/0037-run-codex-locally-with-an-encrypted-analysis-session.md网关与会话cmd/wkanalysis/main.go、cmd/wkanalysis/session.go、cmd/wkanalysis/oidc.go、cmd/wkanalysis/config.goToken 交换internal/access/cloudanalysismcp/token.go本地编排scripts/cloud-sim/analyze.sh、scripts/cloud-sim/finalize.sh、scripts/cloud-sim/local-runtime.sh证书钉住桥接cmd/wkcloudanalysisbridge/main.go 与其测试 main_boundary_test.go结果契约.github/cloud-sim/diagnosis.schema.json、cmd/wkclouddiagnosis/main.go工具链固定.github/cloud-sim/toolchain.envGo 1.25.11、GitHub CLI 2.96.0 等均带 SHA-256 校验相关 ADR 时间线可参考 docs/adr/0037 的 supersedes 列表以及同目录下的 0040-separate-deployment-from-cloud-lease-lifecycle.md、0044-use-separate-deployment-and-codex-ssh-identities.md、0047-retain-one-lease-across-deployment-repair.md 等后续演进。赞分享即时通讯后端【免费下载链接】WuKongIMMore than just IM 不只是即时通讯(IM)项目地址https://gitcode.com/gh_mirrors/wu/WuKongIM点击查看免费下载相关推荐WuKongIM 云仿真分析边界只分析仍在运行的 Simulation Run 及其释放证据机制WuKongIM 云仿真分析边界只分析仍在运行的 Simulation Run 及其释放证据机制 导读 本文围绕 WuKongIM 仓库中的架构决策记录即时通讯后端WuKongIM 云仿真诊断架构解析Analysis MCP 与 Analysis Skill 的职责分离设计WuKongIM 云仿真诊断架构解析Analysis MCP 与 Analysis Skill 的职责分离设计 云仿真压测Cloud Simulation即时通讯后端WuKongIM 云端仿真 Analysis MCPrun-scoped 窄工具契约的设计与实现WuKongIM 云端仿真 Analysis MCPrun scoped 窄工具契约的设计与实现 导读 本文围绕 WuKongIM 仓库中已接受的架构决策记录即时通讯后端上一篇rust-cpython 跨平台部署指南Windows、Linux与macOS的完整解决方案下一篇Cruise Control for Apache Kafka 使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考