【译】防止 Git 泄漏的 5 种最佳作法

防止 Git 泄漏的 5 种最佳作法

无数的开发人员正在使用 Git 进行版本控制,可是许多开发人员对 Git 的工做方式并无足够的了解。有些人甚至将 Git 和 Github 用做备份文件的工具。这些作法致使 Git 仓库中的信息遭到泄露,天天都有数千个新的 API 或加密密钥从 GitHub 泄漏出去前端

我在信息安全领域工做了三年。大约在两年前,咱们公司发生了一块儿很是严重的安全问题,是因为 Git 仓库发生了信息泄露致使的。android

一名员工意外地在 Github 上泄露了 AWS 的密钥。攻击者使用此密钥从咱们的服务器下载不少敏感的数据。咱们花了不少时间来解决这个问题,咱们试图统计出泄漏了多少数据,并分析了受影响的系统和相关用户,最后替换了系统中全部泄漏的密钥。ios

这是一个任何公司和开发人员都不肯经历的悲惨故事。git

关于整件事情的细节我就很少写了。事实上,我但愿更多的人知道如何去避免 Git 的信息泄露。如下是我提出的一些建议。github

创建安全意识

大多数新人开发者没有足够的安全意识。有些公司会培训新员工,但有些公司没有系统的培训。数据库

做为开发人员,咱们须要知道哪些数据可能会带来安全问题。千万记住,下面这些数据不要上传到 Git 仓库中:编程

  1. 任何配置数据,包括密码,API 密钥,AWS 密钥和私钥等。
  2. 我的身份信息(PII)。根据 GDPR 的说法,若是公司泄露了用户的 PII,则该公司须要通知用户和有关部门,不然会带来更多的法律麻烦。

若是你在公司工做,未经容许,请勿共享任何与公司相关的源代码或数据。后端

攻击者能够在 GitHub 上轻松地找到某些具备公司版权的代码,而这些代码都是被员工无心中泄露到 Github 上的。api

个人建议是,应该将公司项目和我的项目严格区分。安全

使用 Git 忽略(Git ignore)

当咱们使用 Git 建立一个新项目时,咱们必须正确地设置一个 .gitignore 文件。.gitignore 是一个 Git 配置文件,它列出了不会被存入 Git 仓库的文件或目录。

这个 gitignore 项目 是一个实际使用着的 .gitignore 模板集合,其中包含对应各类编程语言、框架、工具或环境的配置文件。

咱们须要了解 gitignore 的模式匹配规则,并根据模板添加咱们本身的规则。

使用 Git 钩子(Git hooks)和 CI 检查提交

没有工具能够从 Git 仓库中找出全部敏感数据,可是有一些工具能够为咱们提供帮助。

git-secretstalisman 是相似的工具,它们应做为预提交的钩子(pre-commit hooks)安装在本地代码库中。每次都会在提交以前对更改的内容进行检查,若是钩子检测到预期的提交内容可能包含敏感信息,那它们将会拒绝提交。

gitleaks 提供了另外一种在 git 仓库中查找未加密的密钥和其余一些不须要的数据类型的方法。咱们能够将其集成到自动化工做流程中,例如 CICD。

代码审查(Code review)

代码审查是团队合做的最佳实践。全部队友都将从彼此的源代码中学习。初级开发人员的代码应由具备更多经验的开发人员进行审查。

在代码检查阶段能够发现大多数不符合预期的更改。

启用分支限制 能够强制执行分支限制,以便只有部分用户才能推送到代码库中受保护的分支。Gitlab 也有相似的选择。

将 master 设置为受限制的分支有助于咱们执行代码审查的工做。

快速而且正确地修复它

即便使用了上面提到的工具和方法,却仍然可能会发生错误。但若是咱们快速且正确地修复它,则代码泄漏可能就不会引发实际的安全问题。

若是咱们在 Git 仓库中发现了一些敏感数据泄漏,咱们就不能仅仅经过提交另外一个提交覆盖的方式来进行清理。

This fix is self-deception

咱们须要作的是从整个 Git 历史记录中删除全部敏感数据。

在进行任何清理以前请记得进行备份,而后在确认一切正常后再删除备份文件。

使用 --mirror 参数克隆一个仓库;这是 Git 数据库的完整副本。

git clone --mirror git://example.com/need-clean-repo.git
复制代码

咱们须要执行 git filter-branch 命令来从全部分支中删除数据并提交历史记录。

下面举个例子,假设咱们要从 Git 中删除 ./config /passwd

$ git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch ./config/password' \
  --prune-empty --tag-name-filter cat -- --all
复制代码

请记住将敏感文件添加到 .gitignore 中:

$ echo "./config/password" >> .gitignore
$ git add .gitignore
$ git commit -m "Add password to .gitignore"
复制代码

而后咱们将全部分支推送到远端:

$ git push --force --all
$ git push --force --tags
复制代码

告诉咱们的小伙伴进行变基(rebase):

$ git rebase
复制代码

BFG 是一种比 git filter-branch 更快、更简单的用于删除敏感数据的替代方法。一般比 git filter-branch 快 10–720 倍。除删除文件外,BFG 还能够用于替换文件中的机密信息。

BFG 保留最新的提交记录。它是用来防止咱们犯错误的。咱们应该显式地删除文件,提交删除,而后清除历史记录以此删除它。

若是泄漏的 Git 代码库被其余人 fork 了,咱们须要遵循 DMCA 的删除策略,请求 Github 删除建立的代码库。

整个过程须要一些时间才能完成,但这是删除全部副本的惟一方法。

总结

不要犯无数人犯过的错误。尽力避免发生安全事故。

使用上面提到的这些工具和策略将有助于避免 Git 泄漏。

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索