登录
  • 人们都希望被别人需要 却往往事与愿违
  • 一个国家的监狱里有一个良心犯, 这个国家就不会有良心; 有二个, 这个国家就让人恶心; 有三个, 这就不是国家; 有四个, 亡国就是解放@昂山素季 (缅甸民运领袖)

不小心把密码上传到GitHub了,怎么办

不知所云 Benny小土豆 3975次浏览 2480字 11个评论
文章目录[显示]
这篇文章在 2017年12月05日10:06:12 更新了哦~

辛辛苦苦写了个脚本,一个兴奋就给推送到GitHub了,然后才反应过来脚本里好像硬编码了帐号密码;根据某某SDK写了个客户端,一下子推送上去发现API Key忘了抹;更有甚者直接把SSHKey推送上去了……

总之就是一不小心把敏感信息推到了版本控制的Git上,可能会马上反应过来,可能过了好几个月才反应过来,那该怎么办呢?本文就将讨论一下已经推送到GitHub之后几种比较可行的方式,希望大家伙都不会有必要读到此文,唉!(如果没推的话,amend啥的就好了)
恰如我在《糟糕的密码》中提到的一样,很多程序员、公司都会犯下类似的错误。啊喂,这可是我最自豪的博文,还不快去看看啊我说!

天啊我真是太喜欢这首歌了,快来听听吧~irony, ironical, ironic,为了防止正在上课的小伙伴被抓到,我把主题的自动播放干掉了哈哈哈~ :mrgreen:

必须要做的后备措施

如果反应过来自己把敏感信息(尤其是帐号密码)推送到了GitHub上,尤其是很长时间之后才发现的,第一件要做的事情是更改掉对应的密码、尽可能的开启两步验证、作废API Key等必要的预备措施。因为我们无法得知究竟有多少人看过、克隆、复刻过仓库,也就无法评估危险等级,只能亡羊补牢了。

在说正确的方法之前,咱先说一说一个大错特错的方法

错误方法一:修改代码中的敏感信息

很多人第一想法可能会是修改代码中的敏感信息,然后commit & push。看似这样是解决了问题,但实际上问题依旧存在,这样做是大错特错的!为何?Git作为一个优秀的版本控制系统,其核心能力就是能够穿梭于每次历史记录(也就是commit),这样做实际上只是在最新的版本库中不存在敏感信息,只要咱checkout下自然就能看到有着敏感信息的那次commit,还有毛用嘛!
类似的办法还有revert啥的,没用的!
不小心把密码上传到GitHub了,怎么办

错误的方法二:置之不理

实际上这不算是一种方法,而是一种态度吧。如果你想成为一名优秀的程序员,那么注重细节、注重安全自然是比较珍贵的素质;同时我敢说大部分人都是一两个密码走天下、没有开启两步验证的,这样暴露密码极大地提高了撞库的机率,渗透的第一步搜集信息就得到了密码。
也许有人会反驳,谁没事干看我仓库读代码?或许真的没有人会无聊到这样,或许有了你也很难发现,但是请允许我介绍一种名为Gitrob的工具。人可能没那么无聊,但是机器可不怕无聊的工作,是吧。

下面咱来说说几个比较可行的方式吧!

方法一:删库

最简单的办法就是删库。确实简单粗暴,对于一些可有可无的仓库来说这应该是最好的处理方法了。对于那些比较珍贵的仓库,这个办法很显然是行不通的。

方法二:通过临时仓库覆盖敏感信息

思路很简单,备份仓库,在敏感信息之前的一次提交创建临时分支,删除有着敏感信息的分支,从临时分支创建新的默认分支,然后再push修改过的代码。如果使用GitHub,可能还需要把默认分支设置成临时分支。如果你使用的是比较方便的图形化Git客户端如Source Tree、GitKraken,那么这一步应该很容易,就不放图了……
这个方法只适用于发现的比较快的、敏感信息之后commit不太多的仓库。如果敏感信息之后commit & push了很多,这就不太方便了。

