跳至主要内容

GitHub Codespaces 中的安全性

GitHub Codespaces 安全架构概述,其中包含帮助您维护安全性并最大程度降低攻击风险的指南。

Codespace 安全概述

GitHub Codespaces 旨在默认情况下进行安全强化。因此,您需要确保您的软件开发实践不会降低 Codespace 的安全态势。

本指南介绍了 GitHub Codespaces 如何确保您的开发环境安全,并提供了一些有助于您在工作中维护安全性的最佳实践。与任何开发工具一样,请记住,您只应打开和处理您了解并信任的存储库。

环境隔离

GitHub Codespaces 旨在将您的 Codespaces 相互隔离,每个 Codespaces 使用自己的虚拟机和网络。

隔离的虚拟机

每个 Codespaces 都托管在自己的全新虚拟机 (VM) 上。两个 Codespaces 永远不会共存于同一台 VM 上。

每次您重新启动 Codespaces 时,它都会部署到具有最新可用安全更新的新 VM 上。

隔离的网络

每个 Codespaces 都有自己的隔离虚拟网络。我们使用防火墙阻止来自互联网的传入连接,并防止 Codespaces 在内部网络上相互通信。Codespaces 被允许建立到互联网的传出连接。

身份验证

您可以使用 Web 浏览器或从 Visual Studio Code 连接到 Codespaces。如果您从 VS Code 连接,系统会提示您使用 GitHub 进行身份验证。

每次创建或重新启动 Codespaces 时,都会为其分配一个新的 GitHub 令牌,该令牌具有自动到期时间。此时间段允许您在 Codespaces 中工作,而无需在典型工作日内重新进行身份验证,但这会降低您在停止使用 Codespaces 时保持连接打开的可能性。

令牌的范围将根据您对创建 Codespaces 的存储库的访问权限而有所不同。

  • 如果您对存储库具有写入权限:令牌的范围将是针对存储库的读写访问权限。
  • 如果您只对存储库具有读取权限:令牌将只允许从源存储库克隆代码。如果您在 Codespaces 中进行提交或推送新分支,GitHub Codespaces 会自动创建存储库的分支,或者如果您已经为上游存储库创建了分支,则将 Codespaces 链接到现有分支。令牌将更新为对分支具有读写访问权限。有关更多信息,请参阅“在您的 Codespaces 中使用源代码控制”。
  • 如果您已授权您的 Codespace 访问其他存储库:该令牌将被授予对源存储库以及您已授权访问的任何其他存储库的读或读/写访问权限。有关更多信息,请参阅“管理 Codespace 中对其他存储库的访问权限”。

Codespace 连接

您可以使用 GitHub Codespaces 服务提供的 TLS 加密隧道连接到您的 Codespace。只有 Codespace 的创建者才能连接到 Codespace。连接通过 GitHub 进行身份验证。

如果您需要允许外部访问在 Codespace 上运行的服务,您可以启用端口转发以进行私有或公共访问。

端口转发

如果您需要连接到在您的 Codespace 中运行的服务(例如开发 Web 服务器),您可以配置端口转发以使该服务在互联网上可用。

组织所有者可以限制公开或在组织内提供转发端口的能力。有关更多信息,请参阅“限制转发端口的可见性”。

私有转发端口:在互联网上可访问,但只有 Codespace 创建者在通过 GitHub 进行身份验证后才能访问。

组织内的公共转发端口:在互联网上可访问,但只有与 Codespace 相同组织的成员在通过 GitHub 进行身份验证后才能访问。

公共转发端口:在互联网上可访问,互联网上的任何人都可以访问它们。访问公共转发端口不需要身份验证。

所有转发端口默认情况下都是私有的,这意味着您需要进行身份验证才能访问该端口。对 Codespace 的私有转发端口的访问由具有 3 小时过期时间的身份验证 Cookie 控制。当 Cookie 过期时,您需要重新进行身份验证。

当您删除并重新添加端口或重新启动 Codespace 时,公共转发端口将自动恢复为私有。

您可以使用“端口”面板将端口配置为公共或私有访问,并在不再需要时停止端口转发。有关更多信息,请参阅“在您的 Codespace 中转发端口”。

代码空间安全最佳实践

代码空间默认设计为安全加固。为了帮助您保持这种状态,我们建议您在开发过程中遵循良好的安全实践。

  • 与任何开发工具一样,请记住,您应该只打开和处理您了解并信任的存储库。
  • 在将新依赖项添加到代码空间之前,请检查它们是否得到良好维护,以及它们是否发布更新以修复其代码中发现的任何安全漏洞。

使用开发环境机密访问敏感信息

当您想在代码空间中使用敏感信息(例如访问令牌)时,始终使用开发环境机密。您可以将机密作为环境变量访问代码空间,包括从终端访问。例如,您可以在代码空间中启动一个终端,并使用echo $SECRET_NAME查看开发环境机密的价值。

每当代码空间恢复或创建时,机密值都会复制到环境变量中,并且在更改时也会同步。

如果您没有对代码空间存储库的写入权限,则开发环境机密不会复制到环境中。

有关机密的更多信息,请参阅

处理他人的贡献和存储库

当您从分支的 PR 创建代码空间时,代码空间中的令牌将根据存储库是公开还是私有而有所不同。

  • 对于私有存储库,代码空间被授予对分支和父存储库的访问权限。
  • 对于公共存储库,代码空间将只对分支和在父存储库上打开 PR 具有访问权限。

在这些情况下,我们还通过不将任何代码空间机密注入环境来进一步保护您。有关更多信息,请参阅 "管理您针对 GitHub 代码空间的特定于帐户的机密"。

注意:如果您从一个您只有读取权限的分支创建了一个 codespace,然后在 codespace 中进行提交或推送新的分支,那么 codespace 中的令牌范围可能会发生变化。在这种情况下,与任何其他存储库一样,GitHub Codespaces 会自动创建一个新的分支,或将您的 codespace 链接到您帐户拥有的现有分支,并将令牌更新为对新链接的分支具有读写权限。有关更多信息,请参阅“在您的 codespace 中使用源代码控制”。

当 GitHub Codespaces 将您的 codespace 链接到现有分支时,此现有分支可以是您创建 codespace 的分支的分支,也可以是您自己对共享上游存储库的分支。

其他良好做法

在使用 GitHub Codespaces 时,您应该了解一些额外的良好做法和风险。

了解存储库的 devcontainer.json 文件

当您创建 codespace 时,如果在您的存储库中找到了 devcontainer.json 文件,它将被解析并用于配置您的 codespace。devcontainer.json 文件可以包含强大的功能,例如安装第三方扩展和运行在 postCreateCommand 中提供的任意代码。

有关更多信息,请参阅“Dev 容器简介”。

通过功能授予访问权限

某些开发功能可能会给您的环境带来风险。例如,提交签名、注入到环境变量中的机密、经过身份验证的注册表访问和包访问都可能存在潜在的安全问题。我们建议您只授予需要访问权限的人员访问权限,并采用尽可能严格的策略。

使用扩展

您安装的任何其他 VS Code 扩展都可能带来更多风险。为了帮助降低此风险,请确保您只安装受信任的扩展,并且始终保持最新状态。

使用设置同步

VS Code 的设置同步可能允许潜在的恶意内容在设备之间传输。默认情况下,在浏览器中打开的 codespace 的设置同步已禁用。如果您要为一个您不信任其内容的存储库创建 codespace,则应在浏览器中打开 codespace 并保持设置同步关闭。

如果您已在用户偏好设置中启用设置同步,并且希望允许对设置的更改从您的 Codespaces 同步到其他 VS Code 实例,我们建议您添加一个选定的受信任存储库列表,而不是信任所有存储库。当您从受信任存储库创建 Codespaces 时,您在 Codespaces 中对设置所做的更改将同步到您在云中的缓存设置,然后从那里传输到您的设备。有关管理设置同步的更多信息,请参阅“个性化您的 GitHub Codespaces 帐户”。