# GitHub Codespaces 中的安全性

安全体系结构概述 GitHub Codespaces ，并指导你维护安全性并最大程度地降低攻击风险。

## 代码空间安全性概述

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

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

### 环境隔离

```
          GitHub Codespaces 旨在使代码空间彼此分开，每个空间都使用自己的虚拟机和网络。
```

#### 隔离的虚拟机

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

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

#### 隔离的网络

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

### 身份验证

可以使用 Web 浏览器或从 Visual Studio Code中连接到代码空间。 如果从 VS Code 连接，会提示你用 GitHub 进行身份验证。

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

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

* ```
          **如果你具有对存储库的写入访问权限**：令牌的作用域将限定为对存储库的读/写访问权限。
  ```
* ```
          **如果只对存储库具有读取访问权限**：令牌将仅允许从源存储库克隆代码。 如果您在代码空间中提交或推送新分支，GitHub Codespaces会自动创建存储库的分叉，或者在您已有用于上游存储库的分叉时，代码空间会链接到现有分叉。 令牌将更新为具有对分支的读取和写入访问权限。 有关详细信息，请参阅“[AUTOTITLE](/codespaces/developing-in-a-codespace/using-source-control-in-your-codespace#about-automatic-forking)”。
  ```
* ```
          **如果已授权 codespace 访问其他存储库：** 令牌的范围将限定为对源存储库以及你已授权访问的任何其他存储库的读取或读取/写入权限。 有关详细信息，请参阅“[AUTOTITLE](/codespaces/managing-your-codespaces/managing-repository-access-for-your-codespaces#authorizing-requested-permissions)”。
  ```

### 代码空间连接

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

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

### 端口转发

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

组织所有者可以对转发端口的可用性施加限制，无论是在公开环境还是组织内部。 有关详细信息，请参阅“[限制转发端口的可见性](/zh/codespaces/managing-codespaces-for-your-organization/restricting-the-visibility-of-forwarded-ports)”。

```
          **专用转发端口：** 可通过 Internet 访问，但只有代码空间创建者才能在进行身份验证 GitHub后访问它们。

          **组织中公开转发的端口：** 可在 Internet 上访问，但在对 GitHub代码空间进行身份验证后，只能访问与代码空间相同的组织成员。

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

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

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

您可以使用“端口”面板为公共或私密访问配置端口，并且可以在不再需要端口转发时停止端口转发。 有关详细信息，请参阅“[代码空间中的转发端口](/zh/codespaces/developing-in-a-codespace/forwarding-ports-in-your-codespace)”。

## 代码空间的良好安全实践

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

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

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

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

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

如果没有对 Codespace 存储库的写权限，则不会将开发环境机密复制到环境中。

有关机密的详细信息，请参阅：
\*
[管理 GitHub Codespaces 的账户专属的机密](/zh/codespaces/managing-your-codespaces/managing-your-account-specific-secrets-for-github-codespaces)
\*
[管理存储库或组织的开发环境机密](/zh/codespaces/managing-codespaces-for-your-organization/managing-development-environment-secrets-for-your-repository-or-organization)

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

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

* 对于私有存储库，代码空间会获得对派生（Fork）和父存储库的访问权限。
* 对于公共存储库，代码空间将只能访问父级上的复刻和打开的 PR。

在这些场景中，我们还通过不向环境中注入任何 codespace 机密来进一步保护你。 有关详细信息，请参阅“[管理 GitHub Codespaces 的账户专属的机密](/zh/codespaces/managing-your-codespaces/managing-your-account-specific-secrets-for-github-codespaces)”。

> \[!NOTE]
> 如果你从只具有只读权限的分叉创建 codespace，然后在 codespace 中提交或推送新分支，codespace 中令牌的作用域可能会改变。 在这种情况下，与任何其他存储库一样， GitHub Codespaces 会自动创建一个新的分叉，或将代码空间链接到帐户拥有的现有分支，并更新令牌以具有对新链接分支的读取和写入访问权限。 有关详细信息，请参阅“[在代码空间中使用源控制](/zh/codespaces/developing-in-a-codespace/using-source-control-in-your-codespace#about-automatic-forking)”。
>
> 将 GitHub Codespaces 连接到现有派生的代码空间时，此现有派生可以是您创建代码空间的派生的派生，也可以是您共享的上游存储库的自己的派生。

### 其他良好做法

使用 GitHub Codespaces时，应注意一些额外的良好做法和风险。

#### 了解存储库的 devcontainer.json 文件

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

有关详细信息，请参阅“[开发容器简介](/zh/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers)”。

#### 通过功能授予访问权限

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

#### 使用扩展

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

#### 使用“设置同步”

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

如果已在用户首选项中启用了设置同步，并且希望允许更改设置以从代码空间同步到其他实例 VS Code，建议添加受信任的存储库的选定列表，而不是信任所有存储库。 从受信任的存储库创建 codespace 时，对 codespace 中的设置所做的更改将同步到云中的缓存设置，这些更改可以从中传输到设备。 有关管理“设置同步”的详细信息，请参阅 [个性化你帐户的 GitHub Codespaces](/zh/codespaces/setting-your-user-preferences/personalizing-github-codespaces-for-your-account#settings-sync)。