管理元数据中的 SSH 密钥

本指南介绍如何通过创建 SSH 密钥和修改 SSH 公钥元数据来控制对 Linux 实例的访问。

要了解如何连接到实例,请参阅连接到实例

准备工作

执行此任务所需的权限

要执行此任务,您必须拥有以下权限

  • 针对实例的 compute.instances.setMetadata 权限(如果要在实例上设置元数据)
  • 针对项目的 compute.projects.setCommonInstanceMetadata 权限(如果要设置项目范围的元数据)
  • 针对项目的 iam.serviceAccounts.actAs 权限(如果要设置项目范围的元数据)

手动管理密码所带来的风险

如果您通过 GCP Console、gcloud 命令行工具或 API 自行创建和管理 SSH 公钥,则必须跟踪所使用的密钥,同时删除不应具有访问权限的用户的 SSH 公钥。例如,如果某位团队成员退出您的项目,请从元数据中移除其 SSH 公钥,使其无法再访问您的实例。

此外,如果指定错误的 gcloud 工具或 API 调用,则可能擦除您的项目或实例中的所有 SSH 公钥,从而导致项目成员连接中断。

如果您不确定要自行管理密钥,请转而使用 Compute Engine 工具连接到您的实例

概览

通过创建和管理 SSH 密钥,您可允许用户通过第三方工具访问 Linux 实例。

SSH 密钥由以下文件构成:

  • 一个 SSH 公钥文件,它应用于实例级别的元数据或项目范围的元数据
  • 一个 SSH 私钥文件,用户将此文件存储在本地设备上。

如果用户提供 SSH 私钥,则其可以通过第三方工具连接到使用所匹配的 SSH 公钥文件配置的任何实例,即使该用户不是您的 Cloud Platform 项目的成员。因此,您可通过更改一个或多个实例的 SSH 公钥元数据控制用户能够访问的实例。

要修改 SSH 公钥元数据,请执行以下操作:

  1. 确定您要用于修改元数据的工具:

  2. 如果您需要将用户添加到 Linux 实例,请通过以下过程准备其 SSH 公钥:

  3. 修改 SSH 公钥元数据,以便向 Linux 实例添加用户或从中移除用户。

  4. 通过第三方工具连接到您的 Linux 实例,确保所有 SSH 公钥均正确添加或移除。用户仅在满足以下条件时才能连接到实例:其 SSH 公钥可通过元数据服务器供实例使用,且其拥有匹配的 SSH 私钥。

创建新的 SSH 密钥

如果您现在没有 SSH 私钥文件,且没有匹配的 SSH 公钥文件可供使用,请生成新的 SSH 密钥。如果您要使用现有的 SSH 密钥,请找到 SSH 公钥文件。

Linux 和 macOS

在 Linux 或 macOS 工作站上,您可以使用 ssh-keygen 工具生成密钥。

  1. 在您的工作站上打开一个终端,并使用 ssh-keygen 命令生成新的密钥。指定 -C 标志以添加一条带有您的用户名的注释。

    ssh-keygen -t rsa -f ~/.ssh/[KEY_FILENAME] -C [USERNAME]
    

    其中:

    • [KEY_FILENAME] 是您要用于 SSH 密钥文件的名称。例如,文件名 my-ssh-key 生成一个名为 my-ssh-key 的私钥文件和一个名为 my-ssh-key.pub 的公钥文件。
    • [USERNAME] 是您要为其应用此 SSH 密钥的用户。

    该命令生成一个 SSH 私钥文件和一个匹配的 SSH 公钥,公钥结构如下所示:

    ssh-rsa [KEY_VALUE] [USERNAME]
    

    其中:

    • [KEY_VALUE] 是您生成的密钥值。
    • [USERNAME] 是此密钥要应用到的用户。
  2. 限制对您的私钥的访问,以便只有您能读取此密钥,且所有人都不可向其写入。

    chmod 400 ~/.ssh/[KEY_FILENAME]
    

    其中 [KEY_FILENAME] 是您用于 SSH 密钥文件的名称。

