如何刪除GIT倉庫中的敏感信息


如何刪除GIT倉庫中的敏感信息

正常Git倉庫中應該盡量不包含數據庫連接/AWS帳號/巨大二進制文件,否則一旦泄漏到Github,這些非常敏感信息會影響客戶的信息安全已經公司的信譽。公司可能其它還有相關規定,如禁止私人郵件加入GIT倉庫。如果違反這些規定,可能會面臨辭退、高額罰款、或牢獄之災等非常嚴厲的懲罰。

由於Git的正常操作流程,導致敏感信息一旦進入主分支,再怎么在新的Pull Request中刪除,也無能為力了。其它人都能在歷史記錄中查詢到歷史記錄中的配置。所以這要求對Git的簽名和簽入、推送要有高度的敬畏之心。

然而根據墨菲定律,可能發生的事情一定會發生。時不時,故意或失手,就會有人將這些信息寫到了Git倉庫中。如果代碼還沒有上傳(git push),那可能還好說,只要將分支刪除,然后重新寫一下功能即可。但如果已經上傳了,或功能太多太復制沒辦法及時刪除,就會后悔莫及了。

這里我將演示一個故意寫滿“敏感信息”的Github倉庫,然后一步一步演示怎么在歷史記錄中,刪除“敏感信息”,以完成“脫敏”。

倉庫需處理的問題說明:

敏感源 敏感原因 處理方法
sdflysha@qq.com 個人郵箱簽入公司項目 替換為“公司”郵箱:sdflysha@starworks.cc
文件Program.cs AWS Key保存在文件 替換將AWS Key為:REPLACED
文件appsettings.Production.json 生產環境配置文件 刪除
文件夾userSecrets 敏感信息文件夾 刪除
Program.exe 大二進制文件簽入 刪除

這個演示滿載“敏感”信息的代碼倉庫,可以從:https://github.com/sdcb/sensitive-repo-demo 這里下載。

“敏感”信息演示:

  • 個人郵箱簽入“公司”項目,可以通過gitk命令看到:
    滿屏幕的私人QQ郵箱

  • 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文件夾)

  • 大二進制文件(見bin\Program.exe

從以上敏感信息的誠意,可見小編(周傑的DotNet騷操作)為了寫這遍文章已經拼了😂。

如何刪除敏感信息

前置條件

必須先切換到主分支(一般為master),然后獲取最新代碼再進行操作:

git checkout master
git pull

如果有任何修改的對象,都會阻止提交,因此必須先簽入所有未提交的本地修改。

git filter-branch——刪除郵箱/用戶名

該命令用於解決將個人郵箱/個人用戶名簽入公司項目。

該命令是Git客戶端內置的,不用下載。

bfg——刪除其它信息

bfg(BFG Repo-Cleaner)是個強大的工具,有如下功能:

  • 用於刪除文件內敏感信息(不刪文件)
  • 刪除敏感文件
  • 刪除敏感文件夾
  • 刪除大二進制文件。

bfg基於Java,安裝很繁瑣,但通過choco命令,可以快速進行安裝:

  1. 先在命令提示符(cmd)下執行如下腳本,安裝choco(Chocolatey):

    @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
    
  2. 再使用choco命令安裝bfg工具(需要管理員權限):

    choco install bfg-repo-cleaner
    

    期間,它會自動下載JRE等組件,執行效果如下(需要按多次Y/Yes):
    choco-install-bfg

    重點:執行此命令需要以管理員權限運行cmd

執行命令,刪除敏感信息

刪除個人郵箱簽入“公司”項目

執行如下命令即可:

git filter-branch --env-filter '
    OLD_EMAIL="sdflysha@qq.com"
    CORRECT_NAME="sdflysha"
    CORRECT_EMAIL="sdflysha@starworks.com"

    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_EMAILsdflysha@qq.com替換為你的私人(錯誤)郵箱;
  • CORRECT_NAMECORRECT_EMAIL換成你的公司(正確)郵箱;
  • 該命令不能在命令提示符(cmd)中運行,因為cmd不支持換行命令,否則會出現如下錯誤:
    Git-cmd錯誤

如果執行正常,將會出現:

git-filter-branch-correct

此時,運行gitk命令將看到:

git-filter-branch-gitk

可見,所有“私人郵箱”sdflysha@qq.com都正確地替換成為了“公司郵箱”sdflysha@starworks.cc了。

替換文件中的敏感信息(不刪除文件)

命令:

bfg --replace-text "C:\Users\sdfly\Desktop\to-be-replaced.txt" --no-blob-protection

其中to-be-replaced.txt格式如下:

pwiCZSMCIcM6+q+h==>REPLACED
861YUaeCHqzaS5OX+OmAK1XD37kmQhA2==>REPLACED

其中左邊是需要替換的值(這里為AWS相關的key),右邊為替換之后的值。

命令執行后,可以運行gitk,可以看到歷史記錄中,東西真的被替換了:

bfg-replace-text-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:\Users\sdfly\Desktop\sensitive-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-push-error

組內其它成員則可以刪除原先的主分支,然后重新拉一個主分支:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM