Частые вопросыОпубликовано: 14.08.2026• 0 просмотров
API Key 泄露了怎么办?止损清单和预防方案(2026 应急手册)
密钥误发群聊、出现在截图或提交到 GitHub 后的完整应急流程:60秒止损清单、账单异常排查、Git历史清理、盗刷索赔方法、自动化预防工具。
核心原则:先撤销,后调查
时间就是金钱:密钥泄露后,每拖延 1 分钟,都可能被扫描工具发现并开始盗刷。
止损优先级:
- 0-60 秒:撤销密钥(最高优先级)
- 1-5 分钟:查看账单,确认损失
- 5-30 分钟:创建新密钥,恢复服务
- 30 分钟-1 小时:清理泄露来源
- 1 小时后:联系服务商,申请赔偿(如果有)
60 秒止损清单
API Key 紧急轮换流程
第 1 步:立即撤销密钥(20 秒)
操作路径:
- 登录服务商控制台(
platform.openai.com/console.anthropic.com/ 中转站后台) - 进入 API Keys 或 密钥管理 页面
- 找到泄露的密钥(根据备注或创建时间)
- 点击 撤销(Revoke) 或 删除(Delete)
- 确认操作
关键:
- ✅ 不要等确认"有没有人看到"再撤销
- ✅ 撤销密钥会立即失效,正在进行的请求会中断
- ❌ 只修改账户登录密码不能让旧密钥失效
第 2 步:降低消费上限(20 秒)
目的:如果有多个密钥,不确定哪个泄露了,先锁死账户总额度。
操作:
- 控制台 → 账户设置 或 Billing
- 找到 消费上限(Spending Limit) 或 每月限额
- 临时设置为 当前已用额度 + ¥10
示例:
当前本月已消费:¥50
临时设置上限:¥60
效果:只能再花 ¥10,超过后自动停止服务
第 3 步:暂停高风险任务(20 秒)
如果你有自动化脚本、定时任务、服务器上运行的应用:
立即执行:
# 停止相关服务
systemctl stop my-api-service
# 或杀掉进程
pkill -f my_script.py
或者:
- 暂停 GitHub Actions 工作流
- 停止云函数(Lambda、Cloud Functions)
- 禁用定时任务(Cron Job)
<div class="mermaid-diagram">
flowchart TD
A[发现泄露] --> B[立即行动<br/>5分钟内]
B --> C1[禁用泄露的Key]
B --> C2[检查使用记录]
B --> C3[评估影响范围]
C1 --> D[创建新Key]
C2 --> E{发现异常调用?}
C3 --> F[计算损失金额]
E -->|是| G[导出调用日志]
E -->|否| H[继续监控]
G --> I[分析攻击者IP/特征]
F --> J[联系服务商]
D --> K[更新生产环境]
I --> L[加入黑名单]
J --> M[申请退款/补偿]
K --> N[验证服务恢复]
L --> O[复盘总结]
M --> O
N --> O
API Key 泄露应急响应流程
</div>详细应急流程
配置异常用量告警
第 4 步:保存证据并核对账单(5 分钟)
记录泄露信息
必须记录:
- 泄露发生时间:2026-08-15 14:30
- 泄露位置:微信群 / GitHub 仓库 / 截图
- 密钥末四位:
...aB3d(不要记录完整密钥) - 泄露范围:50 人的微信群 / 公开仓库 / 私密聊天
截图保存:
- 泄露时的聊天记录或代码截图
- 当时的时间戳
- 账单异常记录
导出账单明细
操作:
- 控制台 → Usage 或 账单明细
- 筛选时间范围:泄露前 1 小时到现在
- 导出 CSV 或 Excel
重点检查:
| 检查项 | 正常 | 异常(盗刷迹象) |
|---|---|---|
| 请求时间 | 你的正常工作时间 | 凌晨 3:00-5:00(你在睡觉) |
| 模型 | 你常用的模型 | 从未用过的模型(如 Dall-E、TTS) |
| Token 用量 | 每次 500-2000 Token | 每次 10,000+ Token(刷上限) |
| 请求频率 | 每分钟 5-10 次 | 每秒 10+ 次(脚本批量) |
| IP 地址 | 你的 IP | 陌生国家/地区的 IP |
计算损失金额
泄露前 1 小时账单:¥5.00
泄露后到撤销密钥:¥120.00
可疑消费:¥120.00 - ¥5.00 = ¥115.00
保存:
- 导出的账单明细 CSV
- 异常请求的 Request ID
- 损失金额计算过程
第 5 步:创建新密钥并恢复服务(10 分钟)
原则:一应用一密钥
错误做法 ❌:
旧密钥:sk-old-xxx(用于所有应用)
新密钥:sk-new-xxx(继续用于所有应用)
正确做法 ✅:
Chatbox:sk-chatbox-xxx
VS Code:sk-vscode-xxx
自动化脚本:sk-script-xxx
测试环境:sk-test-xxx
创建新密钥的配置
必须设置的限制:
-
备注名称:
Chatbox - 个人电脑 - 2026-08-15 -
额度限制:
每日上限:¥10 或每月上限:¥100 -
模型限制(如果平台支持):
仅允许:gpt-4o, claude-3.5-sonnet 禁止:dall-e-3, tts-1(防止被用于生成图片/语音) -
IP 白名单(可选,适合固定 IP):
仅允许:123.45.67.89(你的家庭 IP)
逐项恢复服务
优先级排序:
- 最高优先级:正在给客户提供服务的生产环境
- 高优先级:个人工作主力工具(VS Code、Chatbox)
- 中优先级:自动化脚本、定时任务
- 低优先级:测试环境、实验性项目
恢复步骤:
- 创建新密钥
- 替换应用中的密钥
- 测试 1-2 个请求,确认正常
- 恢复下一个应用
第 6 步:清理泄露来源(30 分钟)
场景 1:误发到聊天工具(微信、Telegram、Slack)
操作:
- 立即撤回消息(如果在 2 分钟内)
- 通知群成员:
【紧急】刚才不小心发了一个 API 密钥, 已撤销,请大家不要使用。如果保存了请删除。 - 删除聊天记录(对方也要删除)
- 更换密钥(已在第 5 步完成)
风险:
- ✅ 私密聊天(1 对 1):风险较低
- ⚠️ 小群聊(< 10 人):中等风险
- ❌ 大群聊(> 50 人):高风险,密钥必须撤销
场景 2:出现在截图或文档中
操作:
-
删除截图:
- 删除本地文件
- 删除云盘备份
- 删除分享链接
-
检查传播范围:
- 谁看到了这个截图?
- 是否被转发到其他群?
- 是否被上传到公开网站?
-
更换密钥(已完成)
预防:
- 截图前用马赛克遮住密钥
- 使用专门的截图工具自动遮挡敏感信息
场景 3:提交到 Git 仓库
这是最危险的场景,因为:
- Git 历史永久保留密钥
- GitHub 有自动扫描工具,秒级发现密钥
- 即使删除文件,历史记录中仍然存在
立即操作:
-
撤销密钥(已完成)
-
从当前代码中移除:
# 删除硬编码的密钥 git rm config.py git commit -m "Remove leaked API key" git push -
检查 Git 历史:
# 搜索密钥在哪些提交中出现 git log -S "sk-proj-" --all -
清理 Git 历史(可选,复杂且有风险):
方法 A:使用 BFG Repo-Cleaner:
# 下载 BFG wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar # 清理包含密钥的文件 java -jar bfg-1.14.0.jar --delete-files config.py my-repo.git # 清理 Git 引用 cd my-repo git reflog expire --expire=now --all git gc --prune=now --aggressive # 强制推送 git push --force方法 B:使用 git-filter-branch:
git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch config.py" \ --prune-empty --tag-name-filter cat -- --all git push --force --all⚠️ 警告:强制推送会改写历史,影响所有协作者。谨慎使用。
-
通知协作者:
密钥已泄露并撤销,请大家执行: git fetch --all git reset --hard origin/main
场景 4:部署环境(服务器、云函数)
检查清单:
-
环境变量:
# 检查是否有硬编码密钥 grep -r "sk-proj-" /var/www/myapp/ -
配置文件:
cat /etc/myapp/config.ini cat ~/.env -
构建日志:
- GitHub Actions → 查看 Workflow 日志
- CI/CD 平台 → 查看构建输出
-
容器镜像:
# 如果密钥被打包到 Docker 镜像 docker rmi myapp:latest # 重新构建,使用环境变量传递密钥
第 7 步:联系服务商(1 小时后)
何时需要联系客服
- 发现大量非本人消费(> ¥100)
- 账单中有陌生的请求 ID
- 怀疑密钥被自动扫描工具盗刷
- 希望申请赔偿或减免
提供的信息
应该提供 ✅:
- 泄露发生时间:2026-08-15 14:30-14:45
- 密钥末四位:
...aB3d - 异常消费金额:¥115.00
- 异常请求 ID:
req-abc123,req-def456 - 异常时间段:14:35-14:40(你当时不在电脑前)
- 已采取的措施:已撤销密钥、已创建新密钥
不要提供 ❌:
- ❌ 完整 API Key
- ❌ 账户密码
- ❌ 其他密钥的完整内容
申请赔偿的可能性
| 平台类型 | 赔偿可能性 | 条件 |
|---|---|---|
| OpenAI 官方 | 低 | 通常不赔偿,但可以尝试申诉 |
| Anthropic 官方 | 低 | 同上 |
| 中转站 | 中 | 部分平台有"盗刷险"或赔偿政策 |
| 企业账户 | 高 | 如果有正式协议,可协商赔偿 |
成功案例:
- 用户在 GitHub 公开仓库泄露密钥,24 小时内被盗刷 ¥2000
- 提供了详细的时间线和证据
- 中转站同意赔偿 50%(¥1000)
失败案例:
- 用户将密钥分享给朋友,朋友使用后产生费用
- 平台认为是"授权使用",拒绝赔偿
泄露后的风险评估
检查可疑的调用记录
低风险场景
- 误发到 1 对 1 私密聊天,对方可信
- 出现在私有仓库(仅团队成员可见)
- 泄露时间 < 5 分钟,立即撤销
行动:
- 撤销密钥
- 创建新密钥
- 监控账单 24 小时
中风险场景
- 误发到小群聊(< 10 人)
- 出现在截图中,被少数人看到
- 提交到私有仓库,但有外部协作者
行动:
- 立即撤销密钥
- 通知相关人员
- 监控账单 7 天
- 检查是否有异常消费
高风险场景
- 提交到 GitHub 公开仓库
- 误发到大群聊(> 50 人)
- 出现在公开博客、论坛、社交媒体
行动:
- 立即撤销密钥(0 秒容忍)
- 降低账户消费上限
- 清理 Git 历史(如果在 GitHub)
- 监控账单 30 天
- 准备向服务商申诉
- 考虑更换账户(如果损失巨大)
<div class="mermaid-diagram">
graph LR
A[检测方法] --> B[主动检测]
A --> C[被动监控]
B --> B1[GitHub扫描]
B --> B2[代码审查]
B --> B3[依赖检查]
C --> C1[用量异常]
C --> C2[IP异常]
C --> C3[调用模式异常]
B1 --> D[GitGuardian]
B2 --> D[SonarQube]
C1 --> E[实时告警]
C2 --> E
C3 --> E
style E fill:#ef4444
style D fill:#10b981
泄露检测方法
</div>预防措施
导出详细用量报告用于分析
1. 一应用一密钥
目的:缩小事故影响范围。
示例:
Chatbox:sk-chatbox-xxx(每日 ¥10 上限)
VS Code:sk-vscode-xxx(每日 ¥20 上限)
生产服务器:sk-prod-xxx(每日 ¥100 上限)
测试环境:sk-test-xxx(每日 ¥5 上限)
好处:
- Chatbox 密钥泄露,不影响生产服务器
- 发现异常消费,立即定位是哪个应用
2. 设置额度上限
个人账户:
单个密钥:每日 ¥10 或每月 ¥100
账户总额度:每月 ¥500
企业账户:
测试密钥:每日 ¥20
生产密钥:每日 ¥500
账户总额度:每月 ¥10,000
3. 启用消费提醒
推荐配置:
- 单日消费 > ¥50 → 邮件提醒
- 单日消费 > ¥100 → 短信提醒
- 余额 < ¥10 → 邮件提醒
4. 使用环境变量
❌ 错误做法:
# config.py
API_KEY = "sk-proj-abc123..." # 硬编码,容易泄露
✅ 正确做法:
# config.py
import os
API_KEY = os.getenv("OPENAI_API_KEY") # 从环境变量读取
# .env 文件(不要提交到 Git)
OPENAI_API_KEY=sk-proj-abc123...
# .gitignore
.env
config.local.py
secrets/
5. 使用密钥管理工具
个人用户:
- 1Password:密钥存储和自动填充
- Bitwarden:开源密码管理器
- 系统钥匙串(macOS Keychain、Windows Credential Manager)
企业用户:
- HashiCorp Vault:企业级密钥管理
- AWS Secrets Manager:云端密钥存储
- Azure Key Vault:微软云密钥服务
6. 启用 Git 密钥扫描
GitHub:
- 仓库 Settings → Security → Secret scanning(自动启用)
- 发现密钥会立即发邮件警告
GitLab:
- 需要手动配置 Secret Detection
本地检查:
# 安装 gitleaks
brew install gitleaks
# 扫描仓库
gitleaks detect --source . --verbose
7. 截图前遮挡敏感信息
工具推荐:
- Snipaste(Windows/Mac):截图后可编辑,添加马赛克
- Xnip(Mac):自动识别并遮挡敏感信息
- ShareX(Windows):自动模糊指定区域
手动检查:
- API Key
- 邮箱地址
- 用户名
- IP 地址
- 内部域名
真实案例
案例 1:GitHub 公开仓库泄露
情况:
- 开发者将含密钥的
config.py提交到公开仓库 - 5 分钟后,GitHub 扫描到密钥并发邮件警告
- 10 分钟后,自动化脚本开始盗刷
- 24 小时后发现,已损失 ¥2000
教训:
- ✅ 使用
.gitignore排除配置文件 - ✅ 提交前用
gitleaks扫描 - ✅ 启用 GitHub Secret Scanning
案例 2:微信群误发密钥
情况:
- 用户本想发一段代码,复制时多选了
.env文件内容 - 粘贴到 50 人的技术群
- 1 分钟后发现,立即撤回
- 但已有 3 人看到并截图
结果:
- 密钥被其中 1 人用于测试,产生 ¥5 费用
- 幸好及时撤销,未造成大损失
教训:
- ✅ 粘贴前检查内容
- ✅ 使用专门的代码分享工具(Gist、Pastebin)
案例 3:外包团队泄露
情况:
- 企业将密钥提供给外包团队
- 外包团队离职员工将密钥保存在个人电脑
- 3 个月后,该员工用密钥测试自己的项目
- 企业发现异常消费 ¥500
教训:
- ✅ 项目结束后立即撤销密钥
- ✅ 不要共享主密钥,使用子账户或临时密钥
- ✅ 定期审计密钥使用情况
预防措施检查清单
| 措施 | 优先级 | 难度 | 效果 | 成本 |
|---|---|---|---|---|
| 使用环境变量 | ⭐⭐⭐⭐⭐ | 低 | 高 | 免费 |
| .gitignore配置 | ⭐⭐⭐⭐⭐ | 低 | 高 | 免费 |
| Pre-commit检查 | ⭐⭐⭐⭐ | 中 | 高 | 免费 |
| Key轮换制度 | ⭐⭐⭐⭐ | 中 | 中 | 免费 |
| IP白名单 | ⭐⭐⭐ | 低 | 中 | 免费 |
| 额度限制 | ⭐⭐⭐⭐⭐ | 低 | 高 | 免费 |
| 密钥管理服务 | ⭐⭐⭐ | 高 | 高 | ¥50+/月 |
| WAF防护 | ⭐⭐ | 高 | 中 | ¥300+/月 |
总结:泄露应急检查表
立即行动(0-5 分钟)
- 撤销泄露的密钥
- 降低账户消费上限
- 暂停高风险任务
评估损失(5-30 分钟)
- 导出账单明细
- 查找异常消费
- 计算损失金额
- 保存证据截图
恢复服务(30-60 分钟)
- 创建新密钥(一应用一密钥)
- 设置额度和模型限制
- 逐项恢复服务
- 测试确认正常
清理泄露(1-2 小时)
- 删除聊天记录或截图
- 清理 Git 历史(如果需要)
- 检查部署环境
- 通知相关人员
后续跟进(1-7 天)
- 监控账单异常
- 联系服务商申诉(如果需要)
- 检查是否有二次泄露
- 加强预防措施
最后更新:2026-08-15
应急热线:服务商客服(各平台不同)
延伸阅读: