Skip to main content

GitHub Codespaces 中的安全性

GitHub Codespaces 安全体系结构概述,包括可帮助你维护安全性并最大限度地降低攻击风险的指导原则。

代码空间安全性概述

默认情况下,GitHub Codespaces 设计为加强安全性。 因此,您需要确保您的软件开发实践不会降低代码空间的安全状况。

本指南介绍了 GitHub Codespaces 保持开发环境安全的方式,并提供了一些有助于在工作时维护安全性的良好做法。 与任何开发工具一样,请记住,您只应在您了解和信任的存储库中打开和工作。

环境隔离

GitHub Codespaces 旨在使 codespace 彼此独立,每个 codespace 都使用自己的虚拟机和网络。

隔离的虚拟机

每个代码空间都托管在其自己的新建虚拟机 (VM) 上。 两个代码空间永远不会共存于同一 VM 上。

每次重新启动代码空间时,都会将其部署到具有最新可用安全更新的新 VM。

隔离的网络

每个代码空间都有自己隔离的虚拟网络。 我们使用防火墙来阻止来自互联网的传入连接,并防止代码空间在内部网络上相互通信。 默认情况下,允许代码空间与互联网建立出站连接。

身份验证

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

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

令牌的作用域将根据您对创建代码空间的存储库的访问权限而有所不同:

  • 如果你具有对存储库的写入访问权限:令牌的作用域将限定为对存储库的读/写访问权限。
  • 如果只对存储库具有读取访问权限:令牌将仅允许从源存储库克隆代码。 如果在 codespace 进行提交,或者推送新分支,GitHub Codespaces 自动创建存储库分支,或者将 codespace 链接到现有分支(如果你已为上游存储库创建一个分支)。 令牌将更新为具有对分支的读取和写入访问权限。 有关详细信息,请参阅“在代码空间中使用源控制”。
  • 如果已授权 codespace 访问其他存储库:令牌的范围将限定为对源存储库以及你已授权访问的任何其他存储库的读取或读取/写入权限。 有关详细信息,请参阅“管理对代码空间中其他存储库的访问权限”。

代码空间连接

你可以使用 GitHub Codespaces 服务提供的 TLS 加密隧道连接到 codespace。 只有代码空间的创建者才能连接到代码空间。 使用 GitHub 对连接进行验证。

如果需要允许对代码空间上运行的服务进行外部访问,可以为专用或公共访问启用端口转发。

端口转发

如果需要连接到在代码空间内运行的服务(如开发 Web 服务器),则可以配置端口转发以使该服务在互联网上可用。

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

专用转发端口:可通过 Internet 访问,但仅供 codespace 创建者访问(在对 GitHub 进行身份验证后)。

组织内公开转发的端口:可通过 Internet 访问,但仅供与 codespace 相同组织的成员访问(在对 GitHub 进行身份验证后)。

公开转发的端口:可通过 Internet 访问,Internet 上的任何人都可以访问它们。 访问公共转发的端口不需要身份验证。

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

当您删除并重新添加端口时,或者重新启动代码空间时,公共转发端口将自动恢复为私密端口。

您可以使用“端口”面板为公共或私密访问配置端口,并且可以在不再需要端口转发时停止端口转发。 有关详细信息,请参阅“代码空间中的转发端口”。

代码空间的良好安全实践

默认情况下,代码空间设计为加强安全性。 为了帮助保持此状态,我们建议您在开发过程中遵循良好的安全实践:

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

使用机密访问敏感信息

如果要在 codespace 中使用敏感信息(如访问令牌),请始终使用机密。 您可以在代码空间中以环境变量的形式访问您的机密,包括从终端访问。 例如,你可以在 codespace 中启动终端,并使用 echo $SECRET_NAME 查看机密的值。

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

如果没有对 codespace 存储库的写入访问权限,则不会将机密复制到环境中。

有关机密的详细信息,请参阅:

使用其他人的贡献和存储库

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

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

在这些场景中,我们还通过不向环境中注入任何 codespace 机密来进一步保护你。 有关详细信息,请参阅“管理 codespace 的机密”。

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

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

其他良好做法

使用 GitHub Codespaces 时,还应关注一些其他良好做法和风险。

了解存储库的 devcontainer.json 文件

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

有关详细信息,请参阅“开发容器简介”。

通过功能授予访问权限

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

使用扩展

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

使用“设置同步”

VS Code 的“设置同步”支持跨设备传输潜在的恶意内容。 默认情况下,对于在浏览器中打开的 codespace,将禁用“设置同步”。 如果要为其内容不受信任的存储库创建 codespace,则应在浏览器中打开 codespace 并关闭“设置同步”。

如果在用户首选项中启用了“设置同步”,并且你希望允许对设置进行更改以从 codespace 同步到 VS Code 的其他实例,建议添加所选的受信任存储库列表,而不是信任所有存储库。 从受信任的存储库创建 codespace 时,对 codespace 中的设置所做的更改将同步到云中的缓存设置,这些更改可以从中传输到设备。 有关管理“设置同步”的详细信息,请参阅“Personalizing GitHub Codespaces for your account”。