如何刪除GIT倉庫中的敏感資訊
- 2019 年 10 月 3 日
- 筆記
如何刪除GIT倉庫中的敏感資訊
正常Git
倉庫中應該盡量不包含資料庫連接/AWS帳號/巨大二進位文件,否則一旦泄漏到Github
,這些非常敏感資訊會影響客戶的資訊安全已經公司的信譽。公司可能其它還有相關規定,如禁止私人郵件加入GIT倉庫。如果違反這些規定,可能會面臨辭退、高額罰款、或牢獄之災等非常嚴厲的懲罰。
由於Git
的正常操作流程,導致敏感資訊一旦進入主分支,再怎麼在新的Pull Request
中刪除,也無能為力了。其它人都能在歷史記錄中查詢到歷史記錄中的配置。所以這要求對Git
的簽名和簽入、推送要有高度的敬畏之心。
然而根據墨菲定律
,可能發生的事情一定會發生。時不時,故意或失手,就會有人將這些資訊寫到了Git
倉庫中。如果程式碼還沒有上傳(git push
),那可能還好說,只要將分支刪除,然後重新寫一下功能即可。但如果已經上傳了,或功能太多太複製沒辦法及時刪除,就會後悔莫及了。
這裡我將演示一個故意寫滿「敏感資訊」的Github
倉庫,然後一步一步演示怎麼在歷史記錄中,刪除「敏感資訊」,以完成「脫敏」。
倉庫需處理的問題說明:
敏感源 | 敏感原因 | 處理方法 |
---|---|---|
[email protected] | 個人郵箱簽入公司項目 | 替換為「公司」郵箱:[email protected] |
文件Program.cs | AWS Key保存在文件 | 替換將AWS Key為:REPLACED |
文件appsettings.Production.json | 生產環境配置文件 | 刪除 |
文件夾userSecrets | 敏感資訊文件夾 | 刪除 |
Program.exe | 大二進位文件簽入 | 刪除 |
這個演示滿載「敏感」資訊的程式碼倉庫,可以從:https://github.com/sdcb/sensitive-repo-demo 這裡下載。
「敏感」資訊演示:
-
個人郵箱簽入「公司」項目,可以通過
gitk
命令看到:
-
AWS Key配置寫在程式碼中(見
Program.cs
):string awsAccessKey = "pwiCZSMCIcM6+q+h"; string awsSecretKey = "861YUaeCHqzaS5OX+OmAK1XD37kmQhA2"; Console.WriteLine("Hello, I Switched to correct email!");
-
生產環境配置文件(見
appsettings.Production.json
):{ "ConnectionString": "Data Source=production-db.starworks.cc,32768; User Id=sensitive_user; Password=MyVeryVerlyStr0ngPassw0rd!; Initial Catalog=ProductionDB; app=Program1" }
- 敏感資訊文件夾(見
userSecrets
文件夾) -
大二進位文件(見
binProgram.exe
)
從以上敏感資訊的誠意,可見小編(周傑的DotNet騷操作
)為了寫這遍文章已經拼了?。
如何刪除敏感資訊
前置條件
必須先切換到主分支(一般為master
),然後獲取最新程式碼再進行操作:
git checkout master git pull
如果有任何修改的對象,都會阻止提交,因此必須先簽入所有未提交的本地修改。
git filter-branch
——刪除郵箱/用戶名
該命令用於解決將個人郵箱/個人用戶名簽入公司項目。
該命令是Git
客戶端內置的,不用下載。
bfg
——刪除其它資訊
bfg
(BFG Repo-Cleaner)是個強大的工具,有如下功能:
- 用於刪除文件內敏感資訊(不刪文件)
- 刪除敏感文件
- 刪除敏感文件夾
- 刪除大二進位文件。
bfg
基於Java,安裝很繁瑣,但通過choco
命令,可以快速進行安裝:
-
先在命令提示符(
cmd
)下執行如下腳本,安裝choco
(Chocolatey):@"%SystemRoot%System32WindowsPowerShellv1.0powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%chocolateybin"
-
再使用
choco
命令安裝bfg
工具(需要管理員許可權):choco install bfg-repo-cleaner
期間,它會自動下載
JRE
等組件,執行效果如下(需要按多次Y
/Yes
):
重點:執行此命令需要以管理員許可權運行
cmd
。
執行命令,刪除敏感資訊
刪除個人郵箱簽入「公司」項目
執行如下命令即可:
git filter-branch --env-filter ' OLD_EMAIL="[email protected]" CORRECT_NAME="sdflysha" CORRECT_EMAIL="[email protected]" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' --tag-name-filter cat -- --branches --tags
重點:
- 將上述腳本中的
OLD_EMAIL
項[email protected]
替換為你的私人(錯誤)郵箱; - 將
CORRECT_NAME
和CORRECT_EMAIL
換成你的公司(正確)郵箱; - 該命令不能在命令提示符(
cmd
)中運行,因為cmd
不支援換行命令,否則會出現如下錯誤:
如果執行正常,將會出現:
此時,運行gitk命令將看到:
可見,所有「私人郵箱」[email protected]
都正確地替換成為了「公司郵箱」[email protected]
了。
替換文件中的敏感資訊(不刪除文件)
命令:
bfg --replace-text "C:UserssdflyDesktopto-be-replaced.txt" --no-blob-protection
其中to-be-replaced.txt
格式如下:
pwiCZSMCIcM6+q+h==>REPLACED 861YUaeCHqzaS5OX+OmAK1XD37kmQhA2==>REPLACED
其中左邊是需要替換的值(這裡為AWS相關的key),右邊為替換之後的值。
命令執行後,可以運行gitk
,可以看到歷史記錄中,東西真的被替換了:
刪除敏感文件
命令:
bfg --delete-files appsettings.Production.json --no-blob-protection
將其中appsettings.Production.json
文件替換成你的文件名即可。
注意:刪除文件不能帶路徑名,只能匹配文件本身。
刪除敏感文件夾
命令:
bfg --delete-folders userSecrets --no-blob-protection
將userSecrets
文件夾替換成你的敏感文件夾即可。
刪除二進位大文件
命令:
git gc bfg --strip-blobs-bigger-than 150K --no-blob-protection
將150K
換成你的二進位文件大小即可。
注意:刪除大二進位文件前,運行git gc
命令是必須的,否則會報這個錯:
Warning : no large blobs matching criteria found in packfiles - does the repo need to be packed?`
關於--no-blob-protection
--no-blob-protection
是指將歷史中刪除的記錄,放到最新一次未簽入的修改中:
PS C:UserssdflyDesktopsensitive-repo-demo> git status On branch master Your branch and 'origin/master' have diverged, and have 9 and 9 different commits each, respectively. (use "git pull" to merge the remote branch into yours) Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: Program.cs new file: appsettings.Production.json new file: bin/Program.exe deleted: bin/Program.exe.REMOVED.git-id new file: userSecrets/admin-password.json new file: userSecrets/user-password.json
這些都是敏感資訊或者大文件,根據你的實際情況,可以先備份一下,然後刪除:
git reset --hard
推送到遠程/其他人獲取程式碼
此時可以通過:
git push --set-upstream origin master --force
來推送到遠程以完成(該命令可能需要你的上級幫你執行,或臨時開個許可權)。
注意,簡單地執行git push
(不帶--force
)是無法推送的,此時會報如下錯誤:
組內其它成員則可以刪除原先的主分支,然後重新拉一個主分支:
git fetch origin git checkout -b temp-branch git branch -D master git checkout origin/master git checkout -b master
最後的效果
(已脫密)https://github.com/sdcb/sensitive-repo-demo/tree/cleaned
對比:
(原版)https://github.com/sdcb/sensitive-repo-demo
總結
我們簽入Git
時應該小心謹慎,但一旦出現問題,只要引起重視,也是可以儘早補救的。上述這些命令可能會中斷其它組員的工作,因此一旦出現問題應該儘早彙報給上級,大概率需要上級來配合來恢復Git
的使用。
當然,提高資訊安全意識才是最重要的,事後諸葛亮是費力不討好。希望各位提高警惕,不要在Git
的使用中翻車。
出處:微信公眾號【DotNet騷操作】
原文鏈接:https://www.cnblogs.com/sdflysha/p/20190804-delete-sensitive-info-in-git-repository.html