草庐IT

GitHub 暴露了 SSH 私钥:你需要知道的

科技狠活与软件技术 2023-07-23 原文
每个人都会不时发生泄密事件,即使是像 GitHub 这样的大玩家。这是一个很好的提醒,我们都需要保持警惕。

公司,包括 GitHub。他们最近在他们的博客上发布了关于 SSH 私钥暴露的公告:

[上周,GitHub] 发现 GitHub.com 的 RSA SSH 私钥在公共 GitHub 存储库中被短暂暴露。

该公司向公众保证,该密钥仅用于保护“使用 RSA 通过 SSH 进行的 Git 操作”,这意味着没有内部系统、客户数据或安全 TLS 连接处于风险之中。他们通过检测事件并更改密钥立即做出反应:

“在世界标准时间 3 月 24 日 05:00 左右,出于谨慎考虑,我们更换了用于保护 GitHub.com 的 Git 操作的 RSA SSH 主机密钥。”

因此,影响在时间和范围上都受到限制:“此更改仅影响使用 RSA 通过 SSH 的 Git 操作。如果您使用 ECDSA 或 Ed25519 加密,那么您不会受到影响。 ”,据他们说。

这进一步证明,秘密蔓延不仅仅是由缺乏经验的开发人员或新团队推动的。在我们的State of Secrets Sprawl 2023 报告中,我们发现了超过 10,000,000 个被推送到公共 GitHub 存储库的新秘密。与去年的报告相比,我们检测到的秘密数量增加了 67%,而 GitHub 本身的新帐户只增加了 27%。

检测到的硬编码凭据的增加是由许多因素驱动的,但很明显,参与事件的开发人员的资历从新手到专家,以及来自各种成熟度级别的组织。从我们的报告中,我们发现十分之一的提交者在 2022 年泄露了一个秘密。如果您公开揭露了秘密,那么您肯定不是孤军奋战。GitHub 很好地提醒我们,无论我们的团队有多大,我们都必须在安全实践中保持警惕。

让我们来看看这种情况下的风险是什么,GitHub 如何处理补救过程,以及一些避免公开私钥的简单步骤。

SSH 私钥泄露的风险

GitHub 在他们的帖子后面说:“我们 [替换了我们的 RSA SSH 主机密钥] 以保护我们的用户免受任何攻击者冒充 GitHub 或通过 SSH 窃听他们的 Git 操作的机会。该密钥不授予对 GitHub 基础设施或客户的访问权限数据。”

虽然我们可以对最后一部分感到放心,但不会暴露任何客户数据。还好没有接管他们的基础设施的已知风险,特别是考虑到有多少开发人员和如此多的互联网每天都依赖它。

但“对手冒充 GitHub 或窃听他们的 Git 操作”存在严重风险。这就是所谓的“中间人攻击”,最终用户无法区分合法的另一方和攻击者。

由于有如此多的开发人员和服务依赖 GitHub SSH 通信来实现真正的安全,因此公司吊销和替换他们的 SSH 密钥非常有意义。在同一篇文章中,他们还发布了如果您受到影响需要做什么以及如何判断您是否受到影响。如果在通过 SSH 连接到 GitHub 时收到警告,WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!则需要删除旧密钥或手动更新~/.ssh/known_hosts文件。

您的 GitHub Actions 也可能会受到影响。GitHub 轮换他们的 SSH 私钥将意味着如果他们使用actions/checkoutssh-key 选项,工作流运行将失败。这对于CircleCI 客户来说可能很熟悉,他们因泄漏事件经历过类似的意外工作流程中断。

大量更换的反应和风险

正如预期的那样,开发者社区对该事件有很多公众反应。似乎没有人对这种情况感到高兴。但有些人在没有添加太多评论的情况下帮助传播信息。其他对话推测这可能是如何发生的,以及可能发挥作用的进一步潜在安全问题。在几次谈话中出现的一个问题是新的中间人攻击的可能性。攻击者知道密钥将被许多开发人员使用命令替换,而无需手动验证新指纹是否为预期值。坏人完全有可能在某些情况下插入自己的指纹。ssh-keygen -R github.com这是一个很好的提醒,我们应该拥抱零信任,从“信任,但验证”转变为“验证,然后才信任”的立场。

事件补救的教训

虽然不幸的是,GitHub 需要轮换此证书,影响了如此多的客户,并发布了这样的通知,但我们想强调他们用来响应事件的一些最佳实践。

虽然我们不知道这个秘密暴露了多长时间,但我们可以假设它是最近才出现的。

迅速而谨慎地采取行动,不要惊慌失措,这对于秘密整治至关重要。鉴于他们发布的时间戳,我们可以假设这一事件导致相关团队失眠,他们不得不权衡多种因素。他们似乎认为安全风险值得密钥轮换,即使它可能会影响大量用户。