针对需要新密钥的每一位用户重复此过程。然后,找到您创建的 SSH 公钥,以及您要添加到项目或实例的任何现有 SSH 公钥。

Windows

Windows 没有用于生成 SSH 密钥的内置工具,因此如果您使用的是 Windows 工作站,则必须使用第三方工具来生成 SSH 密钥。接下来,我们将介绍如何使用 PuTTYgen 工具生成 SSH 密钥。

  1. 下载 puttygen.exe

  2. 运行 PuTTYgen。在本例中,只需运行所下载的 puttygen.exe 文件即可。系统随即打开一个窗口,您可在其中配置自己的密钥生成设置。

  3. 点击 Generate 并按照屏幕上的说明生成新密钥。在大多数情况下,使用默认参数就可以,但您必须生成至少有 2048 位的密钥。密钥生成完成后,该工具将显示您的公钥值。

  4. Key comment 部分中,将现有文本替换成要为其应用密钥的用户的用户名。

  5. (可选)您可输入一个 Key passphrase 来保护您的密钥。

  6. 点击 Save private key,将您的私钥写入扩展名为 .ppk 的文件中。

  7. 点击 Save public key,将您的公钥写入文件以备稍后使用。暂时让 PuTTYgen 窗口保持打开状态。

    PuTTYgen 屏幕的顶部显示有格式正确的公钥:

    PuTTYgen 公钥的屏幕截图

    此公钥的结构如下:

    ssh-rsa [KEY_VALUE] [USERNAME]
    

    其中:

    • [KEY_VALUE] 是您生成的密钥值。
    • [USERNAME] 是此密钥要应用到的用户。

针对需要新密钥的每一位用户重复此过程。然后,对于您要添加到项目或实例的用户,如果您具有其他 SSH 公钥,则必须立即找到其 SSH 公钥。否则,请对您创建的 SSH 公钥设置格式

找到 SSH 密钥

您有很多理由需要找到 SSH 密钥。例如,如果您要将用户的 SSH 公钥添加到项目或实例,则需要访问公钥文件以获取其密钥。或者,您可能需要找到 SSH 私钥文件才能连接到 Linux 实例。

在创建 SSH 密钥时,该密钥保存到默认位置。SSH 公钥和私钥文件的默认位置和名称由创建该密钥所用的工具而定。

Linux 和 macOS

如果您使用 ssh-keygen 工具在 Linux 或 macOS 工作站上创建了密钥,则您的密钥保存在以下位置:

  • 公钥文件:~/.ssh/[KEY_FILENAME].pub
  • 私钥文件:~/.ssh/[KEY_FILENAME]

其中 [KEY_FILENAME] 是 SSH 密钥的文件名,它在密钥创建时进行设置。

如果您需要在项目或实例元数据中添加或移除 SSH 公钥,请设置 SSH 公钥文件的格式

Windows

如果您使用 PuTTYgen 工具在 Windows 工作站上创建了密钥,则您的公钥文件和私钥文件按以下格式保存在您指定的位置:

  • 公钥:[PUBLIC_KEY_FILENAME]
  • 私钥:[PRIVATE_KEY_FILENAME].ppk

其中 [PUBLIC_KEY_FILENAME][PRIVATE_KEY_FILENAME] 分别是 SSH 公钥和私钥的文件名,它们在首次保存密钥时进行设置。

使用 PuTTYgen 创建的默认 SSH 公钥应具有以下格式:

ssh-rsa [KEY_VALUE] [USERNAME]

其中:

  • [KEY_VALUE] 是 SSH 公钥值。
  • [USERNAME] 是实例中您为其应用该密钥的用户。

要查看具有正确格式的 PuTTYgen SSH 公钥,请执行以下操作:

  1. 运行 PuTTYgen。如果您没有 PuTTYgen,请下载并运行 puttygen.exe

  2. 点击 Load 以选择并打开 SSH 公钥文件。

  3. 加载公钥文件后,您可以在 PuTTYgen 屏幕的顶部看到格式正确的 SSH 公钥值:

    PuTTYgen 公钥的屏幕截图

