密钥与敏感信息卫生
一句话定义
密钥卫生的三条防线:密钥不进提示词、AI 产出中只允许占位符、提交前自动扫描;配套泄露应急四步——作废、轮换、排查、复盘。
为什么重要
AI 工作流创造了三条新的泄露路径:你把密钥贴进对话或让 Agent 读取含密钥的文件(密钥离开本机进入服务端上下文);AI 把真实密钥「顺手」写进代码、测试或日志(它见过大量带真实密钥样式的训练数据,可能补全出「很像真的」字符串——甚至偶发补全出真实有效的旧密钥);含密钥的文件被 Agent 改动后随提交入库。密钥泄露的代价直接而巨大:云账单、数据外泄、供应链横向渗透。卫生纪律的成本极低,必须成为肌肉记忆。
前置知识
kp-021(审查清单第二层)、kp-018(Agent 对凭据文件的读取权限)。
核心概念
- 防线一 · 不进上下文:密钥不贴进任何提示词;含密钥文件(.env 等)加入 Agent 拒读清单;调试报错先脱敏再投喂(kp-014 四件套要过一遍扫描)。
- 防线二 · 产出占位符化:示例代码一律
<YOUR_API_KEY>形式;规则文件写明「禁止在任何输出中出现真实密钥」;审查清单第二层固定检查。 - 防线三 · 扫描兜底:pre-commit 钩子与 CI 跑密钥扫描工具(gitleaks/trufflehog 类),模式覆盖常见密钥格式;扫描是兜底不是第一道防线。
- 应急四步:①立即作废泄露密钥(不等排查)②轮换所有相关凭据 ③排查泄露窗口(日志/会话历史/仓库历史)④复盘路径并补防线。
原理与机制
三道防线的排序遵循「泄露成本递增」:拦截在上下文之外成本为零;产出端占位符化把成本控制在审查阶段;扫描兜底捕获前两道漏网。应急流程把「作废」放在「排查」之前,因为排查需要时间而密钥每分钟都在风险中——先止血后侦查。另一个机制要点:模型可能生成出与真实密钥格式一致的字符串(训练数据中存在大量泄露密钥样例),「看起来是编的」不能作为安全判断,一切疑似真实凭据的字符串都按真实处理。
实例或案例
操作步骤(接入 AI 工作流时的密钥体检):
- 列出工作目录中的敏感文件(.env、凭证 JSON、kubeconfig),全部移出 Agent 可读范围或加入拒读。
- 检查规则文件:是否有「禁止输出真实密钥」「示例一律用占位符」两条。
- 安装 pre-commit 密钥扫描,跑一次全仓历史扫描,清理存量。
- 演练一次应急四步(在测试密钥上),确认每人知道第一步是「作废」。
排错清单(发现密钥已进入 AI 上下文或代码):
- 立即在服务商控制台作废该密钥——不是改代码,是先杀权限。
- 轮换:所有共用该密钥环境/服务的凭据全部换新。
- 排查窗口:会话是否上传过(看服务端数据政策)、仓库历史是否含它(git 历史要过滤重写或作废仓库)、日志与工单是否引用。
- 复盘:哪道防线失守?把对应规则升级(拒读清单、扫描模式、提示纪律)。
- 若 Agent 曾带密钥执行过网络请求 → 按已外发处理,扩大轮换范围。
公式或模型
本节不适用:安全无量化模型;「泄露密钥存活时间」应趋近于零,作废速度是唯一值得追踪的数字。
图示
生成侧防线 提交侧防线 事故侧
密钥不进提示 ─▶ 产出占位符化 ─▶ pre-commit 扫描 ─▶ CI 扫描
(拒读清单) (审查第二层) (历史扫描) │泄露
▼
作废 → 轮换 → 排查 → 复盘直观类比
像家里钥匙管理:钥匙不给陌生人(不进提示)、备用钥匙只留假钥匙占位(占位符化)、出门前摸一遍口袋(扫描)——发现丢钥匙第一件事是换锁(作废),而不是回忆丢在哪。
常见误区
- 「只是本地模型/本地会话,贴一下没关系」:上下文可能被记录用于改进服务;本地 Agent 还可能把密钥写进日志与文件。
- 「AI 生成的那串是假的」:疑似真实的凭据一律按真实处理,先作废再说。
- 扫描工具是唯一防线:它兜底捕获的是「格式可识别」的密钥,自定义格式的凭据只有前两道防线能拦。
与其他知识点的关系
kp-018 的凭据风险面是权限层实现;kp-014 投喂调试材料前的脱敏动作属于防线一。
自测题
要点:不进上下文、产出占位符化、扫描兜底;密钥每分钟都在风险中,先止血(作废)后侦查(排查)。
要点:模型可能补全出格式一致甚至真实有效的凭据;外观判断不可靠,作废成本低而泄露代价高。
- 三道防线是什么?为何作废排在排查之前?
- 为什么「疑似真实的字符串一律按真实处理」?
延伸阅读
本节不适用:具体扫描工具用法差异大,本节只固化跨工具的三防线与应急序列。