Docs/ 安全/ SSH 密钥

SSH 密钥

管理用于 Git 提供商安全认证和远程服务器访问的 SSH 密钥。

概述

sh0 中的 SSH 密钥有两个主要用途:

  • Git 提供商认证: 从支持 SSH 的 GitHub、GitLab、Bitbucket 或任何 Git 服务器克隆私有仓库。
  • 远程服务器访问: 在多服务器设置中通过 SSH 隧道连接远程节点。

sh0 使用 AES-256-GCM 静态加密存储 SSH 私钥。密钥仅在需要认证时在内存中解密。

生成 SSH 密钥对

如果你没有 SSH 密钥对,请使用以下命令生成。sh0 支持 Ed25519(推荐)和 RSA 密钥。

Ed25519(推荐):

Terminal
ssh-keygen -t ed25519 -C "sh0-deploy-key" -f ~/.ssh/sh0_deploy

RSA(4096 位):

Terminal
ssh-keygen -t rsa -b 4096 -C "sh0-deploy-key" -f ~/.ssh/sh0_deploy

这将创建两个文件:

  • ~/.ssh/sh0_deploy -- 私钥(保密)
  • ~/.ssh/sh0_deploy.pub -- 公钥(可安全分享)
Warning
永远不要分享你的私钥。只有公钥(.pub 文件)应该添加到 Git 提供商。私钥上传到 sh0 以便它可以代表你进行认证。

向 sh0 添加 SSH 密钥

你可以通过控制台或 API 添加 SSH 密钥。

通过控制台:

  1. 导航到 设置 → SSH 密钥。
  2. 点击 添加 SSH 密钥。
  3. 输入描述性名称(例如「GitHub 部署密钥」)。
  4. 粘贴你的私钥文件内容。
  5. 点击 保存。
添加 SSH 密钥表单,包含名称和私钥字段

通过 API:

Terminal
curl -X POST https://your-server:9000/api/ssh-keys \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "GitHub Deploy Key",
    "private_key": "-----BEGIN OPENSSH PRIVATE KEY-----\\n...\\n-----END OPENSSH PRIVATE KEY-----"
  }'

用于 Git 提供商的 SSH 密钥

要从私有仓库部署,sh0 需要一个对仓库有读取权限的 SSH 密钥。以下是常见提供商的设置方法:

GitHub:

  1. 前往仓库 → Settings → Deploy Keys。
  2. 点击 Add deploy key。
  3. 粘贴公钥(.pub 文件)的内容。
  4. 取消勾选「Allow write access」(sh0 只需要读取权限)。
GitHub 部署密钥设置页面

GitLab:

  1. 前往项目 → Settings → Repository → Deploy Keys。
  2. 添加包含你公钥的新部署密钥。
  3. 授予只读访问权限。

Bitbucket:

  1. 前往仓库 → 设置 → Access keys。
  2. 点击 Add key 并粘贴你的公钥。
Tip
你可以为多个仓库使用同一个 SSH 密钥对,或为每个仓库生成单独的密钥以获得更细粒度的访问控制。sh0 支持多个密钥,连接到 Git 提供商时会按顺序尝试。

用于服务器访问的 SSH 密钥

在多服务器设置中添加远程节点时,sh0 使用 SSH 密钥建立安全隧道。密钥必须在远程服务器上授权。

  1. 将 SSH 密钥添加到 sh0(如上所述)。
  2. 将公钥复制到远程服务器的 ~/.ssh/authorized_keys 文件:
Terminal
ssh-copy-id -i ~/.ssh/sh0_deploy.pub deploy@remote-server

在 sh0 中添加节点时,选择此 SSH 密钥进行认证。sh0 将使用它与远程 Docker 守护进程建立 SSH 隧道。

节点配置,包含 SSH 密钥选择下拉菜单

密钥指纹

每个 SSH 密钥都有唯一的指纹,可用于验证其身份。sh0 为每个存储的密钥显示 SHA-256 指纹。

Terminal
# View the fingerprint of a local key file
ssh-keygen -lf ~/.ssh/sh0_deploy.pub

将此指纹与 sh0 控制台中显示的指纹进行比较,以验证你上传了正确的密钥。

管理多个密钥

SSH 密钥面板列出 sh0 中存储的所有密钥。对于每个密钥,你可以看到:

  • 密钥名称和指纹
  • 密钥类型(Ed25519、RSA)
  • 添加日期
  • 哪些应用或节点使用该密钥
SSH 密钥管理面板,显示所有存储密钥的详细信息
Tip
为你的密钥使用描述性名称(例如「GitHub - 生产 API」、「节点 - 欧洲法兰克福」),以便轻松识别每个密钥的用途。

移除密钥

要从 sh0 中移除 SSH 密钥:

  1. 导航到 设置 → SSH 密钥。
  2. 点击要移除密钥旁边的删除图标。
  3. 确认删除。
Terminal
curl -X DELETE https://your-server:9000/api/ssh-keys/key_abc123 \
  -H "Authorization: Bearer YOUR_TOKEN"
Danger
移除正在被应用或节点使用的 SSH 密钥会中断部署和服务器连接。如果密钥当前正在使用,sh0 会在允许删除之前发出警告。