如果您需要在项目或实例元数据中添加或移除 SSH 公钥,请设置 SSH 公钥文件的格式

gcloud

如果您已通过 gcloud 工具连接到实例,则您的密钥已生成且应用到了您的项目或实例。密钥文件位于以下位置:

  • Linux 和 macOS
    • 公钥:$HOME/.ssh/google_compute_engine.pub
    • 私钥:$HOME/.ssh/google_compute_engine
  • Windows:
    • 公钥:C:\Users\[USERNAME]\.ssh\google_compute_engine.pub
    • 私钥:C:\Users\[USERNAME]\.ssh\google_compute_engine

其中 [USERNAME] 是您在本地工作站上的用户名。

要查看 SSH 公钥的应用位置,请在项目元数据实例元数据中查找这些公钥。如果需要在项目或实例元数据中添加或移除 SSH 公钥,请先设置 SSH 公钥文件的格式

设置 SSH 公钥文件的格式

必须先检查计划添加的每个 SSH 公钥文件的格式,然后才可将 SSH 公钥上传到项目或实例元数据。

根据您要用来修改元数据的工具设置密钥的格式,使其适用于 GCP Consolegcloud 命令行工具API 方法。您还可根据情况更改您的 SSH 公钥的格式,从而添加、修改和移除到期时间。

Console

要检查 SSH 公钥的格式,请执行以下操作:

  1. 找到并打开 SSH 公钥文件。

  2. 检查 SSH 公钥文件的格式。

    • 如果 SSH 公钥具有到期时间,则它必须采用以下格式:

      ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}

      其中:

      • [KEY_VALUE] 是 SSH 公钥值。
      • [USERNAME] 是此 SSH 密钥的用户,它在创建密钥时进行指定。
      • [EXPIRE_TIME]ISO 8601 格式的值,例如 2018-12-04T20:12:00+0000
    • 否则,SSH 公钥必须采用以下格式:

      ssh-rsa [KEY_VALUE] [USERNAME]

      其中:

      • [KEY_VALUE] 是 SSH 公钥值。
      • [USERNAME] 是此 SSH 密钥的用户,它在创建密钥时进行指定。
  3. 如果您的密钥与上述任一格式均不匹配,或者您想要添加、修改或移除过期时间,请按照以下说明设置 SSH 公钥的格式。否则,请保持文件打开并将 SSH 公钥添加到项目或实例元数据中

要设置用于 Console 的 SSH 公钥的格式,请执行以下操作:

  1. 生成公钥文件的副本。在 Compute Engine 中使用该副本,同时保留原始文件以在其他 SSH 配置中使用。

  2. 打开公钥文件的副本。

  3. 修改公钥文件,使其具有以下格式:

    ssh-rsa [KEY_VALUE] [USERNAME]

    其中:

    • [KEY_VALUE] 是 SSH 公钥值。
    • [USERNAME] 是此 SSH 密钥的用户,它在创建密钥时进行指定。

    或者,如果您要使 SSH 公钥具有到期时间,请修改该文件以符合下列格式:

    ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}

    其中:

    • [KEY_VALUE] 是 SSH 公钥值。
    • [USERNAME] 是此 SSH 密钥的用户,它在创建密钥时进行指定。
    • [EXPIRE_TIME]ISO 8601 格式的值,例如 2018-12-04T20:12:00+0000
  4. 保存所做更改并使文件保持打开状态。

接下来,您就可将 SSH 公钥添加到项目或实例元数据中

gcloud 或 API

要检查 SSH 公钥的格式,请执行以下操作:

  1. 找到并打开 SSH 公钥文件。

  2. 检查 SSH 公钥文件的格式。

    • 如果 SSH 公钥具有到期时间,则它必须采用以下格式:

      [USERNAME]:ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}

      其中:

      • [USERNAME] 是此 SSH 密钥的用户,它在创建密钥时进行指定。
      • [KEY_VALUE] 是 SSH 公钥值。
      • [EXPIRE_TIME]ISO 8601 格式的值,例如 2018-12-04T20:12:00+0000
    • 否则,SSH 公钥必须采用以下格式:

      [USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]

      其中:

      • [USERNAME] 是此 SSH 密钥的用户,它在创建密钥时进行指定。
      • [KEY_VALUE] 是 SSH 公钥值。
  3. 如果您的密钥与上述任一格式均不匹配,或者您想要添加、修改或移除过期时间,请按照以下说明设置 SSH 公钥的格式。否则,请保持文件打开并将 SSH 公钥添加到项目或实例元数据中