方法三:使用git filter-branch

git filter-branch的方法其实挺复杂的,而且不是那么方便,推荐大家还是用方法4吧,这个看看就够了。假如咱要从所有的历史记录中删除某个文件,其实就大概这么一句就差不多了

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch sensitive-data.py' --prune-empty --tag-name-filter cat -- --all

这样那个文件的记录就没啦。咱再force push下,远程仓库的就和本地的一样啦。

git push origin --force –all

当然了,如果有必要的话,记得不带敏感信息的代码再推上去。

方法四:使用专用工具BFG Repo-Cleaner

咱能看出来上面的命令听复杂,参数很多,于是就有个兄弟写了个工具来一键解决咱们的问题。主页在这,估计大家都能看懂吧?我再简述一下,假如我的仓库名字为python_test_code,敏感文件的名字为ygmail_test.py的话,

java -jar bfg.jar  --delete-files ygmail_test.py python_test_code

大然后再看下,那么敏感文件就没了,然后再force push就行了~基本上不会有其他问题。

可是这样删除文件好像不太友好呢,有没有办法直接把敏感信息替换成其他内容啊?有啊!

先创建一个名为password.txt的文件,在其中一行一个输入你的敏感信息,比如说密码啦,邮箱啦,等等啦,然后运行这么一句((如果要清除的内容带中文,记得编码为UTF-8哟):

java -jar bfg.jar --replace-text password.txt python_test_code
话说这作者,嗯……我很喜欢,我运行完竟然给我来了一句:

You can rewrite history in Git - don't let Trump do it for real!
Trump's administration has lied consistently, to make people give up on ever
being told the truth. Don't give up: https://www.aclu.org/

当然了,bfg的还可以删除那些仓库历史里的大文件。比如说咱以前上传了几个二进制大文件,然后又删掉再也不需要了,如果clone的话,那么这几个大文件也会跟着一起clone下来的其实。

结语

俺才疏学浅,只能想到这么几种办法了,唉~!不要说我为啥要写这么一篇博文,泪啊!这事我都干了三次了,真是受不了自己的愚蠢了,也亲眼看着其他人干过……某个可爱的小童鞋,抽时间解决了这个安全问题吧。


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://www.bennythink.com/git-password.html
喜欢 (7)
分享:-)
Benny小土豆
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论(代码和日志请使用Pastebin或Gist)
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)
(11)个小伙伴在吐槽
  1. 非常感谢,方法四很好用
    yifan2017-08-23 10:38 回复
    • Benny小土豆
      都是泪啊!
      Benny小土豆2017-08-23 10:41 回复
  2. 另外 CDN 好像挺不受 Privacy Badger 待见的样子 ??
    ホロ2017-05-04 11:13 回复
    • Chromium 的 Console 里一把 Failed to load resource: net::ERR_BLOCKED_BY_CLIENT ??
      ホロ2017-05-04 11:14 回复
      • Benny小土豆
        啊呀!我这有什么mix content?可以详细告知下吗(邮件)
        Benny小土豆2017-05-04 11:17 回复
        • 没多么复杂 只是 Privacy Badger 把 qnssl.com 和 upaiyun.com 的子域名当作潜在的跟踪器给 block 了 ??
          ホロ2017-05-04 12:45
        • Benny小土豆
          ???那没我的事了嘿嘿嘿
          Benny小土豆2017-05-04 14:39
        • 遇到这种情况,你可以到 https://github.com/EFForg/privacybadger 里去提 issue ,要求将 CDN 的域名假如 yellowlist 。 在问题解决之前,你也可以直接将相应的域名的滑块拖动到中间。
          lmath2017-05-04 18:50
  3. 不过不管怎么样目标的密码也要改了吧??
    ホロ2017-04-29 11:30 回复
    • Benny小土豆
      是呀第一个“必须要做的后备措施”里我就说了?赶紧去扫描一圈
      Benny小土豆2017-04-29 11:38 回复