浏览 AI 知识库
API Key 怎么放环境变量:避免进入仓库、构建产物和日志
把 API Key 放进环境变量只是第一步。仓库历史、构建日志、错误日志和前端产物仍可能泄漏秘密,需要逐处检查并准备轮换。
按实际操作顺序推进
每完成一段就检查当前输出,确认结果符合预期后再继续。
密钥已经移进 .env,为什么仍然可能泄漏
API Key 已从代码移到 `.env`,但 `.env` 被提交,构建日志又打印了完整请求头。所谓使用环境变量并没有消除泄漏。
- 源码、历史、日志和产物均已扫描
- 不同环境使用不同最小权限凭证
- 轮换与撤销流程已验证
动手前,把材料和不能改的部分定下来
| 需要确认 | 本例内容 |
|---|---|
| 现有材料 | Node 项目、Git 仓库、CI 和 Docker 镜像;凭证分开发、本地测试和生产三套。 |
| 不能越过的边界 | 密钥不进入源码、历史、镜像、前端包、日志和截图;生产使用受控 secret store;发现泄漏先撤销轮换。 |
| 要交付的结果 | 密钥位置清单与泄漏检查结果 |
API Key 怎么放环境变量,从“分类与最小权限”开始做
分类与最小权限
记录每个密钥的服务、环境、所有者、scope、有效期和可执行动作,开发与生产分离。
选择存储位置
本地使用受控配置或密钥管理,CI/CD 使用平台 secrets,生产使用适当的密钥服务;不写入仓库。
阻止进入前端和构建
检查打包变量前缀、静态产物、source map、容器层和配置模板,任何浏览器可见值都视为公开。
清理日志和错误
对请求头、连接串、URL 参数和异常对象脱敏,禁止调试打印完整环境。
扫描与轮换演练
扫描历史、产物和日志;发现泄漏先撤销轮换,再清历史与缓存,记录影响。
一次 API Token 泄漏,先撤销再清理历史
| 阶段 | 实际检查 | 证据 | 决定 |
|---|---|---|---|
| 发现 | 构建产物和日志出现 token 片段 | 扫描结果、时间和版本 | 立即停止继续传播 |
| 撤销 | 服务端吊销旧 Token,生成最小 scope 新值 | 吊销回执和新版本 | 旧值不再可用 |
| 清理 | 历史提交、缓存、source map、镜像层 | 扫描前后差异 | 不把‘删当前文件’当完成 |
| 防复发 | 日志脱敏、CI secret、提交钩子和轮换日期 | 自动扫描和演练记录 | 明确责任人和到期时间 |
Token 和服务名为演示;真实泄漏按组织事件响应流程处理。
完成后的密钥位置清单与泄漏检查结果
位置清单记录本地 `.env.local`(gitignored)、CI secret 和生产 secret;构建产物与 Git 历史扫描无明文。日志中 Authorization 被遮罩;测试 Key 轮换后旧 Key 返回 401,新 Key 仅有最小 scope。
为什么“仓库扫描无密钥,浏览器仍能看到 Key”还不能交付
仓库扫描无密钥,浏览器仍能看到 Key
- 原因
- 变量被注入前端构建或接口返回
- 怎么改
- 检查最终 JS 包和网络请求,服务器端代理敏感调用,立即轮换已暴露凭证