要设置用于 gcloud 工具或 API 的 SSH 公钥的格式,请执行以下操作:

  1. 生成公钥文件的副本。在 Compute Engine 中使用该副本,同时保留原始文件以在其他 SSH 配置中使用。

  2. 打开公钥文件的副本。此文件应默认具有以下格式:

    ssh-rsa [KEY_VALUE] [USERNAME]

    其中:

    • [KEY_VALUE] 是 SSH 公钥值。
    • [USERNAME] 是此 SSH 密钥的用户,它在创建密钥时进行指定。
  3. 复制文件末尾的用户名,并将其粘贴到文件的开头,再后跟冒号。现在,此 SSH 公钥文件应具有以下格式:

    [USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]

    其中:

    • [USERNAME] 是此 SSH 密钥的用户,它在创建密钥时进行指定。
    • [KEY_VALUE] 是 SSH 公钥值。
  4. 或者,您可按以下方式设置密钥的到期时间:删除第二个 [USERNAME],并将 google-ssh 附加到密钥文件的末尾,后接 JSON 格式的 userNameexpireOn 字段。

    [USERNAME]:ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}

    其中:

    • [USERNAME] 是此 SSH 密钥的用户,它在创建密钥时进行指定。
    • [KEY_VALUE] 是 SSH 公钥值。
    • [EXPIRE_TIME]ISO 8601 格式的值,例如 2018-12-04T20:12:00+0000
  5. 保存所做更改并使文件保持打开状态。

接下来,您就可将 SSH 公钥添加到项目或实例元数据中

修改 SSH 公钥元数据

如果用户通过第三方工具访问 Linux 实例,则其访问权限由实例可用的 SSH 公钥决定。您可通过修改元数据来控制 Linux 实例可用的 SSH 公钥;元数据中存储有您的 SSH 公钥及相关信息。对于您的 SSH 公钥,存在三种类型的元数据:

  • 项目范围的 SSH 公钥:使用此元数据向用户提供一般访问权限,使其能够连接到项目中的大多数实例。
  • 允许或屏蔽项目范围的 SSH 公钥:使用此元数据值在特定实例上允许或屏蔽项目范围的 SSH 公钥。默认情况下,实例接受项目范围的所有 SSH 公钥。如果希望仅允许具有实例级 SSH 公钥的用户访问实例,请屏蔽项目范围的 SSH 公钥。
  • 实例级 SSH 公钥:使用此元数据向用户提供特殊访问权限,即使屏蔽项目范围的 SSH 公钥,用户也能够连接到项目中的特定实例。

添加或移除项目范围的 SSH 公钥

使用项目范围的 SSH 公钥向用户提供对 Linux 实例的一般访问权限。如果具有项目范围的 SSH 公钥,则用户能够访问项目中允许项目范围的 SSH 公钥的所有 Linux 实例。如果实例屏蔽项目范围的 SSH 公钥,则用户无法使用其项目范围的 SSH 公钥连接到实例,除非该 SSH 公钥也已添加到实例元数据中。

Console

要在 GCP Console 中添加或移除项目范围的 SSH 公钥,请执行以下操作:

  1. 在 Google Cloud Platform Console 中,转到您项目的元数据页面。

    转到元数据页面

  2. SSH 密钥 (SSH Keys) 下,点击修改

  3. 修改项目范围的 SSH 公钥:

    • 要添加 SSH 公钥,请点击页面底部的添加项目。这将调出一个文本框。复制 SSH 公钥文件的内容并将其粘贴到文本框中。对您要添加的每个 SSH 公钥重复此过程。
    • 要移除 SSH 公钥,请点击其旁边的移除按钮:

      PuTTYgen 公钥的屏幕截图

      对要移除的每个 SSH 公钥重复此过程。

  4. 完成后,点击页面底部的保存

