关于 sanitize-git-repo
该技能指导在 Git 仓库中系统查找并替换密钥、令牌和密码等敏感信息,适用于共享代码前的清理和安全审查准备。它强调先盘点所有出现位置,再逐项替换并复查;是否清理 Git 历史需另行确认。
主要功能
- 01搜索常见凭据模式
- 02检查配置、文档与测试数据
- 03记录敏感值及其出现位置
- 04一致替换所有匹配项
- 05复查残留并运行测试
适用场景
- 01共享或开源前清理仓库
- 02移除误提交的凭据
- 03审查代码中的敏感信息
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ letta-ai/ skills --skill sanitize-git-repo安装后在 Claude Code 中输入/sanitize-git-repo确认已加载。
详细介绍
清理 Git 仓库
本技能提供系统性识别和替换 Git 仓库中敏感信息的指导,包括 API 密钥、令牌、密码和其他凭据。
何时使用此技能
- 分享或开源仓库前进行清理
- 从代码库中移除意外提交的机密
- 将硬编码凭据替换为占位符
- 审查仓库中的敏感信息
- 为安全审查准备代码
推荐方法
阶段 1:全面发现
在进行任何更改之前,先完整列出所有敏感值。这样可以避免在处理过程中途发现更多机密这一常见问题。
常见机密模式:
| 类型 | 模式/前缀 | 示例 |
|---|---|---|
| AWS 访问密钥 | AKIA[A-Z0-9]{16} | AKIAIOSFODNN7EXAMPLE |
| AWS 秘密密钥 | 40 位 Base64 字符串 | 通常位于访问密钥附近 |
| GitHub 令牌 | ghp_、gho_、ghs_、ghr_ | ghp_xxxxxxxxxxxx |
| Huggingface 令牌 | hf_ | hf_xxxxxxxxxxxx |
| 通用 API 密钥 | api[_-]?key、apikey | 不固定 |
| Bearer 令牌 | bearer、token | 不固定 |
| 私钥 | -----BEGIN.*PRIVATE KEY----- | RSA/EC 密钥 |
| 数据库 URL | postgres://、mysql://、mongodb:// | 连接字符串 |
| 密码字段 | password、passwd、pwd | 不固定 |
发现策略:
- 使用正则表达式搜索已知前缀和模式
- 搜索常见变量名(
API_KEY、SECRET、TOKEN、PASSWORD、CREDENTIAL) - 检查配置文件(
.env、config.*、settings.*、*.json、*.yaml、*.yml) - 检查测试固件和模拟数据文件
- 检查嵌入在其他格式中的数据(字符串中编码的 JSON、Base64 编码内容)
需要检查的重要位置:
- 配置文件和环境模板
- 测试固件和示例数据
- 文档和 README 文件
- CI/CD 配置文件
- Docker 和部署配置
- JSON/YAML 数据文件(机密可能嵌入结构化数据中)
- 仓库中保存的 Git diff 输出或补丁文件
阶段 2:记录清单
进行更改前,创建一份记录清单,列出:
- 找到的每个唯一敏感值
- 每个值出现的所有文件位置
- 要匹配的确切字符串(必要时包含周边上下文,以确保唯一性)
- 要用于替换的占位符
占位符约定:
- 使用能表明类型的描述性占位符:
<AWS_ACCESS_KEY>、<GITHUB_TOKEN>、<DATABASE_PASSWORD> - 确保所有替换内容一致
- 如果用户指定了格式,则按该格式操作
阶段 3:系统性替换
有条理地执行替换:
- 按清单逐个处理机密
- 对每个机密,替换所有文件中的所有出现位置
- 每次替换后立即验证
- 使用精确字符串匹配,避免意外修改
替换最佳实践:
- 编辑前先读取文件,确保精确匹配字符串
- 精确处理空白和格式
- 考虑嵌入在 JSON 或其他结构化格式中的机密(可能需要转义)
- 同一文件中同一个值多次出现时,可进行批量替换
阶段 4:验证
完成所有替换后:
- 重新运行所有原始发现搜索,确认不再有机密残留
- 搜索敏感值的部分匹配
- 运行提供的测试套件,验证清理效果
- 检查占位符格式是否正确
常见陷阱
1. 初始发现不完整
问题: 在替换过程中逐步发现机密,导致需要回头处理。
预防: 在开始时投入时间,使用多种模式进行全面搜索,并检查所有文件类型,包括数据文件和嵌入内容。
2. 意外位置中的机密信息
问题: 机密信息可能出现在 JSON 文件、嵌入的字符串、测试样例或编码数据中,无法通过简单搜索找到。
预防措施: 递归搜索所有文件类型。特别检查 JSON 和 YAML 文件。查找可能包含机密信息的 Base64 编码内容。
3. 精确字符串匹配失败
问题: 空白差异或字符编码问题会导致编辑操作失败。
预防措施: 务必先读取目标文件,了解确切的格式。完全按照文件中的内容复制字符串,包括空白字符。
4. 遗漏匹配项
问题: 同一机密信息出现多次,但只替换了部分内容。
预防措施: 每次替换后,立即搜索原始值进行确认。如果有可用的全部替换功能,请使用该功能。
5. Git 历史记录注意事项
问题: 从当前文件中移除机密信息后,Git 历史记录中仍会保留这些信息。
预防措施: 向用户确认是否需要清理 Git 历史记录。如果需要,可能要使用 git filter-branch 或 BFG Repo-Cleaner 等工具(这是另一项更复杂的操作)。
6. 对工具可用性的假设
问题: 并非所有环境都提供专用搜索工具(如 ripgrep)。
预防措施: 准备好备用方案。标准的 grep -r 在大多数环境中都可用。依赖某个工具前,请先确认它是否可用。
验证清单
在确认任务完成前:
- 已搜索所有已知的机密信息模式
- 已检查配置文件
- 已检查 JSON/YAML 数据文件
- 已审查测试样例和模拟数据
- 已在所有位置替换每一项已识别的机密信息
- 验证搜索确认原始机密信息均已移除
- 占位符格式一致
- 所有提供的测试均已成功通过
搜索命令参考
标准 grep(广泛可用):
# Search for AWS access keys
grep -rn "AKIA[A-Z0-9]\{16\}" . --exclude-dir=.git
# Search for common token prefixes
grep -rn "ghp_\|gho_\|ghs_\|hf_" . --exclude-dir=.git
# Search for password-related strings
grep -rn -i "password\|passwd\|pwd" . --exclude-dir=.git
# Search for API key patterns
grep -rn -i "api[_-]\?key\|apikey" . --exclude-dir=.git
搜索时务必排除 .git 目录,以免 Git 内部文件造成干扰。