二〇四〇

12 Jun 2023

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

除了 .gitignoregit-secrets,如果项目用到了 GitHub Actions,还可以配合 Encrypted Secrets 管理敏感信息,这里就略过了。

后记

对于大部分的场景,.gitignoregit-secrets 已经足够使用,可以按需选择。针对公开的互联网(包括 GitHub 公开仓库等)上的敏感信息,有无数的机器人盯着,一旦发现私钥什么的,你的钱可以瞬间转走,这个单位是秒级,所以千万不要掉以轻心。当然了,不要因为自己用的是 GitHub 的私有仓库,敏感信息就可以随便上传。第一,你的私钥仓库在未来有可能开源(开源之前记得使用 git secrets --scan-history 扫一下),第二,GitHub 也存在泄漏的可能。所以在任何场景,都应该重视敏感信息,在开发中养成良好的习惯非常重要。

Long Bitcoin,
Robin at 06-12

2040