在自动化部署脚本时,您可以通过 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 克隆
请参阅我们的个人访问令牌创建指南。
部署密钥
您可以使用部署密钥将 GitHub.com 上的仓库项目部署到服务器。部署密钥是一种只授予单个仓库访问权限的 SSH 密钥。GitHub 将密钥的公钥部分直接关联到您的仓库,而不是个人账户,私钥则保留在您的服务器上。更多信息请参阅部署交付。
具有写入权限的部署密钥可以执行与具有管理员访问权限的组织成员或个人仓库协作者相同的操作。更多信息请参阅组织的仓库角色以及个人账户仓库的权限级别。
为获得更高的安全性和对仓库访问及权限的细粒度控制,我们建议改用 GitHub 应用。参见何时构建 GitHub 应用的决策指南。
部署密钥的优势
- 任何能够访问仓库和服务器的人都可以部署项目。
- 用户无需更改本地 SSH 设置。
- 部署密钥默认是只读的,但在将其添加到仓库时可以授予写入权限。
部署密钥的缺点
- 部署密钥仅授予对单个仓库的访问权限。更复杂的项目可能需要将多个仓库拉取到同一服务器。
- 部署密钥通常未使用密码短语保护,如果服务器被攻破,密钥很容易被获取。
- 部署密钥没有过期日期。
- 部署密钥并未直接关联组织成员资格。如果创建部署密钥的用户被从仓库中移除,部署密钥仍然保持有效,因为它绑定的是仓库而非特定用户。
设置部署密钥
-
运行
ssh-keygen步骤 在您的服务器上,并记住保存生成的公钥和私钥 rsa 密钥对的位置。 -
在 GitHub 上,导航至仓库的主页面。
-
在您的仓库名称下,点击 设置。如果看不到 “设置” 选项卡,请选择 下拉菜单,然后点击 设置。

-
在侧边栏中,点击部署密钥。
-
点击添加部署密钥。
-
在“Title”(标题)字段中填写标题。
-
在 “Key” 字段中粘贴您的公钥。
-
如果您希望此密钥对仓库拥有写入权限,请选择允许写入访问。拥有写入权限的部署密钥可以让部署向仓库推送代码。
-
点击添加密钥。
您也可以使用 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 与仓库交互,系统会使用分配给该别名的唯一部署密钥。例如
git clone git@github.com-repo-1:OWNER/repo-1.git
GitHub 应用安装访问令牌
如果您的服务器需要访问一个或多个组织中的仓库,您可以使用 GitHub 应用来定义所需的访问权限,然后从该应用生成严格限定范围的安装访问令牌。这些安装访问令牌可以针对单个或多个仓库进行范围限定,并且拥有细粒度的权限。例如,您可以生成仅对仓库内容具有只读权限的令牌。
由于 GitHub 应用在 GitHub 上是一级实体,安装访问令牌与任何 GitHub 用户身份解耦,类似于“服务令牌”。此外,安装访问令牌拥有专属的速率限制,并随其作用的组织规模而增长。更多信息请参阅GitHub 应用的速率限制。
安装访问令牌的优势
- 范围严格、权限集明确且具有过期时间(1 小时,若通过 API 手动吊销则更短)的令牌
- 随组织规模增长的专属速率限制
- 与 GitHub 用户身份解耦,不占用任何许可席位
- 从未拥有密码,无法直接登录
安装访问令牌的缺点
- 创建 GitHub 应用需要额外的设置工作。
- 安装访问令牌在 1 小时后过期,需要重新生成,通常通过代码按需获取。
设置安装访问令牌
- 确定您的 GitHub 应用是公开还是私有。如果该应用仅在您组织内的仓库上运行,建议设为私有。
- 确定 GitHub 应用所需的权限,例如对仓库内容的只读访问。
- 在组织的设置页面创建 GitHub 应用。更多信息请参阅创建 GitHub 应用。
- 记录下您的 GitHub 应用
id。 - 生成并下载您的 GitHub 应用私钥,并妥善保存。更多信息请参阅生成私钥。
- 在需要操作的仓库上安装您的 GitHub 应用,也可以选择在组织的所有仓库上安装该应用。
- 确定表示 GitHub 应用与其可访问组织仓库之间关联的
installation_id。每个 GitHub 应用与组织的配对最多只有一个installation_id。您可以通过获取已认证应用的组织安装信息来获取此installation_id。这需要使用 JWT 进行 GitHub 应用身份验证,详情请参阅作为 GitHub 应用进行身份验证。 - 使用相应的 REST API 端点 为应用创建安装访问令牌来生成安装访问令牌。这同样需要使用 JWT 进行 GitHub 应用身份验证,详情请参阅作为 GitHub 应用进行身份验证,以及作为安装进行身份验证。
- 使用此安装访问令牌通过 REST 或 GraphQL API,或通过 Git 客户端与您的仓库交互。
更多信息请参阅为 GitHub 应用生成安装访问令牌。
机器用户
如果您的服务器需要访问多个仓库,您可以在 GitHub.com 上创建一个新账户,并为其附加专用于自动化的 SSH 密钥。由于该账户不会被人类使用,它被称为机器用户。您可以将机器用户添加为协作者(授予读写权限)在个人仓库中,或作为外部协作者在组织仓库中(授予读、写或管理员权限),亦或将其加入拥有相应仓库访问权限的团队中(授予团队权限)。
机器用户的优势
- 任何能够访问仓库和服务器的人都可以部署项目。
- 无需(人工)用户更改本地 SSH 设置。
- 不需要多个密钥;每台服务器一个即可。
机器用户的缺点
- 仅组织能够将机器用户限制为只读访问。个人仓库的协作者始终拥有读写权限。
- 机器用户的密钥与部署密钥类似,通常未使用密码短语保护。
设置机器用户
- 运行
ssh-keygen步骤 在您的服务器上,并将公钥附加到机器用户账户。 - 为机器用户账户授予您想要自动化的仓库访问权限。您可以将该账户添加为协作者、外部协作者,或加入组织中的团队。