本文档介绍如何通过移除和屏蔽来自虚拟机的 SSH 密钥来阻止用户访问虚拟机 (VM) 实例。
准备工作
-
设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。
Select the tab for how you plan to use the samples on this page:
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
-
移除 SSH 密钥
您可以从使用 OS Login 的虚拟机和使用基于元数据的 SSH 密钥的虚拟机中移除 SSH 密钥。从使用 OS Login 的虚拟机中移除 SSH 密钥
使用 OS Login 的虚拟机接受与您的 Google 账号关联的 SSH 密钥。您可以使用 Google Cloud CLI 或 OS Login API 从用户账号中移除 SSH 公钥。如果您是组织的管理员,则可以使用 Directory API 将 SSH 密钥从用户账号中移除。Compute Engine 会自动从您的 Google 账号中移除过期的密钥。
如需从您的账号中移除 SSH 公钥,请执行以下操作:
如果您不确定要移除的密钥,请运行
gcloud compute os-login describe-profile
命令以查看与您的账号关联的所有密钥:gcloud compute os-login describe-profile
复制要删除的密钥的
fingerprint
值。使用
gcloud compute os-login ssh-keys remove
命令从账号中移除密钥:gcloud compute os-login ssh-keys remove --key=
KEY 将
KEY
替换为您要移除的 SSH 公钥或您要移除的密钥的 OS Login 指纹。
如需从您的账号中移除 SSH 公钥,请执行以下操作:
如果您不确定要移除的密钥,请使用
users.getLoginProfile
方法查看与账号关联的所有密钥:GET https://oslogin.googleapis.com/v1/users/
ACCOUNT_EMAIL /loginProfile将
ACCOUNT_EMAIL
替换为与您的账号关联的电子邮件地址。复制要删除的密钥的
fingerprint
值。使用
users.sshPublicKeys.delete
方法从账号中移除密钥:DELETE https://oslogin.googleapis.com/v1/users/
ACCOUNT_EMAIL /sshPublicKeys/FINGERPRINT 替换以下内容:
ACCOUNT_EMAIL
:与您的账号关联的电子邮件地址FINGERPRINT
:要移除的密钥的 SHA-256 指纹
从使用基于元数据的密钥的虚拟机中移除 SSH 密钥
您可以使用 Google Cloud 控制台、gcloud CLI 或 Compute Engine API 从项目或实例元数据中移除 SSH 公钥。
从特定用户的元数据中移除最后一个键或者特定用户的元数据中的最后一个键过期后,Compute Engine 会删除该用户的虚拟机上的 ~/.ssh/authorized_keys
文件。
从项目元数据中移除公钥
从项目元数据中移除 SSH 公钥,以移除对项目中所有虚拟机的访问权限。
使用 gcloud CLI 和 Compute Engine API 从元数据中移除密钥时,您必须检索现有密钥列表,修改密钥列表以移除不需要的密钥,并使用您要保留的密钥列表覆盖旧密钥,如以下部分所述。
执行此任务所需的权限
您必须拥有以下权限才能执行此任务:
compute.projects.setCommonInstanceMetadata
如需使用 Google Cloud 控制台从项目元数据中移除 SSH 公钥,请执行以下操作:
在 Google Cloud Console 中,转到元数据页面。
点击 SSH 密钥标签页。
点击页面顶部的
修改。找到您要移除的 SSH 密钥,然后点击该 SSH 密钥旁边的
删除按钮。对您要移除的每个 SSH 密钥重复执行此步骤。
点击保存。
如需使用 gcloud CLI 从项目元数据中移除 SSH 公钥,请执行以下操作:
运行
gcloud compute project-info describe
命令以获取项目的元数据:gcloud compute project-info describe
输出内容类似如下:
... metadata: ...
- key: ssh-keys
value: |- cloudysanfrancisco:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF baklavainthebalkans:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQDx3FNVC8 google-ssh {"userName":"baklavainthebalkans","expireOn":"2021-06-14T16:59:03+0000"} ...复制
ssh-keys
元数据值。在工作站上创建并打开一个新的文本文件。
在该文件中,粘贴您刚刚复制的 SSH 密钥列表,然后删除要从项目元数据中移除的所有密钥。
保存并关闭文件。
运行
gcloud compute project-info add-metadata
命令以设置项目范围的ssh-keys
值:gcloud compute project-info add-metadata --metadata-from-file=ssh-keys=
KEY_FILE 将
KEY_FILE
替换为以下项之一:- 您在上一步中创建的文件的路径(如果项目已有 SSH 密钥)
- 新建 SSH 公钥文件的路径(如果项目还没有 SSH 密钥)
如需使用 Compute Engine API 从项目元数据中移除 SSH 公钥,请执行以下操作:
使用
projects.get
方法从元数据中获取fingerprint
和ssh-keys
值。GET https://compute.googleapis.com/compute/v1/projects/
PROJECT_ID 将
PROJECT_ID
替换为您的项目 ID。响应类似于以下示例:
... "fingerprint": "utgYE_XWtE8=", "items": [ { "key": "ssh-keys", "value": "cloudysanfrancisco:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF\nbaklavainthebalkans:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQDx3FNVC8 google-ssh {"userName":"baklavainthebalkans","expireOn":"2021-06-14T16:59:03+0000"}" } ] ...
复制 SSH 密钥值列表并删除要移除的密钥。
使用
projects.setCommonInstanceMetadata
移除 SSH 密钥。POST https://compute.googleapis.com/compute/v1/projects/
PROJECT_ID /setCommonInstanceMetadata { "items": [ { "key": "ssh-keys", "value": "EXISTING_SSH_KEYS " } ] "fingerprint": "FINGERPRINT " }替换以下内容:
PROJECT_ID
:您的项目 IDEXISTING_SSH_KEYS
:您要保留的 SSH 密钥列表FINGERPRINT
:projects.get
请求的响应中的fingerprint
的值
从实例元数据中移除 SSH 公钥
从实例元数据中移除 SSH 公钥,以移除对单个虚拟机的访问权限。
使用 gcloud CLI 和 Compute Engine API 从元数据中移除密钥时,您必须检索现有密钥列表,修改密钥列表以移除不需要的密钥,并使用您要保留的密钥列表覆盖旧密钥,如以下部分所述。
执行此任务所需的权限
您必须拥有以下权限才能执行此任务:
compute.instances.setMetadata
如需使用 Google Cloud 控制台从实例元数据中移除 SSH 公钥,请执行以下操作:
在 Google Cloud 控制台中,转到虚拟机实例页面。
点击要为其移除密钥的虚拟机的名称。
点击修改。
在 SSH 密钥部分,点击显示和修改。该部分随即展开,显示所有实例级 SSH 公钥。
点击您要移除的 SSH 密钥旁边的
删除按钮。对您要移除的每个 SSH 密钥重复执行此步骤。
点击保存。
如需使用 gcloud CLI 从实例元数据中移除 SSH 公钥,请执行以下操作:
运行
gcloud compute instances describe
命令以获取虚拟机的元数据:gcloud compute instances describe
VM_NAME 将 VM_NAME 替换为需要添加或移除 SSH 公钥的虚拟机的名称。
输出内容类似如下:
... metadata: ...
- key: ssh-keys
value: |- cloudysanfrancisco:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF baklavainthebalkans:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQDx3FNVC8 google-ssh {"userName":"baklavainthebalkans","expireOn":"2021-06-14T16:59:03+0000"} ...复制
ssh-keys
元数据值。在本地工作站上创建并打开一个新的文本文件。
在该文件中,粘贴您刚刚复制的 SSH 密钥列表,然后移除要删除的所有密钥。
保存并关闭文件。
运行
gcloud compute project-info add-metadata
命令以设置项目范围的ssh-keys
值:gcloud compute instances add-metadata
VM_NAME --metadata-from-file ssh-keys=KEY_FILE 替换以下内容:
VM_NAME
:您要移除其 SSH 密钥的虚拟机KEY_FILE
:包含所有项目 SSH 密钥列表的文件的路径
如需使用 Compute Engine API 从实例元数据中移除 SSH 公钥,请执行以下操作:
使用
instances.get
方法从元数据中获取fingerprint
和ssh-keys
值。GET https://compute.googleapis.com/compute/v1/projects/
PROJECT_ID /zones/ZONE /instances/VM_NAME 替换以下内容:
PROJECT_ID
:您的项目 IDZONE
:您要为其添加 SSH 密钥的虚拟机的可用区VM_NAME
:您要为其添加 SSH 密钥的虚拟机
响应类似于以下示例:
... "fingerprint": "utgYE_XWtE8=", "items": [ { "key": "ssh-keys", "value": "cloudysanfrancisco:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF\nbaklavainthebalkans:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQDx3FNVC8 google-ssh {"userName":"baklavainthebalkans","expireOn":"2021-06-14T16:59:03+0000"}" } ] ...
复制 SSH 密钥值列表并删除要移除的密钥。
使用
instances.setMetadata
移除 SSH 密钥。POST https://compute.googleapis.com/compute/v1/projects/
PROJECT_ID /zones/ZONE /instances/VM_NAME /setMetadata { "items": [ { "key": "ssh-keys", "value": "EXISTING_SSH_KEYS } ] "fingerprint": "FINGERPRINT " }替换以下内容:
PROJECT_ID
:您的项目 IDEXISTING_SSH_KEYS
:projects.get
请求的响应中的ssh-keys
键的值FINGERPRINT
:instances.get
请求的响应中的fingerprint
的值
屏蔽使用基于元数据的 SSH 密钥的虚拟机的项目 SSH 密钥
您可以通过阻止来自虚拟机的项目 SSH 密钥,阻止虚拟机接受存储在项目元数据中的 SSH 密钥。 您可以在创建虚拟机时或者创建虚拟机后屏蔽来自虚拟机的项目 SSH 密钥。
在虚拟机创建的过程中阻止来自虚拟机的项目 SSH 密钥
您可以在创建虚拟机的过程中使用 Google Cloud 控制台、gcloud CLI 或 Compute Engine API 阻止来自虚拟机的项目 SSH 密钥。
如需使用 Google Cloud 控制台创建虚拟机并阻止其接受存储在项目元数据中的 SSH 密钥,请执行以下操作:
在 Google Cloud Console 中,转到创建实例页面。
指定虚拟机详情。
展开高级选项部分,然后执行以下操作:
展开安全部分。
选中屏蔽项目范围的 SSH 密钥。
要创建并启动该虚拟机,请点击创建。
如需使用 gcloud CLI 创建虚拟机并阻止其接受存储在项目元数据中的 SSH 密钥,请使用 gcloud compute instances create
命令:
gcloud compute instances createVM_NAME \ --metadata block-project-ssh-keys=TRUE
将 VM_NAME
替换为新虚拟机的名称。
如需使用 Compute Engine 创建虚拟机并阻止其接受存储在项目元数据中的 SSH 密钥,请构建一个向 instances.insert
方法发出的 POST
请求:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID /zones/ZONE /instances
替换以下内容:
PROJECT_ID
:项目 IDZONE
:虚拟机所在的区域
在请求正文中,在 items
属性中提供用户名和 SSH 公钥:
... { "items": [ { "key": "block-project-ssh-keys", "value": TRUE } ] } ...
在虚拟机创建之后阻止来自虚拟机的项目 SSH 密钥
您可以在创建虚拟机后使用 Google Cloud 控制台、gcloud CLI 或 Compute Engine API 阻止来自虚拟机的项目 SSH 密钥。
执行此任务所需的权限
您必须拥有以下权限才能执行此任务:
compute.projects.setCommonInstanceMetadata
如需使用 Google Cloud 控制台阻止虚拟机接受存储在项目元数据中的 SSH 密钥的连接,请执行以下操作:
在 Google Cloud 控制台中,转到虚拟机实例页面。
点击要为其屏蔽项目 SSH 密钥的虚拟机的名称。
点击修改。
在 SSH 密钥下,选中屏蔽项目范围的 SSH 密钥复选框。
修改完 SSH 密钥的连接设置后,点击保存。
如需使用 gcloud CLI 阻止虚拟机接受存储在项目元数据中的 SSH 密钥的连接,请执行以下操作:
运行 gcloud compute instances add-metadata
命令:
gcloud compute instances add-metadataVM_NAME --metadata block-project-ssh-keys=TRUE
将 VM_NAME
替换为要针对其屏蔽项目范围的 SSH 公钥的虚拟机名称。
如需使用 Compute Engine API 阻止虚拟机接受存储在项目元数据中的 SSH 密钥的连接,请执行以下操作:
使用
instances.get
方法从元数据中获取fingerprint
。GET https://compute.googleapis.com/compute/v1/projects/
PROJECT_ID /zones/ZONE /instances/VM_NAME 替换以下内容:
PROJECT_ID
:您的项目 IDZONE
:您要为其添加 SSH 密钥的虚拟机的可用区VM_NAME
:您要为其添加 SSH 密钥的虚拟机
响应类似于以下示例:
... "fingerprint": "utgYE_XWtE8=" ...
使用
instances.setMetadata
方法将block-project-ssh-keys
设置为TRUE
:POST https://compute.googleapis.com/compute/v1/projects/
PROJECT_ID /zones/ZONE /instances/VM_NAME /setMetadata { "items": [ { "key": "block-project-ssh-keys", "value": TRUE } ] "fingerprint": "FINGERPRINT " }替换以下内容:
PROJECT_ID
是项目 IDZONE
是实例所在的可用区INSTANCE_NAME
是您要屏蔽的项目范围的密钥实例。FINGERPRINT
:instances.get
请求的响应中的fingerprint
的值。
后续步骤
- 了解使用 OS Login 进行访问权限管理的好处。
- 使用 Google 工具连接到虚拟机,因此您无需管理自己的 SSH 密钥。