- 原文地址:5 Best Practices To Prevent Git Leaks
- 原文做者:Coder’s Cat
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:YueYongDEV
- 校對者:Roc、icy
無數的開發人員正在使用 Git 進行版本控制,可是許多開發人員對 Git 的工做方式並無足夠的瞭解。有些人甚至將 Git 和 Github 用做備份文件的工具。這些作法致使 Git 倉庫中的信息遭到泄露,天天都有數千個新的 API 或加密密鑰從 GitHub 泄漏出去。前端
我在信息安全領域工做了三年。大約在兩年前,咱們公司發生了一塊兒很是嚴重的安全問題,是因爲 Git 倉庫發生了信息泄露致使的。android
一名員工意外地在 Github 上泄露了 AWS 的密鑰。攻擊者使用此密鑰從咱們的服務器下載不少敏感的數據。咱們花了不少時間來解決這個問題,咱們試圖統計出泄漏了多少數據,並分析了受影響的系統和相關用戶,最後替換了系統中全部泄漏的密鑰。ios
這是一個任何公司和開發人員都不肯經歷的悲慘故事。git
關於整件事情的細節我就很少寫了。事實上,我但願更多的人知道如何去避免 Git 的信息泄露。如下是我提出的一些建議。github
大多數新人開發者沒有足夠的安全意識。有些公司會培訓新員工,但有些公司沒有系統的培訓。數據庫
做爲開發人員,咱們須要知道哪些數據可能會帶來安全問題。千萬記住,下面這些數據不要上傳到 Git 倉庫中:編程
若是你在公司工做,未經容許,請勿共享任何與公司相關的源代碼或數據。後端
攻擊者能夠在 GitHub 上輕鬆地找到某些具備公司版權的代碼,而這些代碼都是被員工無心中泄露到 Github 上的。api
個人建議是,應該將公司項目和我的項目嚴格區分。安全
當咱們使用 Git 建立一個新項目時,咱們必須正確地設置一個 .gitignore 文件。.gitignore 是一個 Git 配置文件,它列出了不會被存入 Git 倉庫的文件或目錄。
這個 gitignore 項目 是一個實際使用着的 .gitignore 模板集合,其中包含對應各類編程語言、框架、工具或環境的配置文件。
咱們須要瞭解 gitignore 的模式匹配規則,並根據模板添加咱們本身的規則。
沒有工具能夠從 Git 倉庫中找出全部敏感數據,可是有一些工具能夠爲咱們提供幫助。
git-secrets 和 talisman 是相似的工具,它們應做爲預提交的鉤子(pre-commit hooks)安裝在本地代碼庫中。每次都會在提交以前對更改的內容進行檢查,若是鉤子檢測到預期的提交內容可能包含敏感信息,那它們將會拒絕提交。
gitleaks 提供了另外一種在 git 倉庫中查找未加密的密鑰和其餘一些不須要的數據類型的方法。咱們能夠將其集成到自動化工做流程中,例如 CICD。
代碼審查是團隊合做的最佳實踐。全部隊友都將從彼此的源代碼中學習。初級開發人員的代碼應由具備更多經驗的開發人員進行審查。
在代碼檢查階段能夠發現大多數不符合預期的更改。
啓用分支限制 能夠強制執行分支限制,以便只有部分用戶才能推送到代碼庫中受保護的分支。Gitlab 也有相似的選擇。
將 master 設置爲受限制的分支有助於咱們執行代碼審查的工做。
即便使用了上面提到的工具和方法,卻仍然可能會發生錯誤。但若是咱們快速且正確地修復它,則代碼泄漏可能就不會引發實際的安全問題。
若是咱們在 Git 倉庫中發現了一些敏感數據泄漏,咱們就不能僅僅經過提交另外一個提交覆蓋的方式來進行清理。
咱們須要作的是從整個 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 連接。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。