在自动化部署脚本时,您可以使用 SSH 代理转发、带有 OAuth 令牌的 HTTPS、部署密钥或机器用户来管理服务器上的 SSH 密钥。
SSH 代理转发
在许多情况下,尤其是在项目的初期,SSH 代理转发是最快速、最简单的方法。代理转发使用本地开发计算机使用的相同 SSH 密钥。
SSH 代理转发的优点
- 您无需生成或跟踪任何新密钥。
- 无需密钥管理;用户在服务器上具有与本地相同的权限。
- 服务器上没有存储任何密钥,因此如果服务器遭到入侵,您无需查找和删除受损密钥。
SSH 代理转发的缺点
- 用户**必须**通过 SSH 进行部署;无法使用自动部署流程。
- 对于 Windows 用户来说,运行 SSH 代理转发可能很麻烦。
设置 SSH 代理转发
- 在本地打开代理转发。有关更多信息,请参阅我们关于 SSH 代理转发的指南。
- 设置您的部署脚本以使用代理转发。例如,在 bash 脚本中,启用代理转发将如下所示:
ssh -A serverA 'bash -s' < deploy.sh
使用 OAuth 令牌进行 HTTPS 克隆
如果您不想使用 SSH 密钥,可以使用带有 OAuth 令牌的 HTTPS。
使用 OAuth 令牌进行 HTTPS 克隆的优点
- 任何有权访问服务器的人员都可以部署存储库。
- 用户无需更改其本地 SSH 设置。
- 无需多个令牌(每个用户一个);每个服务器一个令牌就足够了。
- 可以随时撤销令牌,使其基本上成为一次性密码。
使用 OAuth 令牌进行 HTTPS 克隆的缺点
- 您必须确保使用正确的访问范围配置令牌。
- 令牌本质上是密码,必须以相同的方式进行保护。
设置使用 OAuth 令牌进行 HTTPS 克隆
请参阅我们关于创建个人访问令牌的指南。
部署密钥
您可以通过使用部署密钥(一种授予对单个存储库的访问权限的 SSH 密钥)将 GitHub.com 上存储库中的项目启动到您的服务器。GitHub 将密钥的公共部分直接附加到您的存储库而不是个人帐户,密钥的私有部分保留在您的服务器上。有关更多信息,请参阅“交付部署”。
具有写入访问权限的部署密钥可以执行与具有管理员访问权限的组织成员或个人仓库的协作者相同的操作。有关更多信息,请参阅“组织的仓库角色”和“个人账户仓库的权限级别”。
为了增强安全性并对仓库访问权限和许可进行细粒度控制,我们建议使用 GitHub App。请参阅“何时构建 GitHub App”。
部署密钥的优点
- 任何有权访问仓库和服务器的人员都可以部署项目。
- 用户无需更改其本地 SSH 设置。
- 默认情况下,部署密钥是只读的,但在将它们添加到仓库时,您可以授予它们写入访问权限。
部署密钥的缺点
- 部署密钥仅授予对单个仓库的访问权限。更复杂的项目可能有多个需要拉取到同一服务器的仓库。
- 部署密钥通常不受密码短语保护,如果服务器受到入侵,密钥很容易被访问。
- 部署密钥是无过期日期的凭据。
- 部署密钥不会直接链接到组织成员身份。如果创建部署密钥的用户从仓库中移除,则部署密钥仍然有效,因为它不与特定用户绑定,而是与仓库绑定。
设置部署密钥
-
在您的服务器上运行
ssh-keygen
过程,并记住您保存生成的公共和私有 rsa 密钥对的位置。 -
在 GitHub 上,导航到仓库的主页。
-
在您的仓库名称下,点击 设置。如果您看不到“设置”选项卡,请选择下拉菜单,然后点击设置。
-
在侧边栏中,点击部署密钥。
-
点击添加部署密钥。
-
在“标题”字段中,提供一个标题。
-
在“密钥”字段中,粘贴您的公钥。
-
如果您希望此密钥具有对仓库的写入访问权限,请选择允许写入访问。具有写入访问权限的部署密钥允许部署推送到仓库。
-
点击添加密钥。
您还可以使用 REST API 创建部署密钥。有关更多信息,请参阅“部署密钥的 REST API 端点”。
在一台服务器上使用多个仓库
如果您在一台服务器上使用多个仓库,则需要为每个仓库生成一个专用的密钥对。您不能将一个部署密钥重复用于多个仓库。
在服务器的 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 与仓库进行交互,这将使用分配给该别名的唯一部署密钥。例如
git clone [email protected]:OWNER/repo-1.git
GitHub App 安装访问令牌
如果您的服务器需要访问一个或多个组织中的仓库,您可以使用 GitHub App 定义所需的访问权限,然后从该 GitHub App 生成范围严格的安装访问令牌。安装访问令牌的范围可以是单个或多个仓库,并且可以具有细粒度的权限。例如,您可以生成一个对仓库内容具有只读访问权限的令牌。
由于 GitHub App 是 GitHub 上的一级参与者,因此安装访问令牌与任何 GitHub 用户分离,这使得它们类似于“服务令牌”。此外,安装访问令牌具有专用的速率限制,这些限制会随着其所作用的组织的大小而扩展。有关更多信息,请参阅GitHub App 的速率限制。
安装访问令牌的优点
- 范围严格的令牌,具有明确定义的权限集和过期时间(1 小时,如果使用 API 手动撤销,则时间更短)
- 随着您的组织发展而增长的专用速率限制
- 与 GitHub 用户身份分离,因此不会消耗任何许可的席位
- 从不授予密码,因此无法直接登录
安装访问令牌的缺点
- 需要额外的设置来创建 GitHub App。
- 安装访问令牌在 1 小时后过期,因此需要重新生成,通常使用代码按需生成。
设置安装访问令牌
- 确定您的 GitHub App 应该是公开的还是私有的。如果您的 GitHub App 仅对您组织内的仓库起作用,则您可能希望它是私有的。
- 确定您的 GitHub App 需要哪些权限,例如对仓库内容的只读访问权限。
- 通过您组织的设置页面创建您的 GitHub App。有关更多信息,请参阅创建 GitHub App。
- 记下您的 GitHub App
id
。 - 生成并下载您的 GitHub App 的私钥,并安全地存储它。有关更多信息,请参阅生成私钥。
- 在它需要起作用的仓库上安装您的 GitHub App,您可以选择在您组织中的所有仓库上安装 GitHub App。
- 识别表示 GitHub App 与它可以访问的组织仓库之间连接的
installation_id
。每个 GitHub App 和组织对最多只有一个installation_id
。您可以通过获取经过身份验证的 App 的组织安装来识别此installation_id
。这需要使用 JWT 作为 GitHub App 进行身份验证,有关更多信息,请参阅以 GitHub App 的身份进行身份验证。 - 使用相应的 REST API 端点生成安装访问令牌,为 App 创建安装访问令牌。这需要使用 JWT 作为 GitHub App 进行身份验证,有关更多信息,请参阅以 GitHub App 的身份进行身份验证,以及以安装的身份进行身份验证。
- 使用此安装访问令牌与您的仓库进行交互,可以通过 REST 或 GraphQL API 或通过 Git 客户端进行交互。
有关更多信息,请参阅“为 GitHub App 生成安装访问令牌”。
机器用户
如果您的服务器需要访问多个仓库,您可以在 GitHub.com 上创建一个新账户,并附加一个将专门用于自动化的 SSH 密钥。由于 GitHub.com 上的此账户不会由人类使用,因此称为机器用户。您可以将机器用户添加为个人仓库的协作者(授予读写访问权限),作为组织仓库的外部协作者(授予读、写或管理员访问权限),或添加到具有访问其需要自动化的仓库权限的团队(授予团队的权限)。
机器用户的优点
- 任何有权访问仓库和服务器的人员都可以部署项目。
- 无需(人工)用户更改其本地 SSH 设置。
- 无需多个密钥;每个服务器一个就足够了。
机器用户的缺点
- 只有组织才能将机器用户限制为只读访问。个人仓库始终向协作者授予读写访问权限。
- 机器用户密钥与部署密钥一样,通常不受密码短语保护。
设置机器用户
- 在您的服务器上运行
ssh-keygen
过程,并将公钥附加到机器用户帐户。 - 授予机器用户帐户对您想要自动化的存储库的访问权限。您可以通过将帐户添加为协作者、外部协作者或组织中的团队来实现这一点。