这是我刚刚学到的一个小技巧,可以帮助防止像API密钥这样的东西最终落入你的Git仓库。我已经向一些喜欢Git的开发人员提到了这一点,他们都声称显而易见并且很多人已经在使用它,但是,正如我们经常在GitHub中看到键,我猜它是人们所知道的一个案例他们应该做他们实际做的经文。
所以,诀窍...... Git有一个钩子系统,可以让你在关键事件上运行脚本,例如当代码被提交或推送到远程存储库时,这些可用于检查文件内容或提交消息,如果必要的,阻止行动。它们可以在本地和远程端运行,只需在正确的目录中删除具有正确名称的可执行文件即可设置。你可以在这里阅读更多关于这些定制Git - Git Hooks的信息。
我建议的防御是在允许文件被提交到存储库之前检查文件是否有坏内容,这种类型的检查由.git / hooks / pre-commit脚本执行。这会在提交时运行,但在文件实际进入存储库之前。该脚本可以访问所有正在提交的文件的列表,然后通过它们查找不良内容(例如API密钥或您不希望在您的仓库中结束的任何其他内容)的简单情况。该脚本能够通过写入标准输出将消息发送给用户,如果脚本以零退出,则允许提交,否则将被拒绝。
以下脚本使用两个正则表达式来检查Amazon和Google私钥。它为每个要提交的文件调用grep。如果grep返回内容,则匹配,因此将打印一条消息,并增加坏文件的数量。最后,脚本以错误计数值退出,如果没有匹配则计数为零并且允许提交,否则拒绝提交。
#!/usr/bin/env ruby # This script can be bypassed by using the --no-verify # parameter when checking in files_modified = `git diff-index --cached --name-only HEAD` files_modified_arr = files_modified.split("\n") # puts "Checking files: #{files_modified_arr.inspect}" bad_files = 0 # Build a hash of all the keys and things you don't want # checked in here. # Note the pair of slashes before the slash quote, this # is to ensure a slash quote is built into the string # to be passed to grep. regexs = { "AWS Key" =< "['\\\"][a-z0-9\/+]{40}['\\\"]", "Google Key" =< "['\\\"][a-z0-9_]{39}['\\\"]", } files_modified_arr.each do |file| regexs.each_pair do |key_name, regex| grep_command = "grep -iE \"#{regex}\" #{file}" # puts grep_command res = `#{grep_command}` # puts res.inspect unless res == "" bad_files += 1 puts "Match rule for #{key_name} on file: #{file}" end end endexit bad_files
第一个示例显示了API密钥的安全使用,它们将在使用前从文件加载。
正常情况下允许该文件通过Git提交过程。
第二个示例将API密钥直接存储在文件中,可以看出,钩子发现了这个并阻止了提交:
最后,与任何模式匹配规则一样,偶尔可能会出现误报。如果要覆盖挂钩及其检查,可以在提交时使用--no-verify参数执行此操作:
结论
此技术可用于检测任何类型的内容并防止其在回购中结束。如果正则表达式写得不好,显然仍然有可能出现问题,同样,写得不好的正则表达式可能导致误报,因此需要开展工作以确保正则表达式尽可能紧密。
此外,如图所示,可以轻松绕过检查,因此仍建议执行常规源代码审核,以查找开发人员强制执行的密钥或其他信息。
本文作者为Mr.Bai,转载请注明。