Skip to main content

管理部署密钥

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

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

SSH 代理转发

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

SSH 代理转发的优点

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

SSH 代理转发的缺点

  • 用户必须通过 SSH 连接进行部署;无法使用自动部署流程。
  • 对于Windows用户来说,使用SSH代理转发可能会有困难。

设置 SSH 代理转发

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

使用 OAuth 令牌进行 HTTPS 克隆

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

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

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

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

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

设置用于 HTTPS 克隆的 OAuth 令牌

请参阅我们的指南,了解如何创建personal access token

部署密钥

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

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

为了增强安全性和对存储库访问和权限的精细控制,我们建议改用GitHub应用。 请参阅“决定何时生成GitHub应用”。

部署密钥的优点

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

部署密钥的缺点

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

设置部署密钥

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

  2. 在 GitHub 上,导航到存储库的主页面。

  3. 在仓库名称下,单击 “Settings”****。 如果看不到“设置”选项卡,请选择“”下拉菜单,然后单击“设置”。

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

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

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

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

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

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

  9. 单击“添加密钥”。

也可以使用 REST API 创建部署密钥。 有关详细信息,请参阅“适用于部署密钥的 REST API 终结点”。

然后,可以使用 SSH 与存储库进行交互。 例如:

git clone git@github.com:OWNER/REPO.git

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

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

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

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
  •         `Host github.com-repo-0` - 存储库的别名。
    
  •         `Hostname github.com` - 将主机名配置为与别名一起使用。
    
  •         `IdentityFile=/home/user/.ssh/repo-0_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 Appid
  5. 生成并下载 GitHub App 的私钥,并安全地存储此密钥。 有关详细信息,请参阅生成私钥
  6. 在需要对其执行操作的存储库上安装你的 GitHub App,或者选择在你组织中的所有存储库上安装 GitHub App。
  7.        `installation_id`标识表示可以访问的组织和GitHub App组织存储库之间的连接。 每个 GitHub App 和组织对最多都有一个 `installation_id`。 可以通过`installation_id`来标识此 [](/rest/apps/apps#get-an-organization-installation-for-the-authenticated-app)。 这需要作为 GitHub App 使用 JWT 进行身份验证,有关详细信息,请参阅 [身份验证为 GitHub App](/apps/creating-github-apps/authenticating-with-a-github-app/authenticating-as-a-github-app)。
    
  8. 使用相应的 REST API 终结点生成安装访问令牌,为应用创建安装访问令牌。 这需要使用 JWT 进行身份验证 GitHub App ,有关详细信息,请参阅 身份验证为 GitHub App,以及 作为安装进行身份验证
  9. 使用此安装访问令牌,通过 REST、GraphQL API 或 Git 客户端与存储库进行交互。

有关详细信息,请参阅“为 GitHub 应用生成安装访问令牌”。

机器用户

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

提示

我们的服务条款规定:

不允许通过“机器人”或其他自动方法注册帐户。

这意味着您不能自动创建帐户。 但是,如果要创建一个机器用户来自动化任务(例如在项目或组织中部署脚本),那就太酷了。

计算机用户的优点

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

计算机用户的缺点

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

设置计算机用户

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

延伸阅读

  •         [AUTOTITLE](/organizations/managing-programmatic-access-to-your-organization/github-credential-types)
    
  •         [配置通知](/account-and-profile/managing-subscriptions-and-notifications-on-github/setting-up-notifications/configuring-notifications#organization-alerts-notification-options)