Skip to main content

管理部署密钥

了解在自动化部署脚本时管理服务器上的 SSH 密钥的不同方法,以及哪种方法最适合您。

在自动执行部署脚本时,您可以使用 SSH 代理转发、HTTPS 结合 OAuth 令牌、部署密钥或机器用户来管理服务器上的 SSH 密钥。

SSH 代理转发

在许多情况下,尤其是在项目开始时,SSH 代理转发是最快和最简单的方法。 代理转发使用与您的本地开发计算机相同的 SSH 密钥。

SSH 代理转发的优点

  • 无需生成或跟踪任何新密钥。
  • 没有密钥管理;用户在服务器上具有与本地相同的权限。
  • 服务器上没有存储密钥,因此,万一服务器受到破坏,您不需要搜索并删除泄露的密钥。

SSH 代理转发的缺点

  • 用户必须通过 SSH 连接进行部署;无法使用自动部署流程。
  • 为Windows用户运行 SSH 代理转发可能会很麻烦。

设置 SSH 代理转发

  1. 在本地启用代理转接。 有关详细信息,请参阅有关 SSH 代理转发的指南。
  2. 将部署脚本设置为使用代理转发。 例如,在 bash 脚本上,启用代理转发将如下所示:

使用 OAuth 令牌进行 HTTPS 克隆

如果不想使用 SSH 密钥,可以将 HTTPS 与 OAuth 令牌结合使用。

使用 OAuth 令牌进行 HTTPS 克隆的优点

  • 有权访问服务器的任何人都可以部署仓库。
  • 用户不必更改其本地 SSH 设置。
  • 不需要多个令牌(每个用户一个);每个服务器一个令牌就足够了。
  • 令牌可随时撤销,本质上变成一次性密码。

使用 OAuth 令牌进行 HTTPS 克隆的缺点

  • 您必须确保配置您的令牌,并使用正确的访问范围。
  • 令牌本质上是密码,必须以同样的方式进行保护。

设置用于 HTTPS 克隆的 OAuth 令牌

请参阅创建 personal access token 指南。

部署密钥

可以使用部署密钥(即授予对单个存储库的访问权限的 SSH 密钥)从GitHub.com上的存储库启动项目到服务器。 GitHub 将密钥的公共部分直接附加到存储库而不是个人帐户,密钥的私有部分仍保留在服务器上。 有关详细信息,请参阅“交付部署”。

具有写入权限的部署键可以执行与具有管理员权限的组织成员或个人仓库上的协作者相同的操作。 有关详细信息,请参阅 组织的存储库角色个人帐户存储库的权限级别

为了增强安全性和对存储库访问和权限的精细控制,我们建议改用GitHub应用。 请参阅AUTOTITLE。

部署密钥的优点

  • 有权访问仓库和服务器的任何人都能够部署项目。
  • 用户不必更改其本地 SSH 设置。
  • 部署密钥默认为只读,但在将其添加到存储库时可授予它们写入权限。

部署密钥的缺点

  • 部署密钥只授予对单个仓库的访问权限。 较复杂的项目可能要将多个仓库拉取到同一服务器。
  • 部署密钥通常不受密码保护,因此在服务器遭到破坏时可轻松访问密钥。
  • 部署密钥是没有到期日期的凭据。
  • 部署密钥不直接与组织会员资格相关联。 如果从存储库中删除了创建部署密钥的用户,部署密钥仍将处于活动状态,因为它不会绑定到特定用户,而是绑定到存储库。

设置部署密钥

注意

如果你的组织归某企业所有,并且企业所有者限制在存储库中使用部署密钥,则不能替代组织中的策略来创建部署密钥。 有关详细信息,请参阅“AUTOTITLE”。

  1. 在服务器上运行 过程,并记住保存生成的公共和专用 rsa 密钥对的位置。

  2. 在 GitHub 上,导航到存储库的主页面。1. 在仓库名称下,单击 “Settings”****。 如果看不到“设置”选项卡,请选择“”下拉菜单,然后单击“设置”。

    存储库标头的屏幕截图,其中显示了选项卡。 “设置”选项卡以深橙色边框突出显示。

  3. 在边栏中,单击“部署密钥”。

  4. 单击“添加部署密钥”。

  5. 在“标题”字段中,提供标题。

  6. 在“密钥”字段中,粘贴公钥。

  7. 如果希望此密钥具有对存储库的写入权限,请选择“允许写入权限”。 具有写入权限的部署密钥允许将部署推送到仓库。

  8. 单击“添加密钥”。

也可以使用 REST API 创建部署密钥。 有关详细信息,请参阅“AUTOTITLE”。

在一台服务器上使用多个仓库

