您可以使用 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 密钥,可以使用 HTTPS 和 OAuth 令牌。
使用 OAuth 令牌进行 HTTPS 克隆的优点
- 任何有权访问服务器的人都可以部署仓库。
- 用户无需更改其本地 SSH 设置。
- 不需要多个令牌(每个用户一个);每个服务器一个令牌就足够了。
- 令牌可以随时撤销,使其本质上成为一次性密码。
使用 OAuth 令牌进行 HTTPS 克隆的缺点
- 你必须确保你的令牌配置了正确的访问范围。
- 令牌本质上是密码,必须以相同的方式保护。
设置使用 OAuth 令牌进行 HTTPS 克隆
请参见 关于创建个人访问令牌的指南。
部署密钥
你可以使用部署密钥从 GitHub.com 上的仓库启动项目到你的服务器。部署密钥是一个 SSH 密钥,它授予对单个仓库的访问权限。GitHub 将密钥的公钥部分直接附加到你的仓库,而不是个人帐户,而密钥的私钥部分保留在你的服务器上。更多信息,请参见 "交付部署"。
具有写入权限的部署密钥可以执行与具有管理员访问权限的组织成员或个人仓库的合作者相同的操作。更多信息,请参见 "组织的仓库角色" 和 "个人帐户仓库的权限级别"。
部署密钥的优点
- 任何有权访问仓库和服务器的人都可以部署项目。
- 用户无需更改其本地 SSH 设置。
- 部署密钥默认情况下是只读的,但您可以在将它们添加到存储库时授予它们写入权限。
部署密钥的缺点
- 部署密钥仅授予对单个存储库的访问权限。更复杂的项目可能需要将许多存储库拉取到同一台服务器。
- 部署密钥通常不受密码保护,如果服务器遭到入侵,密钥很容易被访问。
- 如果创建部署密钥的用户从存储库中删除,部署密钥仍然会处于活动状态,因为它与特定用户无关,而是与存储库相关联。
设置部署密钥
-
在您的服务器上运行
ssh-keygen
过程,并记住您保存生成的公钥和私钥 rsa 密钥对的位置。 -
在 GitHub.com 上,导航到存储库的主页。
-
在您的存储库名称下,单击 设置。如果您看不到“设置”选项卡,请选择下拉菜单,然后单击设置。
-
在侧边栏中,单击部署密钥。
-
单击添加部署密钥。
-
在“标题”字段中,提供一个标题。
-
在“密钥”字段中,粘贴您的公钥。
-
如果您希望此密钥对存储库具有写入权限,请选择允许写入访问。具有写入权限的部署密钥允许部署推送到存储库。
-
单击添加密钥。
您也可以使用 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 应用安装访问令牌
如果您的服务器需要访问一个或多个组织的存储库,您可以使用 GitHub 应用来定义所需的访问权限,然后从该 GitHub 应用生成范围严格的安装访问令牌。安装访问令牌的范围可以是单个或多个存储库,并且可以具有细粒度的权限。例如,您可以生成一个具有对存储库内容的只读访问权限的令牌。
由于 GitHub 应用是 GitHub 上的一流参与者,因此安装访问令牌与任何 GitHub 用户分离,这使得它们与“服务令牌”相当。此外,安装访问令牌具有专用的速率限制,这些限制会随着它们所作用的组织的大小而扩展。有关更多信息,请参阅 GitHub 应用的速率限制.
安装访问令牌的优点
- 范围严格的令牌,具有定义明确的权限集和过期时间(1 小时,如果使用 API 手动撤销,则更短)。
- 专用的速率限制,随着您的组织而增长。
- 与 GitHub 用户身份分离,因此它们不会消耗任何许可的席位。
- 从未授予密码,因此无法直接登录。
安装访问令牌的缺点
- 需要额外的设置才能创建 GitHub 应用。
- 安装访问令牌在 1 小时后过期,因此需要重新生成,通常使用代码按需生成。
设置安装访问令牌
- 确定您的 GitHub 应用应该是公开的还是私有的。如果您的 GitHub 应用只对您组织内的存储库起作用,您可能希望将其设为私有。
- 确定您的 GitHub 应用所需的权限,例如对存储库内容的只读访问权限。
- 通过组织设置页面创建您的 GitHub 应用。有关更多信息,请参阅 创建 GitHub 应用。
- 记下您的 GitHub 应用
id
。 - 生成并下载您的 GitHub 应用的私钥,并安全地保存它。有关更多信息,请参阅 生成私钥。
- 在您的 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 密钥。由于此 GitHub.com 上的帐户不会由人类使用,因此称为机器用户。您可以将机器用户添加为个人仓库的协作者(授予读写权限),作为组织仓库的外部协作者(授予读、写或管理权限),或添加到具有访问其需要自动化的仓库权限的团队(授予团队的权限)。
机器用户的优点
- 任何有权访问仓库和服务器的人都可以部署项目。
- 无需(人类)用户更改其本地 SSH 设置。
- 无需多个密钥;每个服务器一个就足够了。
机器用户的缺点
- 只有组织可以将机器用户限制为只读访问。个人仓库始终授予协作者读写权限。
- 机器用户密钥(如部署密钥)通常不受密码保护。
设置机器用户
- 在您的服务器上运行
ssh-keygen
过程,并将公钥附加到机器用户帐户。 - 授予机器用户帐户访问您要自动化的仓库的权限。您可以通过将帐户添加为协作者,作为外部协作者,或添加到组织中的团队来实现。