GitHub 提交代码阻止敏感信息的方法
前言
最近看到 @forecho 的文章「我的 ETH 被盗了」,里面提到不小心将私钥上传导致 ETH 被盗,这真是一个悲伤的故事。关于 GitHub 提交代码,如何阻止敏感信息,其实有不少方法。
常用方法
阻止提交敏感信息,常用的方法是配置文件 + .gitignore
,例如仓库下有配置文件 .env
,那么提交的文件通常是 .env.example
。.env.example
这个文件有完整的变量名,但是没有参数。然后在 .gitignore
写入一行 .env
,这样即使仓库下有 .env
文件,提交的时候也会自动跳过。
这种方法也是最常见的,但是使用这种方法也会有失误的时候。比如创建了 .env
文件,里面有完整的变量名和参数,但是 .gitignore
却忘记过滤 .env
,所有的敏感信息全部提交到 GitHub 了,即使删除了 .env
,提交的内容还存在于 Git 的日志文件。
推荐方法
本文推荐的方法是使用 AWS Labs 推出的 git-secrets,可以从技术手段上杜绝敏感信息的提交。
接下来演示下如何使用(系统是 macOS),首先安装 git-secrets
。
$ git clone https://github.com/awslabs/git-secrets
$ cd git-secrets
$ make install
接下来做全局配置,当然对单个项目做配置也是可以的,考虑到对单个项目配置很容易忘记,这里以全局为例。
$ git config --global --unset init.templatedir
$ mkdir ~/.git-templates/git-secrets
$ git config --global init.templatedir ~/.git-templates/git-secrets
$ git-secrets --install ~/.git-templates/git-secrets
$ git secrets --register-aws --global
$ touch ~/.git-templates/git-secrets/config
~/.git-templates/git-secrets/config
配置文件内容如下:
[secrets]
providers = git secrets --aws-provider
patterns = ^[a-fA-F0-9]{64}$
这里的 patterns 以匹配以太坊私钥作为例子,如果你想过滤更多的敏感信息,可以继续增加 patterns。
接下来就是验证的环节了,要想全局配置生效,我们 clone 代码的时候需要使用 --template
参数(~/.git-templates/git-secrets
目录是默认目录,所以也可以不添加此参数)。
$ git clone $YOUR_REPO_URL --template ~/.git-templates/git-secrets
$ cd $YOUR_REPO
$ touch key.log
key.log
的内容如下:
afdfd9c3d2095ef696594f6cedcae59e72dcd697e2a7521b1578140422a4f890
这里要声明下,这个私钥是在 ethereum-component 找到的,测试时不建议使用自己的私钥。
接下来提交代码,可以看到是无法提交的。
$ git add -A . && git commit -S -m "test add key" && git push origin master
key.log:1:afdfd9c3d2095ef696594f6cedcae59e72dcd697e2a7521b1578140422a4f890
[ERROR] Matched one or more prohibited patterns
Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive
Everything up-to-date
当然真实的情况这个私钥前面还有一些变量,就需要对 patterns 做一些调整,这里就不赘述了。
Encrypted Secrets
除了 .gitignore
和 git-secrets
,如果项目用到了 GitHub Actions,还可以配合 Encrypted Secrets 管理敏感信息,这里就略过了。
后记
对于大部分的场景,.gitignore
和 git-secrets
已经足够使用,可以按需选择。针对公开的互联网(包括 GitHub 公开仓库等)上的敏感信息,有无数的机器人盯着,一旦发现私钥什么的,你的钱可以瞬间转走,这个单位是秒级,所以千万不要掉以轻心。当然了,不要因为自己用的是 GitHub 的私有仓库,敏感信息就可以随便上传。第一,你的私钥仓库在未来有可能开源(开源之前记得使用 git secrets --scan-history
扫一下),第二,GitHub 也存在泄漏的可能。所以在任何场景,都应该重视敏感信息,在开发中养成良好的习惯非常重要。
Long Bitcoin,
Robin
at 06-12