我们也可以为他们非常迅速和公开的沟通鼓掌。虽然大多数人可能没有订阅 GitHub 博客,但他们将新闻推送到多个渠道尽可能公开。虽然社区中的一些人觉得在使用“我们没有理由相信”或“非常谨慎”等术语时有点过多的“营销旋转”,但 GitHub 团队在他们所有的沟通中一直直截了当安全事件。我们将采取一些温和的措施,而不是没有得到包括补救步骤的概述。

如何防止凭证泄露

没有人是完美的,我们都会不时犯错误。期望人类总是完美地交付只会让你失望,尤其是在处理像 Git 这样概念上复杂的东西时。虽然我们都喜欢世界上最受欢迎的版本控制系统,但大多数开发人员会告诉您,做错事太容易了,例如推送到错误的远程存储库。

虽然我们不知道究竟是什么导致了这一特定事件,但我们想借此机会提醒您一些最佳做法。

永远不要将凭据添加到版本控制

这一点看起来很明显,但我们所有接触代码的人有时都会为此感到内疚。有时,尤其是在调试某些东西时,您只需要测试凭据是否有效。密码、API 密钥以及与之相关的证书都是如此。

您可能会直接在项目中添加一个新证书,完全有意将其移动到安全的地方或修改您的.gitignore文件,但是生活发生了,您会分心。一个git add -A和git commit以后,您的证书现在在您的 git 历史记录中。一个'git push'之后,它现在在共享仓库中。

这就是 git hooks 和ggshield等工具真正派上用场的地方。设置预提交挂钩非常快速和简单。设置完成后,每次提交代码的尝试都将触发扫描,如果在任何跟踪文件中发现秘密,扫描将停止操作。在秘密成为您的 git 历史的一部分之前捕获秘密是补救这种情况的最安全和最便宜的地方。

仔细检查遥控器是否正确

Git 的优势之一是能够轻松地将所有更改推送到您有权连接的任何远程存储库。不幸的是,这很快就会变得混乱。假设您有两个存储库,一个是公共的,一个是私有的,分别具有远程名称 proj-1-p和proj-1-pr。你只差一个字母就可能被推到错误的地方。意外发生。使这些起源名称更明确是一个很好的主意。

许多开发人员处理的另一个因素是他们自己的 shell 别名。例如,通常将别名gpo作为经常键入的快捷方式git push origin。很容易进入自动模式并使用可能将错误分支发送到错误位置的快捷方式。如有疑问,请输入。

经常轮换秘密

虽然此事件可能不需要轮换 SSH 密钥,但您知道上次轮换它是什么时候吗?是这个十年吗?如果您不知道,那么现在是补救的好时机。任何有效凭证存在的时间越长,该凭证被发现和滥用的机会就越大。

我们发现,在秘密管理成熟度方面,更频繁地轮换密钥的团队处于金字塔的顶端,即专家级别。在没有紧急情况的情况下定期轮换证书将使您做好准备,以便在出现这些额外压力时更好地应对。

保持警惕和安全

泄漏有时会发生在我们所有人身上,甚至发生在像 GitHub 这样的大型平台上。虽然可能有许多工作流程受到影响,并且许多开发人员需要更新他们的known_hosts文件,但由于 GitHub 对事件进行了明确的沟通,因此有明确的补救路径,而且我们知道事件的总体范围。

现在也是反思您自己的秘密管理和检测策略的好时机。

有关GitHub 暴露了 SSH 私钥:你需要知道的的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  3. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  4. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  5. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

  6. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  7. ruby - EventMachine - 你怎么知道你是否落后了? - 2

    我正在研究使用EventMachine支持的twitter-streamruby​​gem来跟踪和捕获推文。我对整个事件编程有点陌生。我如何判断我在事件循环中所做的任何处理是否导致我落后?有没有简单的检查方法? 最佳答案 您可以通过使用周期性计时器并打印出耗时来确定延迟。如果您使用的是1秒的计时器,您应该已经过了大约1秒,如果它更长,您就知道您正在减慢react器的速度。@last=Time.now.to_fEM.add_periodic_timer(1)doputs"LATENCY:#{Time.now.to_f-@last}"@

  8. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  9. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  10. 语法类似于 GitHub Flavored Markdown 的 Ruby markdown 解释器? - 2

    我使用Jekyll运行博客,并认为我会解决RedcarpetMarkdown解释器,因为它是developedandusedbyGitHub.好吧,我只是碰巧遇到了一个错误,去检查问题,然后foundthis.Maintainersays,"Asyouprobablyhavenoticed(harharharhar)Idon'thavetimetomaintainRedcarpetanymore.It'snotapriorityforme(IfindMarkdownthoroughlyboring)andit'snotapriorityforGitHub,becausewenolong

随机推荐