利用Git Hooks捕获API密钥
这里有一个小技巧,可以帮助防止API密钥等敏感信息意外进入Git仓库。尽管许多Git爱好者开发者声称这很常见,但GitHub上仍经常发现密钥泄露,这说明知与行之间存在差距。
Git Hooks简介
Git提供了一套钩子(hooks)系统,允许在关键事件(如代码提交或推送到远程仓库)时运行脚本。这些脚本可用于检查文件内容或提交消息,必要时可阻止操作。钩子可在本地或远程运行,只需将可执行文件放入指定目录即可。更多详情参见Customizing Git - Git Hooks。
防御方案:pre-commit检查
建议在文件提交到仓库前检查不良内容,这类检查由.git/hooks/pre-commit脚本执行。该脚本在提交操作时运行,但文件尚未进入仓库。脚本可访问所有待提交文件的列表,只需用grep搜索不良内容(如API密钥或其他不希望进入仓库的信息)。脚本通过标准输出向用户发送消息,若脚本以零退出,则允许提交;否则拒绝。
以下脚本使用两个正则表达式检查Amazon和Google私钥。它对每个待提交文件调用grep,如果找到匹配,则打印消息并增加不良文件计数。最后,脚本以不良计数退出:零表示无匹配,允许提交;非零则拒绝。
|
|
第一个示例展示了API密钥的安全用法:密钥在使用前从文件加载。
文件正常通过Git提交过程。
第二个示例将API密钥直接存储在文件中,钩子检测到并阻止提交。
最后,与任何模式匹配规则一样,偶尔可能出现误报。如果想覆盖钩子及其检查,可以在提交时使用--no-verify参数。
结论
该技术可用于检测任何类型的内容并防止其进入仓库。显然,如果正则表达式编写不当,仍有可能漏检;同样,糟糕的正则表达式可能导致误报,因此需要努力确保正则表达式列表尽可能精确。
此外,如所示,检查可以轻松绕过,因此仍建议定期进行源代码审计,查找开发人员强制通过的密钥或其他信息。