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

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命令看到:

    640?wx_fmt=png

  • 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),然后获取最新代码再进行操作:

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):

    640?wx_fmt=png重点:执行此命令需要以管理员权限运行cmd

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

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

执行如下命令即可:

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不支持换行命令,否则会出现如下错误:

    640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

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

命令:

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,可以看到历史记录中,东西真的被替换了:

640?wx_fmt=png

3.3 删除敏感文件

命令:

bfg --delete-files appsettings.Production.json --no-blob-protection

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

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


3.4 删除敏感文件夹

命令:

bfg --delete-folders userSecrets --no-blob-protection

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

3.5 删除二进制大文件

命令:

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?


3.6 关于--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

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

4.1 推送到远程

此时可以通过:

git push --set-upstream origin master --force

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

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

640?wx_fmt=png

4.2 其他人获取代码

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

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骚操作】

640?wx_fmt=jpeg

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core on K8S深入学习(4)你必须知道的Service

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。前面几篇文章我们都是使用的ClusterIP供集群内部访问,每个Pod都有一个自己的IP地址,那么问题来了:当控制器使用新的Pod替代发生故障…

博客园翻车启示录

开发者的日常作为一名996的开发者,我几乎每天只有两件事,制造bug和解决bug,这两件事,既替我解决了温饱问题、也替产品经理、测试工程师等一票人解决了吃穿问题。嗯,有人为我这种程序员评了一个等级,我大概是…

asp.net core 从单机到集群

asp.net core 从单机到集群Intro这篇文章主要以我的活动室预约的项目作为示例,看一下一个 asp.net core 应用从单机应用到集群部署需要做什么。示例项目活动室预约提供了两个版本,集群版和 单机版单机版方便部署,不依赖其他环境,数…

通过Blazor使用C#开发SPA单页面应用程序(3)

通过Blazor使用C#开发SPA单页面应用程序(1)通过Blazor使用C#开发SPA单页面应用程序(2)今天我们来看看Blazor开发的一些基本知识。Blazor中组件的基本结构可以分为3个部分,如下所示://Counter.razor//Directives section 指令部分page "/counter&qu…

ASP.NET CORE 2.* 利用集成测试框架覆盖HttpClient相关代码

ASP.NET CORE 集成测试官方介绍我的asp.net core 项目里面大部分功能都是去调用别人的API ,大量使用HttpClient,公司单元测试覆盖率要求95%以上,很难做到不mock HttpClient 达到这个指数。以下方法是我自己总结的在单元测试里 mock httpClien…

Let's Encrypt网站推出中文版

如今很多网站都强制使用 HTTPS 加密协议访问,安全性有了很大的提高,最起码在数据传输的初始阶段数据包不会被劫持,保证了客户端与服务器端的通讯安全性。说到 HTTPS 加密协议,就不得不提 Let’s Encrypt。Let’s Encrypt 是一家不…

使用WebDeploy部署远程IIS网站

目录 使用WebDeploy部署远程IIS网站后台服务部署服务器配置本地WebDeploy发布文件配置前端页面部署WebDeploy服务端配置WebDeploy发布文件配置使用WebDeploy部署远程网站后台服务部署服务器配置打开IIS管理器(开始->控制面板->管理工具->IIS管理器)添加网站(右键网站…

CF436F Banners(分块/凸包/单调队列)

CF436F Banners 首先有n个物品分别有ai和bi,然后定义价值为 c∗wp∗(ai大于p且bi小于c的用户个数)c*wp*(ai大于p且bi小于c的用户个数)c∗wp∗(ai大于p且bi小于c的用户个数) 然后我们需要求解对于每一个c的最大价值和对应的p 首先我们先枚举c,然后每次加…

译 | 改进 Visual Studio 及 Windows 上 .NET Core 的安装体验

点击上方蓝字关注“汪宇杰博客”原文:Lee Coward翻译:Edi Wang导语Visual Studio 2019 16.3 和 .NET Core 3.0 Preview 7 改进了 Windows 上 .NET Core 的安装体验。目标是减少计算机上可能存在的 .NET Core 版本的数量。这些改进基于客户反馈和我们自己…

SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)

