Codespace 安全性概述
GitHub Codespaces 旨在默认情况下进行安全强化。因此,您需要确保您的软件开发实践不会降低 Codespace 的安全态势。
本指南介绍了 GitHub Codespaces 保护开发环境安全的方式,并提供了一些有助于在您工作时维护安全性的良好实践。与任何开发工具一样,请记住,您应该只打开和处理您了解并信任的存储库。
环境隔离
GitHub Codespaces 旨在使您的 Codespaces 相互分离,每个 Codespaces 使用自己的虚拟机和网络。
隔离的虚拟机
每个 Codespace 都托管在其自己的新构建的虚拟机 (VM) 上。两个 Codespaces 永远不会共存于同一台 VM 上。
每次您重新启动 Codespace 时,它都会部署到具有最新可用安全更新的新 VM 上。
隔离的网络
每个 Codespace 都有其自己的隔离虚拟网络。我们使用防火墙阻止来自互联网的传入连接,并防止 Codespaces 在内部网络上相互通信。Codespaces 允许建立到互联网的出站连接。
身份验证
您可以使用 Web 浏览器或从 Visual Studio Code 连接到 Codespace。如果您从 VS Code 连接,系统会提示您使用 GitHub 进行身份验证。
每次创建或重新启动 Codespace 时,都会分配一个新的 GitHub 令牌,并具有自动过期时间。此时间段允许您在 Codespace 中工作,而无需在典型的工作日内重新进行身份验证,但可以降低您在停止使用 Codespace 时保持连接打开的可能性。
令牌的范围将根据您对创建 Codespace 的存储库的访问权限而有所不同。
- 如果您对存储库具有写入权限:该令牌的范围将是存储库的读写访问权限。
- 如果您仅对存储库具有读取权限:该令牌仅允许克隆源存储库中的代码。如果您在 Codespace 中进行提交或推送新分支,GitHub Codespaces 会自动创建存储库的分支,或者如果您的上游存储库已存在分支,则将 Codespace 链接到现有分支。令牌将更新为对分支具有读写访问权限。有关更多信息,请参阅“在 Codespace 中使用源代码管理”。
- 如果您已授权 Codespace 访问其他存储库:该令牌的范围将是源存储库以及您已授权访问的任何其他存储库的读取或读写访问权限。有关更多信息,请参阅“管理 Codespace 中其他存储库的访问权限”。
Codespace 连接
您可以使用 GitHub Codespaces 服务提供的 TLS 加密隧道连接到您的 Codespace。只有 Codespace 的创建者才能连接到 Codespace。连接通过 GitHub 进行身份验证。
如果您需要允许外部访问在 Codespace 上运行的服务,您可以启用端口转发以进行私有或公共访问。
端口转发
如果您需要连接到在 Codespace 中运行的服务(例如开发 Web 服务器),您可以配置端口转发以使该服务可用于互联网。
组织所有者可以限制公开或在组织内转发端口的功能。有关更多信息,请参阅“限制转发端口的可见性”。
私有转发端口:可在互联网上访问,但只有 Codespace 创建者在经过 GitHub 身份验证后才能访问。
组织内的公共转发端口:可在互联网上访问,但只有与 Codespace 位于同一组织的成员在经过 GitHub 身份验证后才能访问。
公共转发端口:可在互联网上访问,并且互联网上的任何人都可以访问它们。访问公共转发端口不需要身份验证。
默认情况下,所有转发端口都是私有的,这意味着您需要进行身份验证才能访问该端口。对 Codespace 的私有转发端口的访问由具有 3 小时过期时间的身份验证 Cookie 控制。当 Cookie 过期时,您需要重新进行身份验证。
当您移除并重新添加端口或重新启动 Codespace 时,公共转发端口将自动恢复为私有。
您可以使用“端口”面板配置端口以进行公共或私有访问,并在不再需要时停止端口转发。有关更多信息,请参阅“在 Codespace 中转发端口”。
Codespace 的良好安全实践
Codespace 旨在默认情况下进行安全强化。为了帮助维持这种状态,我们建议您在开发过程中遵循良好的安全实践。
- 与任何开发工具一样,请记住,您应该只打开和处理您了解并信任的存储库。
- 在将新的依赖项添加到 Codespace 之前,请检查它们是否得到良好维护,以及它们是否发布更新以修复在其代码中发现的任何安全漏洞。
使用开发环境机密访问敏感信息
当您希望在 Codespace 中使用敏感信息(例如访问令牌)时,始终使用开发环境机密。您可以将机密作为 Codespace 中的环境变量访问,包括从终端访问。例如,您可以在 Codespace 中启动终端并使用 echo $SECRET_NAME
查看开发环境机密的价值。
每当恢复或创建 Codespace 时,机密值都会复制到环境变量中,并且在更改时也会同步。
如果您没有对 Codespace 的存储库的写入访问权限,则开发环境机密不会复制到环境中。
有关机密的更多信息,请参阅
使用其他人的贡献和存储库
当您从分支的分支 PR 创建 Codespace 时,Codespace 中的令牌将根据存储库是公共的还是私有的而有所不同。
- 对于私有存储库,Codespace 将被授予对分支和父存储库的访问权限。
- 对于公共存储库,Codespace 仅具有对分支的访问权限,并在父存储库上打开 PR。
在这些情况下,我们还会通过不将任何 Codespace 机密注入环境来进一步保护您。有关更多信息,请参阅“管理您针对 GitHub Codespaces 的帐户特定机密”。
注意
如果您从您仅具有读取访问权限的分支创建 Codespace,然后在 Codespace 中进行提交或推送新分支,则 Codespace 中令牌的范围可能会更改。在这种情况下,与任何其他存储库一样,GitHub Codespaces 会自动创建一个新的分支,或将您的 Codespace 链接到您的帐户拥有的现有分支,并将令牌更新为对新链接的分支具有读写访问权限。有关更多信息,请参阅“在 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 中对设置所做的更改会同步到云中的缓存设置,然后这些设置可以传输到您的设备。有关管理设置同步的更多信息,请参阅“个性化 GitHub Codespaces 以满足您的帐户需求”。