[参考]删除已经上传到GitHub上的敏感信息
删除已经上传到GitHub上的敏感信息
偶尔会有失手的时候把诸如用户信息、accesskey啥的传到GitHub的代码页中。一次commit可能会导致自己的信息泄露。为了杜绝这种问题,可以使用BFG工具删除敏感文件。
保护信息安全,从commit做起。
Github官方指引:从存储库中删除敏感数据 - GitHub Docs
准备工作
-
保存现有的所有代码,最好先进行一次commit确保本地的所有代码已经同步到云端。然后在本地做好备份,例如将repo文件夹打包成zip妥善保存防止代码丢失。
-
删除整个repo(这一步是为了清洁起见,也可以不删除)
-
在任意位置创建一个新文件夹,用于存放从GitHub上git clone下来的mirror文件
mkdir {new_folder}
-
使用下述指令
注意--mirror
不能掉cd {new_folder} git clone --mirror https://github.com/{your_name}/{your_repo.git}
等待git从服务器获取repo的数据。这里获取的数据不是代码页,也不是整个项目的项目文件,而是git的数据库。可以对生成的文件夹进行备份。
这一步如果出现诸如
Failed to connect to github.com port 443 after 21082 ms: Timed out error: RPC failed; curl 28 OpenSSL SSL_read: Connection was reset, errno 10054 fatal: expected flush after ref listing
的错误,请检查你的代理设置。注意让git也走代理就可以了。
删除敏感信息
从BFG Repo-Cleaner by rtyley下载BFG,下载将得到一个jar文件。将此jar文件存放在任何位置。推荐存放在创建的新文件夹{new_folder}
下,便于执行命令。
-
删除敏感文件:
存在一个
authentication.txt
的明文密码存储文件要删除,则使用指令(此指令的前提是{your_repo}.git
文件夹和bfg.jar
在同级目录java -jar bfg.jar --delete-files authentication.txt {your_repo.git}
指令也可以使用正则表达式。下述指令将删除authentication.txt、authentication.key....等一系列文件
java -jar bfg.jar --delete-files authentication.{txt,key,db,anything} {your_repo.git}
执行将显示
Found 15 objects to protect Found 2 commit-pointing refs : HEAD, refs/heads/master Protected commits ----------------- These are your protected commits, and so their contents will NOT be altered: * commit abcdef01 (protected by 'HEAD') Cleaning -------- Found 7 commits Cleaning commits: 100% (7/7) Cleaning commits completed in 138 ms. Updating 1 Ref -------------- Ref Before After --------------------------------------- refs/heads/master | abcdef01 | abcdef02 Updating references: 100% (1/1) ...Ref update completed in 15 ms. Commit Tree-Dirt History ------------------------ Earliest Latest | | . D D m m m m D = dirty commits (file tree fixed) m = modified commits (commit message or parents changed) . = clean commits (no changes to file tree) Before After ------------------------------------------- First modified commit | abcdef01 | abcdef02 Last dirty commit | abcdef03 | abcdef04 Deleted files ------------- Filename Git id -------------------------------- authentication.txt | 01010101 (44.3 KB) In total, 9 object ids were changed. Full details are logged here: ...\2022-09-13\21-04-40 BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive
即删除成功
-
替换敏感字段
存在一些密码被散落在各种源码中,现在存在password.txt里。只需执行
java -jar bfg.jar --replace-text passwords.txt {your_repo.git}
即可将此文件出现的密码全部置换为
***REMOVED***
-
删除文件夹
删除所有命名为
.git
的文件夹java -jar bfg.jar --delete-folders .git --delete-files .git --no-blob-protection {your_repo.git}
-
删除大文件
删除超过50MB的大文件
java -jar bfg.jar --strip-blobs-bigger-than 50M {your_repo.git}
更新服务器
只需要执行就能更新云端的commit,敏感信息一去不返。
git reflog expire --expire=now --all && git gc --prune=now --aggressive
我的习惯是这之后再push一下
git push
一切就绪!
作者发布、转载的任何文章中所涉及的技术、思路、工具仅供以安全目的的学习交流,并严格遵守《中华人民共和国网络安全法》、《中华人民共和国数据安全法》等网络安全法律法规。
任何人不得将技术用于非法用途、盈利用途。否则作者不对未许可的用途承担任何后果。
本文遵守CC BY-NC-SA 3.0协议,您可以在任何媒介以任何形式复制、发行本作品,或者修改、转换或以本作品为基础进行创作
您必须给出适当的署名,提供指向本文的链接,同时标明是否(对原文)作了修改。您可以用任何合理的方式来署名,但是不得以任何方式暗示作者为您或您的使用背书。
同时,本文不得用于商业目的。混合、转换、基于本作品进行创作,必须基于同一协议(CC BY-NC-SA 3.0)分发。
如有问题, 可发送邮件咨询.