来源:https://www.cnblogs.com/7tiny/p/11348785.html【前言】本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目。目录如下:SonarQube系列一、Linux安装与部署SonarQube系列二、分析dotnet core/C#代码SonarQube系列三、Jen…

CF198D Cube Snake(三维空间/增量构造)

CF198D Cube Snake n<50 显然是一个构造题&#xff0c;然后很容易想到增量构造&#xff0c;可以考虑每次保证一层值域连续&#xff0c;然后再增加一个值域连续的层&#xff0c;就会产生两个值域连续的正方体&#xff0c;但是只移动头是不够的&#xff0c;所以我们还需要移…

发布ABP v0.19包含Angular UI选项

ABP v0.19已发布,包含解决的~90个问题和600次提交.新功能Angular UI终于,ABP有了一个SPA UI选项,使用最新的Angular框架.Angular的集成不是简单地创建了一个启动模板.创建了一个基础架构来处理ABP的模块化,主题和其他一些功能.此基础结构已部署为NPM包.为帐户,身份和租户管理等…

P4151 [WC2011]最大XOR和路径(线性基应用)

P4151 [WC2011]最大XOR和路径 思路 如果单纯的只是树形图&#xff0c;那么答案显然易见只有一种&#xff0c;也就是从头到尾的路径从头到尾的异或值&#xff0c;但是这里不同的就是有可能在道路上有许多的环。 题目有一个重点提示的一句话 理解这句话之后那么我们可以显然…

Docker(一)-CentOS7中安装Docker视频教程

一、前言Docker的使用越来越多&#xff0c;安装也相对简单。本文使用视频的方式展示在CentOS7系统中安装Docker&#xff0c;本文更适合于准备入门学习Docker的童靴&#xff0c;同时也欢迎各路大神给我们指点提建议。二、环境CentOS7三、安装Docker确认Linux内核版本# uname -a卸…

CF773E Blog Post Rating(推导min的通项/线段树)

CF773E Blog Post Rating 现在有一个值F&#xff0c;每次如果序列加入一个数后重新排列&#xff0c;每次如果F小于期望值&#xff0c;就会1&#xff0c;如果等于就不变&#xff0c;如果大于就-1&#xff0c;求解每一次加入后F的最大值。 这道题的确是非常的巧妙&#xff0c;尤…

用Keras.NET 做一个图像识别的训练

.NET Core 的应用场景越来越广&#xff0c;开源社区也不断壮大&#xff0c; .NET Core在机器学习领域不断发展ML.NET外&#xff0c;也通过结合Tensorflow.NET去完善ML.NET在深度学习领域的功能&#xff0c;在ML.NET 1.3开始迈出了非常重要的一步。这不仅是微软拥抱开源的策略&a…

「数据ETL」从数据民工到数据白领蜕变之旅(六)-将Python的能力嫁接到SSIS中...

前一篇推文中&#xff0c;给大家演示了在SSIS上使用dotNET脚本&#xff0c;实现一些原生SSIS难以实现的功能&#xff0c;并冠以无限可能的说法。充分复用python的现有优势python的确是一门非常优秀的编程语言&#xff0c;特别是在数据领域&#xff0c;网络爬虫、数据处理、分析…

.NET Core玩转爬虫系列之借助正则表达式入门篇

接下来一段时间&#xff0c;我会花些时间研究C#玩转爬虫的方法及其实践。话不多说&#xff0c;开始吧~一般来说:设计并实现一个爬虫的步骤是:模拟登录 -> 模拟发送request请求 -> 取回response数据 -> 提取所需信息并将其进行重新组织 -> 存入DB或文件中 -> 后期…

ASP.NET Core on K8S深入学习(5)Rolling Update

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。01—What is Rolling Update?为了服务升级过程中提供可持续的不中断的服务&#xff0c;K8S提供了Rolling Update机制&#xff0c;它可以使得服务近乎无缝地平滑升级&…

依赖注入在 dotnet core 中实现与使用:1 基本概念

关于 Microsoft Extension: DependencyInjection 的介绍已经很多&#xff0c;但是多数偏重于实现原理和一些特定的实现场景。作为 dotnet core 的核心基石&#xff0c;这里准备全面介绍它的概念、原理和使用。这里首先介绍概念部分。1. 概念该项目在 GitHub 的地址&#xff1a;…