gcloud

使用 gcloud 工具添加或移除项目范围的 SSH 公钥:

  1. 如果您的项目已具有项目范围的 SSH 公钥,请从元数据中获取这些 SSH 公钥:

    1. 获取项目的现有元数据:

      gcloud compute project-info describe
      
    2. 在输出中找到 ssh-keys 元数据值:

      ...
      metadata:
        fingerprint: QCofVTHlggs=
        items:
        - key: ssh-keys
          value: |-
            [USERNAME_1]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME_1]
            [USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
      ...
      

      其中:

      • [USERNAME_1][USERNAME_2] 是您现有密钥的用户名。
      • [EXISTING_KEY_VALUE_1][EXISTING_KEY_VALUE_2] 是已应用于您的项目的公钥值。
    3. 复制 SSH 公钥。

  2. 在本地工作站上创建并打开一个新的文本文件。

  3. 在该文件中创建一个列表,其中包含您要在项目元数据中添加或保留的所有 SSH 公钥。如果您当前具有项目范围的密钥,则您列表中未包含的任何密钥都将被移除。

    例如,以下示例列表将移除 [USERNAME_1] 的密钥,因为其 SSH 密钥未包含在内。它还将保留 [USERNAME_2] 的 SSH 密钥并添加 [USERNAME_3] 的 SSH 密钥,因为列表中列出了它们的 SSH 密钥。

    [USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
    [USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]
    

    其中:

    • [USERNAME_1][USERNAME_2][USERNAME_3] 是 SSH 公钥的用户名。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 密钥的公钥值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 密钥的公钥值。
    • [NEW_KEY_VALUE] 是您要添加的 SSH 密钥的公钥值。
  4. 保存并关闭文件。

  5. 在命令提示符处,使用 compute project-info add-metadata 命令来设置项目范围的 ssh-keys 值。将 --metadata-from-file 标志包括在内并指定您的列表文件的路径。

    gcloud compute project-info add-metadata --metadata-from-file ssh-keys=[LIST_PATH]
    

    其中 [LIST_PATH] 是您的 SSH 公钥列表的路径。

API

使用 instances.setMetadata 方法添加或移除项目范围的公钥。

  1. 使用 projects.get 方法获取元数据 fingerprint 值。如果要保留现有的项目范围的密钥,请获取现有的 ssh-keys 值。

    GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]
    
    ...
    "fingerprint": "[FINGERPRINT]",
    "items": [
     {
      "key": "ssh-keys",
      "value": "[USERNAME_1]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME_1]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]"
     }
    ]
    ...

    其中:

    • [PROJECT_ID] 是您的唯一项目 ID。
    • [FINGERPRINT] 是此特定元数据配置的唯一 ID,它可防止您不小心覆盖并发更改。
    • [USERNAME_1][USERNAME_2] 是您现有密钥的用户名。
    • [EXISTING_KEY_VALUE_1][EXISTING_KEY_VALUE_2] 是已应用于您的项目的公钥值。
  2. 创建一个列表,其中包含您要在项目范围的元数据中添加或保留的所有 SSH 公钥。如果您当前在项目范围的元数据中具有 SSH 公钥,则您列表中未包含的任何密钥都将被移除。

    在本例中,该文件包含一个新的 [KEY_VALUE],后接您在上一步中获取的其中一个现有密钥值。[EXISTING_KEY_VALUE_1] 未包含在内,因此它将在下一步中从实例中移除。请使用 \n 字符将每个密钥值隔开。

    [USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
    

    其中:

    • [USERNAME_1][USERNAME_2][USERNAME_3] 是您密钥的用户名。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 密钥的公钥值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 密钥的公钥值。
    • [NEW_KEY_VALUE] 是您要添加的 SSH 密钥的公钥值。
  3. 使用 projects.setcommoninstancemetadata 方法来设置项目范围的 ssh-keys 值。将 fingerprint 值包含在内,它可确保您不会覆盖对此元数据值执行的任何并发更改。

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/setCommonInstanceMetadata
    
    {
     "items": [
      {
       "key": "ssh-keys",
       "value": "[USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]"
      }
     ]
     "fingerprint": "[FINGERPRINT]"
    }
    

    其中:

    • [PROJECT_ID] 是您的唯一项目 ID。
    • [USERNAME_1][USERNAME_2][USERNAME_3] 是您密钥的用户名。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 密钥的公钥值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 密钥的公钥值。
    • [NEW_KEY_VALUE] 是您要添加的 SSH 密钥的公钥值。
    • [FINGERPRINT] 是您之前使用 projects.get 方法获得的指纹。

完成后,请尝试通过第三方工具连接到您的 Linux 实例,从而测试您的更改。

如果遇到问题,请检查您尝试连接的实例的元数据。如果实例级元数据设置为屏蔽项目范围的 SSH 密钥,或者其具有已弃用的仅限实例的 sshKeys 值,则该实例将忽略所有项目范围的 SSH 密钥。要将项目范围的密钥应用到实例,请确保该实例允许项目范围的 SSH 公钥,并且从实例元数据中移除已弃用的仅限实例的 sshKeys 值(若有)。

允许或屏蔽来自 Linux 实例的项目范围的 SSH 公钥

如果您需要实例忽略项目范围的 SSH 公钥并仅使用实例级密钥,您可以屏蔽来自该实例的项目范围的 SSH 公钥。这样,只有实例级元数据中存储有其 SSH 公钥的用户才能访问该实例。如果您希望实例同时使用项目范围的 SSH 公钥和实例级 SSH 公钥,请将实例元数据设置为允许项目范围的 SSH 密钥。这样,项目范围的元数据或实例级元数据中存储有其 SSH 公钥的用户都可访问该实例。

Console

要在 GCP Console 中允许或屏蔽项目范围的 SSH 公钥,请执行以下操作:

  1. 在 Google Cloud Platform Console 中,转到虚拟机实例页面。

    转到实例页面

  2. 点击您要修改的实例的名称。

  3. 点击工具栏中的修改

  4. SSH 密钥 (SSH Keys) 下,转到屏蔽项目范围的 SSH 密钥复选框。

    • 要阻止使用项目范围的 SSH 密钥的用户连接到此实例,请选择屏蔽项目范围的 SSH 密钥
    • 要允许使用项目范围的 SSH 密钥的用户连接到此实例,请取消选择屏蔽项目范围的 SSH 密钥
  5. 完成后,点击页面底部的保存

gcloud

要允许或屏蔽来自 Linux 实例的项目范围的 SSH 公钥,请将 block-project-ssh-keys 元数据值添加到您的实例:

  • 要屏蔽项目范围的 SSH 公钥,请将元数据值设置为 TRUE

    gcloud compute instances add-metadata [INSTANCE_NAME] --metadata block-project-ssh-keys=TRUE
    

    其中,[INSTANCE_NAME] 是您要屏蔽项目范围的 SSH 公钥的实例名称。

  • 要允许项目范围的 SSH 公钥,请将元数据值设置为 FALSE

    gcloud compute instances add-metadata [INSTANCE_NAME] --metadata block-project-ssh-keys=FALSE
    

    其中,[INSTANCE_NAME] 是您要允许项目范围的 SSH 公钥的实例名称。

API

要屏蔽或允许来自 Linux 实例的项目范围的 SSH 公钥,请执行以下操作:

  • 要屏蔽项目范围的 SSH 公钥,请将 block-project-ssh-keys 元数据值添加到您的实例,并将其设置为 TRUE。此元数据值将阻止所有项目范围的密钥在此实例上使用,从而只能使用实例级密钥。

     POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]/setMetadata
    
     {
      "items": [
       {
        "key": "block-project-ssh-keys",
        "value": TRUE
       }
      ]
      "fingerprint": "[FINGERPRINT]"
     }
    

    其中:

    • [PROJECT_ID] 是您的唯一项目 ID。
    • [ZONE] 是实例所在的地区。
    • [INSTANCE_NAME] 是您要屏蔽项目级密钥的实例。
    • [FINGERPRINT] 是此特定元数据配置的唯一 ID,它可防止您不小心覆盖并发更改。
  • 要允许项目范围的 SSH 公钥,请将 block-project-ssh-keys 元数据值添加到您的实例,并将其设置为 FALSE。此元数据值将允许所有项目范围的密钥(以及实例级密钥)在此实例上使用。

     POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]/setMetadata
    
     {
     "items": [
      {
       "key": "block-project-ssh-keys",
       "value": FALSE
      }
     ]
     "fingerprint": "[FINGERPRINT]"
     }
    

    其中:

    • [PROJECT_ID] 是您的唯一项目 ID。
    • [ZONE] 是实例所在的地区。
    • [INSTANCE_NAME] 是您要允许项目级密钥的实例。
    • [FINGERPRINT] 是此特定元数据配置的唯一 ID,它可防止您不小心覆盖并发更改。

