Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何删除GIT仓库中的敏感信息

如何删除GIT仓库中的敏感信息

作者头像
AI.NET 极客圈
发布于 2019-08-20 03:45:14
发布于 2019-08-20 03:45:14
3.4K00
代码可运行
举报
文章被收录于专栏:AI.NET极客圈AI.NET极客圈
运行总次数:0
代码可运行

1. 前言

正常Git仓库中应该尽量不包含数据库连接/AWS帐号/巨大二进制文件,否则一旦泄漏到Github,这些非常敏感信息会影响客户的信息安全已经公司的信誉。公司可能其它还有相关规定,如禁止私人邮件加入GIT仓库。如果违反这些规定,可能会面临辞退、高额罚款、或牢狱之灾等非常严厉的惩罚。

由于Git的正常操作流程,导致敏感信息一旦进入主分支,再怎么在新的Pull Request中删除,也无能为力了。其它人都能在历史记录中查询到历史记录中的配置。所以这要求对Git的签名和签入、推送要有高度的敬畏之心。

然而根据墨菲定律,可能发生的事情一定会发生。时不时,故意或失手,就会有人将这些信息写到了Git仓库中。如果代码还没有上传(git push),那可能还好说,只要将分支删除,然后重新写一下功能即可。但如果已经上传了,或功能太多太复制没办法及时删除,就会后悔莫及了。

这里我将演示一个故意写满“敏感信息”的Github仓库,然后一步一步演示怎么在历史记录中,删除“敏感信息”,以完成“脱敏”。

1.1 仓库需处理的问题说明

敏感源

敏感原因

处理方法

sdflysha@qq.com

个人邮箱

替换为“公司”邮箱

文件Program.cs

文件敏感

替换文件中的敏感信息

文件夹userSecrets

文件夹敏感

删除

Program.exe

大二进制

删除

这个演示满载“敏感”信息的代码仓库,可以从:https://github.com/sdcb/sensitive-repo-demo 这里下载。

1.2 “敏感”信息演示

  • 个人邮箱签入“公司”项目,可以通过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文件夹)
  • 大二进制文件(见bin\Program.exe)

从以上敏感信息的诚意,可见小编(周杰的DotNet骚操作)为了写这遍文章已经拼了?。

2. 如何删除敏感信息

2.1 前置条件

必须先切换到主分支(一般为master),然后获取最新代码再进行操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git checkout master
git pull

如果有任何修改的对象,都会阻止提交,因此必须先签入所有未提交的本地修改。

2.2 git filter-branch-修改邮箱/用户名

该命令用于解决将个人邮箱/个人用户名签入公司项目。

该命令是Git客户端内置的,不用下载。

2.3 bfg-删除其它信息

