portal/skills/git.secret-incident-response.v1.md

104 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# skillgit secret incident response (auto-fix playbook) v1
> 目标:当 gitleaks 发现泄露时,提供“自动止血 + 可回滚 + 可审计”的标准处理流程。
> 原则:先撤销/轮换,再清理历史,最后加规则;不要反过来。
## 触发条件
- 本地 hook / CI 中 `gitleaks detect` 失败
- 或发现敏感信息已进入仓库(哪怕没有报警)
## 输入
- gitleaks 报告:`.git/gitleaks/report.json`(或 CI artifact
- 泄露类型API key / token / 私钥 / DB 密码 / 证书
- 泄露范围:仅未提交(staged) / 已提交 but 未推送 / 已推送到远端
## 全局规则(强制)
- 任何真实 secret 一律视为已泄露:必须 rotate/revoke
- 不允许“先 allowlist 让它过”来掩盖问题
- 清理历史是最后手段,但一旦推送过就必须执行
---
## 处理流程(按优先级执行)
### Step 0立即止血30 秒内)
1) 取消暂存/撤回改动(避免误提交):
```bash
git restore --staged .
```
2) 在本地删除/替换泄露内容(改为读取 Secret Manager / env / vault
3) 重新 staged 后再跑 gitleaks确保干净
```bash
git add -A
git diff --cached -U0 | gitleaks detect -v --no-git --pipe --redact --config config/gitleaks.toml
```
### Step 1撤销/轮换密钥(必须)
根据类型选择动作(示例):
- GitHub tokenrevoke + 重新生成
- GCP SA key禁用/删除 key改用 Workload Identity如可
- DB 密码:立即改密码 + 强制最小权限 + 限制来源 IP
- TLS 私钥:重新签发证书
产物:记录 “rotated_at / rotated_by / secret_id / scope”。
### Step 2判断是否进入 git 历史(分支决策)
情况 A仅 staged / 未 commit
- 不需要清理历史,只需修复内容 + rotate 即可
情况 B已 commit 但未 push
- 可以用 reset/squash 直接抹掉 commit
```bash
git reset --soft HEAD~1
# 删除泄露内容后重新 commit
```
仍需 rotate因为本地也可能被复制、日志、shell history 等)
情况 C已 push 到远端(高危)
- 必须清理历史:推荐 git filter-repo比 filter-branch 稳、快)
- 删除文件:
```bash
git filter-repo --path path/to/leaked.file --invert-paths
```
- 或按文本替换(需要准备 replacement rules
```bash
git filter-repo --replace-text replacements.txt
```
- 强制推送并通知协作者重拉:
```bash
git push --force --all
git push --force --tags
```
注意:即便清理了 git 历史,也必须 rotate因为泄露已经发生。
### Step 3误报处理允许但必须最小化
仅当你确认它不是 secret例如测试样例、公开字符串
1) 在 config/gitleaks.toml 里加 allowlist最小范围
2) 优先 path allowlist
3) 其次 regex allowlist要尽量具体
4) 重新运行 gitleaks 验证通过
### Step 4加固防再犯
- CI 中强制 gitleaks不可跳过
- 将 secrets 全部迁移到 Secret Manager或 Vault
- 禁止在 docs/example 中出现真实 key用 EXAMPLE_ 前缀)
## 自动化脚本建议(可选增强)
你可以在仓库提供一个统一入口脚本:
`scripts/security/secret-incident.sh`
功能:
- 自动打开 report.json
- 提示泄露文件/规则
- 输出对应处理命令模板reset/filter-repo/allowlist
- 生成一份 incident 记录markdown
## 验收标准
✅ 泄露发生时:提交/CI 必然失败
✅ 30 秒内可止血:撤回 staged 并定位报告
✅ 轮换动作有记录
✅ 已 push 泄露:历史清理可复现且协作指引明确
✅ 误报 allowlist 不扩大攻击面