完成后,请尝试通过第三方工具连接到您的 Linux 实例,从而测试您的更改。

添加或移除实例级 SSH 公钥

实例级 SSH 公钥使用户能够访问特定的 Linux 实例。即使 Linux 实例屏蔽项目范围的 SSH 公钥,具有实例级 SSH 公钥的用户也可以访问该实例。

Console

要从 GCP Console 添加或移除实例级 SSH 公钥,请执行以下操作:

  1. 在 Google Cloud Platform Console 中,转到虚拟机实例页面。

    转到实例页面

  2. 点击您要修改的实例的名称。

  3. 点击工具栏中的修改

  4. SSH 密钥 (SSH Keys) 下,点击显示和修改。该部分随即展开,显示所有实例级 SSH 公钥。

  5. 修改实例级 SSH 公钥:

    • 要添加 SSH 公钥,请点击添加项目。这将调出一个文本框。复制 SSH 公钥文件的内容并将其粘贴到文本框中。对您要添加的每个 SSH 公钥重复此过程。
    • 要移除 SSH 公钥,请点击其旁边的移除按钮:

      PuTTYgen 公钥的屏幕截图

      对要移除的每个 SSH 公钥重复此过程。

  6. 完成后,点击页面底部的保存

gcloud

要使用 gcloud 工具添加或移除实例级 SSH 公钥,请执行以下操作:

  1. 如果您的实例已具有实例级 SSH 公钥,请从元数据中获取这些 SSH 公钥:

    1. 获取实例的现有元数据:

       gcloud compute instances describe [INSTANCE_NAME]
       

      其中 [INSTANCE_NAME] 是您需要添加或移除 SSH 公钥的实例的名称。

    2. 在输出中找到 ssh-keys 元数据值:

       ...
       metadata:
         fingerprint: QCofVTHlggs=
         items:
         ...
         - key: ssh-keys
           value: |-
             [USERNAME_1]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME_1]
             [USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
       ...
      

      其中:

      • [USERNAME_1][USERNAME_2] 是您现有密钥的用户名。
      • [EXISTING_KEY_VALUE_1][EXISTING_KEY_VALUE_2] 是已应用于您的实例的公钥值。

    3. 复制 ssh-keys 元数据值下的 SSH 公钥。

  2. 在本地工作站上创建并打开一个新的文本文件。

  3. 在该文件中创建一个列表,其中包含您要在实例级元数据中添加或保留的所有 SSH 公钥。如果您当前在实例级元数据中具有 SSH 公钥,则您列表中未包含的任何密钥都将被移除。

    例如,以下示例列表将移除 [USERNAME_1] 的密钥,因为其 SSH 密钥未包含在内。它还将保留 [USERNAME_2] 的 SSH 密钥并添加 [USERNAME_3] 的 SSH 密钥,因为列表中列出了它们的 SSH 密钥。

    [USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
    [USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]
    

    其中:

    • [USERNAME_1][USERNAME_2][USERNAME_3] 是 SSH 公钥的用户名。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 密钥的公钥值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 密钥的公钥值。
    • [NEW_KEY_VALUE] 是您要添加的 SSH 密钥的公钥值。
  4. 保存并关闭文件。

  5. 在命令提示符处,使用 compute instances add-metadata 命令来设置仅限实例的 ssh-key 值。将 --metadata-from-file 标志包括在内并指定您创建的公钥文件列表的路径。

    gcloud compute instances add-metadata [INSTANCE_NAME] --metadata-from-file ssh-keys=[LIST_PATH]
    

    其中:

    • [INSTANCE_NAME] 是您要应用 SSH 公钥文件的实例的名称。
    • [LIST_PATH] 是 SSH 公钥列表的路径。

API

使用 instances.setMetadata 方法在元数据中添加仅限实例的 ssh-keys 值。

  1. 使用 instances.get 方法获取要用于请求的元数据 fingerprint 值。如果您想要保留现有的实例级密钥,请获取现有的 ssh-keys 值。

    GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]
    

    服务器会返回如下响应:

    ...
    "fingerprint": "[FINGERPRINT]",
    "items": [
     {
      "key": "ssh-keys",
      "value": "[USERNAME_1]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME_1]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]"
     }
    ]
    ...
    

    其中:

    • [PROJECT_ID] 是您的唯一项目 ID。
    • [ZONE] 是实例所在的地区。
    • [INSTANCE_NAME] 是您要修改实例级 SSH 公钥的实例。
    • [FINGERPRINT] 是此特定元数据配置的唯一 ID,它可防止您不小心覆盖并发更改。
    • [USERNAME_1][USERNAME_2] 是您现有密钥的用户名。
    • [EXISTING_KEY_VALUE_1][EXISTING_KEY_VALUE_2] 是已应用于您的实例的公钥值。
  2. 创建一个列表,其中包含您要在实例级元数据中添加或保留的所有 SSH 公钥。如果您当前在实例级元数据中具有 SSH 公钥,则您列表中未包含的任何密钥都将被移除。

    在本例中,该文件包含一个新的 [KEY_VALUE],后接您在上一步中获取的其中一个现有密钥值。[EXISTING_KEY_VALUE_1] 未包含在内,因此它将在下一步中从实例中移除。请使用 \n 字符将每个密钥值隔开。

    [USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]
    

    其中:

    • [USERNAME_1][USERNAME_2][USERNAME_3] 是您密钥的用户名。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 密钥的公钥值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 密钥的公钥值。
    • [NEW_KEY_VALUE] 是您要添加的 SSH 密钥的公钥值。
  3. 使用 instances.setMetadata 方法来设置仅限实例的 ssh-keys 值。将 fingerprint 值包含在内,它可确保您不会覆盖对此元数据值执行的任何并发更改。

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]/setMetadata
    
    {
     "items": [
      {
       "key": "ssh-keys",
       "value": "[USERNAME_3]:ssh-rsa [NEW_KEY_VALUE] [USERNAME_3]\n[USERNAME_2]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME_2]"
      }
     ]
     "fingerprint": "[FINGERPRINT]"
    }
    

    其中:

    • [PROJECT_ID] 是您的唯一项目 ID。
    • [ZONE] 是实例所在的地区。
    • [INSTANCE_NAME] 是您要修改实例级 SSH 公钥的实例。
    • [USERNAME_1][USERNAME_2][USERNAME_3] 是您密钥的用户名。
    • [EXISTING_KEY_VALUE_1] 是您要移除的 SSH 密钥的公钥值。
    • [EXISTING_KEY_VALUE_2] 是您要保留的 SSH 密钥的公钥值。
    • [NEW_KEY_VALUE] 是您要添加的 SSH 密钥的公钥值。
    • [FINGERPRINT] 是此特定元数据配置的唯一 ID,它可防止您不小心覆盖并发更改。

完成后,请尝试通过第三方工具连接到您的 Linux 实例,从而测试您的更改。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档