bfg([BFG Repo-Cleaner](https://rtyley.github.io/bfg-repo-cleaner/))是个强大的工具,有如下功能:

  • 用于删除文件内敏感信息(不删文件)
  • 删除敏感文件
  • 删除敏感文件夹
  • 删除大二进制文件。

bfg基于Java,安装很繁琐,但通过choco命令,可以快速进行安装:

  1. 先在命令提示符(cmd)下执行如下脚本,安装choco([Chocolatey](https://chocolatey.org/)): @"%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):

重点:执行此命令需要以管理员权限运行cmd。

3. 执行命令,删除敏感信息

3.1 删除个人邮箱签入“公司”项目

执行如下命令即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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_EMAIL项sdflysha@qq.com替换为你的私人(错误)邮箱;
  • 将CORRECT_NAME和CORRECT_EMAIL换成你的公司(正确)邮箱;
  • 该命令不能在命令提示符(cmd)中运行,因为cmd不支持换行命令,否则会出现如下错误:

如果执行正常,将会出现:

此时,运行gitk命令将看到:

可见,所有“私人邮箱”sdflysha@qq.com都正确地替换成为了“公司邮箱”sdflysha@starworks.cc了。

3.2 替换文件中的敏感信息(不删除文件)

命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bfg --replace-text "C:\Users\sdfly\Desktop\to-be-replaced.txt" --no-blob-protection

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pwiCZSMCIcM6+q+h==>REPLACED
861YUaeCHqzaS5OX+OmAK1XD37kmQhA2==>REPLACED

其中左边是需要替换的值(这里为AWS相关的key),右边为替换之后的值。

命令执行后,可以运行gitk,可以看到历史记录中,东西真的被替换了:

3.3 删除敏感文件

命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bfg --delete-files appsettings.Production.json --no-blob-protection

将其中appsettings.Production.json文件替换成你的文件名即可。

注意:删除文件不能带路径名,只能匹配文件本身。

3.4 删除敏感文件夹

命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bfg --delete-folders userSecrets --no-blob-protection

将userSecrets文件夹替换成你的敏感文件夹即可。

3.5 删除二进制大文件

命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git gc
bfg --strip-blobs-bigger-than 150K --no-blob-protection

将150K换成你的二进制文件大小即可。

注意:删除大二进制文件前,运行git gc命令是必须的,否则会报这个错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Warning : no large blobs matching criteria found in packfiles - does the repo need to be packed?

3.6 关于--no-blob-protection

--no-blob-protection是指将历史中删除的记录,放到最新一次未签入的修改中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

这些都是敏感信息或者大文件,根据你的实际情况,可以先备份一下,然后删除:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git reset --hard

4. 推送到远程/其他人获取代码

4.1 推送到远程

此时可以通过:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git push --set-upstream origin master --force

来推送到远程以完成(该命令可能需要你的上级帮你执行,或临时开个权限)。

注意,简单地执行git push(不带--force)是无法推送的,此时会报如下错误:

4.2 其他人获取代码

组内其它成员则可以删除原先的主分支,然后重新拉一个主分支:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git fetch origin
git checkout -b temp-branch
git branch -D master
git checkout origin/master
git checkout -b master

4.3 最后的效果

原版

https://github.com/sdcb/sensitive-repo-demo

脱密版

https://github.com/sdcb/sensitive-repo-demo/tree/cleaned

5. 总结

我们签入Git时应该小心谨慎,但一旦出现问题,只要引起重视,也是可以尽早补救的。上述这些命令可能会中断其它组员的工作,因此一旦出现问题应该尽早汇报给上级,大概率要上级来配合来恢复Git的使用。

当然,提高信息安全意识才是最重要的,事后诸葛亮是费力不讨好。希望各位提高警惕,不要在Git的使用中翻车。

出处:微信公众号【DotNet骚操作】 原文链接:https://www.cnblogs.com/sdflysha/p/20190804-delete-sensitive-info-in-git-repository.html

觉得好看,请点这里↓↓↓

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet技术平台 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Git 修改已提交 commit 的信息
由于 Github 和公司 Git 使用账号不一样,偶尔没注意,提交出错后就需要修改 commit 信息。
叨叨软件测试
2020/10/27
110.1K0
在整个 Git 仓库的历史(包括所有分支和标签)中修改提交作者的信息(姓名和邮箱)
但是现在我计划开源我的一个项目,于是自己个人使用的姓名和邮箱就需要在开源的时候改为使用我公开的姓名和邮箱。对于旧仓库,我将废弃,将来所有的精力都将在开源版本的仓库中;而对于开源版本的新仓库,由于此前没有人克隆过,所以也不会因为历史的修改产生问题。所以,我可以很放心地更改全部的 git 仓库历史。
walterlv
2023/10/22
6590
在整个 Git 仓库的历史(包括所有分支和标签)中修改提交作者的信息(姓名和邮箱)
Git 修改历史 commits 中的用户名和邮箱
修改某个仓库历史 commit 的用户 name 和 email 信息。 将历史提交记录中的指定 name/email 修改为新的 name/email。
用户6808043
2022/02/24
4.5K0
修改Git全部Commit提交记录的用户名Name和邮箱Email
这两天好不容易有空提交一下开源代码了,结果在公司提交的代码有记录,但是没有绿色,延迟?真的要凉
沈唁
2018/10/10
12.4K0
修改Git全部Commit提交记录的用户名Name和邮箱Email
批量修改log中的提交信息
事情的起因是这样的:迷恋的谷歌的我最近申请了一个新的 google 邮箱。然后果断在 github 上更新了邮箱地址,并且删除了之前的 163 等国内邮箱。
心谭博客
2020/04/20
7870
清理 git 仓库太繁琐?试试 bfg!删除敏感信息删除大文件一句命令搞定(比官方文档还详细的使用说明)
你可能接触过 git-filter-branch 来清理 git 仓库,不过同时也能体会到这个命令使用的繁琐,以及其超长的执行时间。
walterlv
2023/10/22
8610
git仓库删除敏感信息
如果不小心再某一次commit了一个含有敏感信息的文件,如公共的数据库配置。然后又不小心上传至github或者其他远程仓库中,那么想要彻底把此文件删除确实不是一件简单的事情。
老高的技术博客
2022/12/28
6930
分享5个Git使用技巧
把原本的pick单词修改为drop就表示该ID对应的 commit log 我们需要删除。vim 保存退出。
杨同学technotes
2023/02/24
2820
分享5个Git使用技巧
BFG Repo-Cleaner - 快速清除Git提交历史中的特定文件
有些时候不小心上传了一些敏感文件(例如密码), 或者不想上传的文件(没及时或忘了加到.gitignore里的),而且上传的文件又特别大的时候, 这将导致别人clone你的代码或下载zip包的时候也必须更新或下载这些无用的文件,因此, 我们需要一个方法, 永久的删除这些文件(包括该文件的历史记录).
白石
2019/08/23
3.2K0
如何删除Git仓库中的敏感文件及其历史记录
因为我开一个新的项目的时候习惯先使用私有仓库,当完善的差不多的时候再转为公开,私有库就随便了些,可能存在一些不合适公开的一些信息,所以需要在转为公开仓库前检查删除一些内容。当然,也有可能是一些私钥等信息因为疏忽,没有加入到.gitignore 文件中,被错误的跟踪了。
桑榆肖物
2023/08/25
7010
如何删除Git仓库中的敏感文件及其历史记录
被吐槽 GitHub仓 库太大,直接 600M 瘦身到 6M,这下舒服了
忙里偷闲学习了点技术写了点demo代码,打算提交到我那 2000Star 的Github仓库上,居然发现有5个Issues,最近的一条日期已经是2022/8/1了,以前我还真没留意过这些,我这人懒得很,本地代码提交成功基本就不管了。
程序员小富
2023/04/11
1.2K0
删除 Git/GitHub 中的敏感数据
今天整理之前的 GitHub 项目,发现自己的一个项目不小心把服务器密钥暴露出来了。幸好是个 private 的库。就着手准备把这个文件删除。
idealclover
2020/03/07
1.6K0
【linux命令讲解大全】013.Git:分布式版本控制系统的先驱和常用命令清单(二)
我还遇到了如下面错误,lab默认给master分支加了保护,不允许强制覆盖。Project(项目)->Setting->Repository 菜单下面的Protected branches把master的保护去掉就可以了。修改完之后,建议把master的保护再加回来,毕竟强推不是件好事。
全栈若城
2024/03/02
1390
教你如何去掉git历史中的敏感信息
本章教大家如何使用 GIT 进行一些关于已提交历史的修改、删除操作。比如碰到下列情况时,如何使用 GIT 实现想要的操作:
信安之路
2018/08/08
2.5K0
教你如何去掉git历史中的敏感信息
git 删除指定文件的历史记录
参考 https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository#purging-a-file-from-your-repositorys-history https://rtyley.github.io/bfg-repo-cleaner/
路过君
2023/11/18
3070
彻底删除Git仓库中的某个文件或文件夹(包括历史记录)
想要彻底删除 Git 仓库中的某个文件或文件夹(包括历史记录)时,可以按照以下步骤操作:
德顺
2024/06/22
1.6K0
从Git仓库的搭建到分支管理【收藏】
原文:https://blog.csdn.net/u014534808/article/details/118631536
入门笔记
2022/06/03
7910
从Git仓库的搭建到分支管理【收藏】
Git目录为什么这么大
本文围绕git的目录过大,从git进行版本控制底层存储出发,简要分析Git目录过大的原因,以及如何处理
仙人技术
2021/08/31
1.4K0
Git目录为什么这么大
防止 Git 泄漏的 5 种最佳做法
之前看过几个新闻,说是因为程序员的疏忽,将公司服务器的密钥上传到 GitHub 上,导致公司数据丢失,造成了很严重的影响,恰巧最近看到一篇英文博客有介绍如何防止 Git 泄露,下面是我的翻译内容,原文来自于 5 Best Practices To Prevent Git Leaks[1],如果有翻译不当的地方欢迎指正,希望能对你有所帮助。
出其东门
2020/04/26
2.1K0
防止 Git 泄漏的 5 种最佳做法
[译]从仓库中移除敏感信息
如果你将敏感数据(如密码或 SSH 密钥)提交到 Git 仓库,你能够将其从历史记录中删除。 要从仓库的历史记录中完全删除不需要的文件,你可以使用 git filter-branch命令或 BFG Repo-Cleaner。
madneal
2022/03/11
1.2K0
推荐阅读
相关推荐
Git 修改已提交 commit 的信息
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验