Catching API Keys With Git Hooks

这里有一个小技巧,我刚刚学会了帮助防止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
end

exit bad_files

第一个例子显示了API密钥的安全使用,在使用之前它们将从文件中加载。

正常情况下,该文件可以通过Git提交进程。

第二个示例将API密钥直接存储在文件中,并且可以看到,挂钩点将阻止提交:

最后,与任何模式匹配规则一样,偶尔会出现误判。如果你想覆盖钩子及其检查,你可以在提交时使用–no-verify参数来做到这一点:


结论:

这种技术可以用来检测任何类型的内容,并防止它在回购结束。显然,如果正则表达式编写得不好,事情还是有可能发生,类似的,编写不好的正则表达式可能会导致误报,所以需要做一些工作来确保正则表达式尽可能紧凑。

另外,正如所显示的那样,检查可以轻松绕过,所以仍然建议执行定期的源代码审计以查找开发人员已经通过的密钥或其他信息。


转载请注明出处:https://www.freearoot.com/index.php/catching-api-keys-with-git-hooks.html

文章转载来源:https://digi.ninja/blog/git_hooks.php