我们经常发布文档更新,此页面的翻译可能仍在进行中。有关最新信息,请访问英文文档。如果此页面上的翻译有问题,请告诉我们

此版本的 GitHub Enterprise 已停止服务 2021-03-02. 即使针对重大安全问题,也不会发布补丁。 要获得更好的性能、改进的安全性和新功能,请升级到 GitHub Enterprise 的最新版本。 如需升级方面的帮助,请联系 GitHub Enterprise 支持

管理部署密钥

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

本文内容

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

SSH 代理转发

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

优点
  • 无需生成或跟踪任何新密钥。
  • 没有密钥管理;用户在服务器上具有与本地相同的权限。
  • 服务器上没有存储密钥,因此,万一服务器受到破坏,您不需要搜索并删除泄露的密钥。
缺点
  • 用户必须通过 SSH 进行部署;不能使用自动部署过程。
  • 对于 Windows 用户来说,使用 SSH 代理转发可能比较麻烦。
设置
  1. 在本地开启代理转发。 更多信息请参阅我们的 SSH 代理转发指南
  2. 将部署脚本设置为使用代理转发。 例如,在 bash 脚本中,启用代理转发如下所示:ssh -A serverA 'bash -s' < deploy.sh

使用 OAuth 令牌进行 HTTPS 克隆

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

优点
  • 有权访问服务器的任何人都可以部署仓库。

  • 用户不必更改其本地 SSH 设置。

  • 不需要多个令牌(每个用户一个);每个服务器一个令牌就足够了。

  • 令牌可随时撤销,本质上变成一次性密码。

  • 可以使用 OAuth API 轻松编写生成新令牌的脚本。

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

请参阅使用令牌的 Git 自动化指南

部署密钥

您可以使用部署密钥从 GitHub Enterprise Server 仓库启动项目到服务器,部署密钥是授予访问单个仓库的 SSH 密钥。 GitHub Enterprise Server 将密钥的公共部分直接附加到仓库而不是个人用户帐户,密钥的私有部分仍保留在服务器上。 更多信息请参阅“交付部署”。

具有写入权限的部署键可以执行与具有管理员权限的组织成员或个人仓库上的协作者相同的操作。 更多信息请参阅“组织的仓库权限级别”和“用户帐户仓库的权限级别”。

优点
  • 有权访问仓库和服务器的任何人都能够部署项目。
  • 用户不必更改其本地 SSH 设置。
  • 默认情况下,部署密钥是只读的,但在将它们添加到仓库时,您可以授予其写入权限。
缺点
  • 部署密钥只授予对单个仓库的访问权限。 较复杂的项目可能要将多个仓库拉取到同一服务器。
  • 部署密钥通常不受密码保护,因此在服务器遭到破坏时可轻松访问密钥。
设置
  1. 在服务器上运行 ssh-keygen 进程,并记住保存生成的公共/私有 RSA 密钥对的位置。
  2. 在 GitHub Enterprise Server 的右上角,单击您的个人资料照片,然后单击 Your profile(您的个人资料)
    个人资料导航
  3. 在个人资料页面上,单击 Repositories(仓库),然后单击仓库的名称。
    仓库链接
  4. 在仓库中,单击 Settings(设置)
    仓库设置
  5. 在边栏中,单击 Deploy Keys(部署密钥),然后单击 Add deploy key(添加部署密钥)
    添加部署密钥链接
  6. 提供标题,粘贴到公钥中。
    部署密钥页面
  7. 如果希望此密钥拥有对仓库的写入权限,请选择 Allow write access(允许写入权限)。 具有写入权限的部署密钥允许将部署推送到仓库。
  8. 单击 Add key(添加密钥)
在一台服务器上使用多个仓库

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

在服务器的 SSH 配置文件(通常为 ~/.ssh/config)中,为每个仓库添加一个别名条目。 例如:

Host my-GHE-hostname.com-repo-0
        Hostname my-GHE-hostname.com
        IdentityFile=/home/user/.ssh/repo-0_deploy_key

Host my-GHE-hostname.com-repo-1
        Hostname my-GHE-hostname.com
        IdentityFile=/home/user/.ssh/repo-1_deploy_key
  • Host my-GHE-hostname.com-repo-0 - The repository's alias.
  • Hostname my-GHE-hostname.com - Configures the hostname to use with the alias.
  • IdentityFile=/home/user/.ssh/repo-0_deploy_key - Assigns a private key to the alias.

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

$ git clone git@my-GHE-hostname.com-repo-1:OWNER/repo-1.git

机器用户

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

优点
  • 有权访问仓库和服务器的任何人都能够部署项目。
  • 没有(人类)用户需要更改其本地 SSH 设置。
  • 不需要多个密钥;每台服务器一个就足够了。
缺点
  • 只有组织才能将机器用户限制为只读访问。 个人仓库始终授予协作者读取/写入权限。
  • 机器用户密钥(如部署密钥)通常不受密码保护。
设置
  1. 在服务器上运行 ssh-keygen 进程,并将公钥附加到机器用户帐户。
  2. 授予机器用户帐户访问要自动化的仓库的权限。 为此,您可以将帐户添加为协作者、添加为外部协作者或添加到组织中的团队