如果在一台服务器上使用多个仓库,则需要为每个仓库生成专用密钥对。 不能对多个仓库重复使用一个部署密钥。

在服务器的 SSH 配置文件中(通常为 ),为每个存储库添加别名条目。 例如:

Host github.com-repo-0
        Hostname github.com
        IdentityFile=/home/user/.ssh/repo-0_deploy_key

Host github.com-repo-1
        Hostname github.com
        IdentityFile=/home/user/.ssh/repo-1_deploy_key
    • 存储库的别名。
    • 将主机名配置为与别名一起使用。
    • 将私钥分配给别名。

然后可以使用主机名的别名通过 SSH 与仓库进行交互,SSH 将使用分配给该别名的唯一部署密钥。 例如:

git clone git@github.com-repo-1:OWNER/repo-1.git

GitHub App 安装访问令牌

如果服务器需要访问一个或多个组织的存储库,可以使用 GitHub App 来定义所需的访问权限,然后从该 GitHub App 生成范围严格的安装访问令牌。 安装访问令牌可以限定在单个或多个存储库,并且可以具有细致的权限设置。 例如,您可以生成对仓库内容具有只读权限的令牌。

由于 GitHub Apps 是 GitHub 上的一类角色,因此安装访问令牌不限于任何 GitHub 用户,这使它们堪比“服务令牌”。 此外,安装访问令牌有专用的速率限制,随着所服务的组织规模增长而调整。 有关详细信息,请参阅 GitHub Apps 的速率限制。

安装访问令牌的优点

  • 范围严格限制的令牌具有明确定义的权限集和到期时间(默认为 1 小时,或者如果使用 API 手动撤销则为更短时间)
  • 随着您的组织发展而增长的专属速率限制
  • 与 GitHub 用户身份脱钩,因此它们不占用任何许可证
  • 从未授予密码,因此无法直接登录

安装访问令牌的缺点

  • 要创建 GitHub App,需要进行额外的设置。
  • 安装访问令牌 1 小时后过期,因此需要重新生成,通常是按需使用代码。

设置安装访问令牌

  1. 确定 GitHub App 应为公共还是专用。 如果您的 GitHub App 将仅在您组织内的存储库上操作,您可能希望它是私有的。
  2. 确定 GitHub App 所需的权限,例如对存储库内容的只读访问权限。
  3. 通过组织的设置页面创建您的 GitHub App。 有关详细信息,请参阅创建 GitHub App。
  4. 记下 GitHub App 。
  5. 生成并下载 GitHub App 的私钥,并妥善保管。 有关详细信息,请参阅生成私钥。
  6. 将 GitHub App 安装到需要执行它的存储库中,或者,可以在组织中的所有存储库中安装 GitHub App。
  7. 标识与 GitHub App 可以访问的组织存储库之间连接的内容。 每个 GitHub App 和组织对最多有一个 。 可以通过获取经过身份验证的应用的组织安装来标识这一点。 这需要使用 JWT 作为 GitHub App 进行身份验证。有关详细信息,请参阅作为 GitHub App 进行身份验证。
  8. 使用相应的 REST API 终结点生成安装访问令牌,为应用创建安装访问令牌。 这需要使用 JWT 作为 GitHub App 进行身份验证。有关详细信息,请参阅作为 GitHub App 的身份验证,以及作为安装的身份验证。
  9. 使用此安装访问令牌,通过 REST、GraphQL API 或 Git 客户端与存储库进行交互。

有关详细信息,请参阅“AUTOTITLE”。

机器用户

如果服务器需要访问多个存储库,你可以创建一个新的 GitHub.com 帐户并附加专用于自动化的 SSH 密钥。 由于人们不会使用 GitHub.com 上的这个帐户,因此它被称为计算机用户。 可以将机器用户添加为个人存储库上的协作者(授予读取和写入访问权限),或添加为组织存储库上的外部协作者(授予读取、写入或管理员访问权限),或添加到有权访问其需要自动化的存储库的团队(授予团队权限)。

计算机用户的优点

  • 有权访问仓库和服务器的任何人都能够部署项目。
  • 没有(人类)用户需要更改其本地 SSH 设置。
  • 不需要多个密钥;每台服务器一个就足够了。

计算机用户的缺点

  • 只有组织才能将机器用户限制为只读访问。 个人仓库始终授予协作者读取/写入权限。
  • 机器用户密钥(如部署密钥)通常不受密码保护。

设置计算机用户

  1. 在服务器上运行 过程,并将公钥附加到计算机用户帐户。
  2. 授予机器用户帐户访问要自动化的仓库的权限。 可以通过将帐户添加为协作者、外部协作者,或添加到组织中的一个团队来执行此操作。

延伸阅读

  • 配置通知