【譯】防止 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前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索