正常GIT仓库中应该尽量不包含数据库连接/AWS帐号/巨大二进制文件,否则一旦泄漏到Github,这些非常敏感信息会影响客户的信息安全已经公司的信誉。公司可能其它还有相关规定,如禁止私人邮件加入GIT仓库。如果违反这些规定,可能会面临辞退、高额罚款、或牢狱之灾等非常严厉的惩罚。
由于Git的正常操作流程,导致敏感信息一旦进入主分支,再怎么在新的Pull Request中删除,也无能为力了。其它人都能在历史记录中查询到历史记录中的配置。所以这要求对Git的签名和签入、推送要有高度的敬畏之心。
然而根据墨菲定律,可能发生的事情一定会发生。时不时,故意或失手,就会有人将这些信息写到了Git仓库中。如果代码还没有上传(git push),那可能还好说,只要将分支删除,然后重新写一下功能即可。但如果已经上传了,或功能太多太复制没办法及时删除,就会后悔莫及了。
这里我将演示一个故意写满“敏感信息”的Github仓库,然后一步一步演示怎么在历史记录中,删除“敏感信息”,以完成“脱敏”。
仓库需处理的问题说明:
这个演示满载“敏感”信息的代码仓库,可以从: 这里下载。
“敏感”信息演示:
- 个人邮箱签入“公司”项目,可以通过gitk命令看到:
- AWS Key配置写在代码中(见Program.cs):
- 生产环境配置文件(见a):
- 敏感信息文件夹(见userSecrets文件夹)
- 大二进制文件(见bin\Program.exe)
从以上敏感信息的诚意,可见小编(周杰的DotNet骚操作)为了写这遍文章已经拼了。
如何删除敏感信息
前置条件
必须先切换到主分支(一般为master),然后获取最新代码再进行操作:
git checkout master git pull如果有任何修改的对象,都会阻止提交,因此必须先签入所有未提交的本地修改。
git filter-branch——删除邮箱/用户名
该命令用于解决将个人邮箱/个人用户名签入公司项目。
该命令是Git客户端内置的,不用下载。
bfg——删除其它信息
bfg(BFG Repo-Cleaner)是个强大的工具,有如下功能:
- 用于删除文件内敏感信息(不删文件)
- 删除敏感文件
- 删除敏感文件夹
- 删除大二进制文件。
bfg基于Java,安装很繁琐,但通过choco命令,可以快速进行安装:
- 先在命令提示符(cmd)下执行如下脚本,安装choco(Chocolatey):
- 再使用choco命令安装bfg工具(需要管理员权限):
- 期间,它会自动下载JRE等组件,执行效果如下(需要按多次Y/Yes):
- 重点:执行此命令需要以管理员权限运行cmd。
执行命令,删除敏感信息
删除个人邮箱签入“公司”项目
执行如下命令即可:
git filter-branch --env-filter ' OLD_EMAIL="sdflysha@qq.com" CORRECT_NAME="sdflysha" CORRECT_EMAIL="sdflysha@; 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项sdflysha@qq.com替换为你的私人(错误)邮箱;
- 将CORRECT_NAME和CORRECT_EMAIL换成你的公司(正确)邮箱;
- 该命令不能在命令提示符(cmd)中运行,因为cmd不支持换行命令,否则会出现如下错误:
如果执行正常,将会出现:
此时,运行gitk命令将看到:
可见,所有“私人邮箱”sdflysha@qq.com都正确地替换成为了“公司邮箱”sdflysha@了。
替换文件中的敏感信息(不删除文件)
命令:
bfg --replace-text "C:\Users\sdfly\Desktop\; --no-blob-protection其中格式如下:
pwiCZSMCIcM6+q+h==>REPLACED 861YUaeCHqzaS5OX+OmAK1XD37kmQhA2==>REPLACED其中左边是需要替换的值(这里为AWS相关的key),右边为替换之后的值。
命令执行后,可以运行gitk,可以看到历史记录中,东西真的被替换了:
删除敏感文件
命令:
bfg --delete-files a --no-blob-protection将其中a文件替换成你的文件名即可。
注意:删除文件不能带路径名,只能匹配文件本身。
删除敏感文件夹
命令:
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: a new file: bin deleted: bin.REMOVED.git-id new file: userSecre new file: userSecre这些都是敏感信息或者大文件,根据你的实际情况,可以先备份一下,然后删除:
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最后的效果
(已脱密)/tree/cleaned
对比:
(原版)
总结
我们签入Git时应该小心谨慎,但一旦出现问题,只要引起重视,也是可以尽早补救的。上述这些命令可能会中断其它组员的工作,因此一旦出现问题应该尽早汇报给上级,大概率需要上级来配合来恢复Git的使用。
当然,提高信息安全意识才是最重要的,事后诸葛亮是费力不讨好。希望各位提高警惕,不要在Git的使用中翻车。
来源:
1.《861怎么彻底卸载》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《861怎么彻底卸载》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/why/2200604.html