管理组织中的 OS Login


本文档介绍如何使用 OS Login 管理对组织中虚拟机实例的访问权限。

本主题介绍了以下任务:

准备工作

  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

OS Login 组织政策

您可以在组织中设置 OS Login 限制条件,以确保所有新项目和在这些新项目中创建的虚拟机实例都启用了 OS Login。

设置此限制条件后,将应用以下条件:

  • enable-oslogin=true 包括在所有新项目的项目元数据中。
  • 对于新的和现有的虚拟机和项目,将实例或项目元数据中的 enable-oslogin 设置为 false 的请求会被拒绝。

限制

以下产品、功能和虚拟机不支持 OS Login:
  • Cloud Data Fusion 6.1.4 版及更低版本
  • Cloud Composer
  • 运行版本低于 1.23.5 的 Google Kubernetes Engine (GKE) 公共集群
  • 运行版本低于 1.20.5 的节点池的 GKE 专用集群
  • Dataproc Serverless
  • Windows Server 和 SQL Server 虚拟机
  • Fedora CoreOS 虚拟机。如需管理对使用这些映像创建的虚拟机的实例访问权限,请使用 Fedora CoreOS Ignition 系统

Cloud Data Fusion、Cloud Composer 和 GKE 的解决方法

如需在使用 Cloud Data Fusion、Cloud Composer 和 GKE 的组织中使用 OS Login,您可以在组织级层启用 OS Login 限制条件,然后选择性地为受影响的项目或文件夹停用限制条件。

如需详细了解如何修改组织政策,请参阅创建和修改政策

启用组织政策

如需启用 OS Login 政策,您可以使用 Google Cloud CLI 为特定项目和文件夹设置 OS Login 限制条件。您还可以使用 Google Cloud 控制台或 Google Cloud CLI 为整个组织设置 OS Login 限制条件。

控制台

如需通过控制台设置 OS Login 组织政策,请完成以下步骤:

  1. 在 Google Cloud 控制台中,转到组织政策页面。

    转到“组织政策”页面

  2. 在政策列表中,点击要求 OS Login 查看 OS Login 限制条件。
  3. 点击修改,修改现有 OS Login 限制条件。
  4. 修改页面,选择自定义
  5. 如需对相关限制条件启用强制执行,请选择启用
  6. 点击保存应用限制设置。

gcloud

如需设置 OS Login 组织政策,请使用 gcloud beta resource-manager org-policies enable-enforce 命令。

  1. 查找您的组织 ID。

    gcloud organizations list
  2. 在组织中设置限制条件。将 organization-id 替换为您的组织 ID

    gcloud beta resource-manager org-policies enable-enforce compute.requireOsLogin \
        --organization=organization-id
    

您还可以将 OS Login 组织政策应用于分别带有 --folder--project 标志以及文件夹 ID 和项目 ID 的文件夹或项目。

对于文件夹,请运行以下命令:

gcloud beta resource-manager org-policies enable-enforce compute.requireOsLogin \
    --folder=folder-id

对于项目,请运行以下命令:

gcloud beta resource-manager org-policies enable-enforce compute.requireOsLogin \
    --project=project-id

替换以下内容:

向组织外部的用户授予实例访问权限。

默认情况下,组织外部的用户无法为组织中的实例设置 SSH 密钥,也无法获取对组织中实例的访问权限。但在某些情况下,您可能需要向属于其他组织的用户或拥有消费者 Google gmail.com 账号的用户授予实例访问权限。

roles/compute.osLoginExternalUser IAM 角色允许外部 Google 账号配置 POSIX 账号信息,以便与其他 OS Login 角色互动。

如需向组织外部的用户授予 roles/compute.osLoginExternalUser 和其他必需的 OS Login 实例访问权限角色,请完成以下步骤:

  1. 在 Google Cloud 控制台中,转到项目和组织选择页面。

    转到项目和组织选择页面

  2. 组织下拉菜单中,选择您的组织。
    1. 点击全部以查看您的所有组织。
    2. 点击组织的名称。
  3. 点击添加以将新角色添加给用户。
  4. 指定要为其配置实例访问权限的用户的用户名。
  5. 点击选择角色以指定要向用户授予的角色。
  6. Compute Engine 角色列表中,选择 Compute OS Login External User 角色。
  7. 点击添加以确认您要向用户授予选定的角色。
  8. 如果您尚未这样做,请在项目或组织级别向用户授予其他 OS Login 实例访问权限角色

现在,用户可以连接项目中启用了 OS Login 的实例

管理 OS Login API

在组织级层,您可以通过设置 Google Workspace 管理员控制机制来限制对 OS Login API 的访问权限。如需配置 Google Workspace 管理员控制机制或查看配置选项,请参阅控制组织中的哪些人可以使用 Google Cloud。作为 Google Workspace 管理员,您还可以启用或停用 OS Login API 的某些功能。这包括以下选项:

  • 选择是否在 OS Login API 生成的用户名中包含域名后缀。例如,如果未选中包含域名后缀的设置,则在网域 example.com 中,用户 user@example.com 将拥有用户名 user
  • 确定您组织的成员能否使用 OS Login API 管理 SSH 密钥。
  • 限制或允许您组织外部的用户访问虚拟机。

如需详细了解如何启用或停用 OS Login API 设置,请参阅选择 Google Cloud Platform 设置

审核 OS Login 事件

作为 Google Workspace 管理员,您可以使用 Google Workspace Admin SDK 审核通过 OS Login API 执行的操作。通过查看这些事件,您可以跟踪用户何时添加、删除或更新 SSH 密钥,或何时删除 POSIX 账号信息。

您可以通过使用 applicationName=gcp 调用 Activities.list(),从 Google Workspace Admin SDK 中检索 OS Login API 审核活动事件。如需了解详情,请参阅 Google Workspace Admin SDK Reports API 文档中的 Google Cloud 活动事件

使用 Directory API 修改用户账号

在连接实例时,OS Login 会使用您的 Cloud IdentityGoogle Workspace 用户设置。如果您是组织管理员,则可以使用 Directory API 为您的 Google Workspace 或 Cloud Identity 用户账号完成以下任务:

  • 修改实例登录设置。
  • 将用户设为管理员
  • 修改账号名称和电子邮件等用户属性
  • 为用户添加和移除 SSH 密钥
  • 修改 POSIX 账号信息
  • 更改用户在实例上连接的用户名。

以下示例展示了如何使用 Directory API 修改或者移除用户账号。如需详细了解您可以修改的账号属性,请参阅 Directory API 参考文档

修改账号属性

如需修改用户的 POSIX 账号信息或管理用户的 SSH 密钥,请向 directory.users.update 方法发出 PUT 请求,并指定要在用户账号中更改的一个或多个属性。

如果您修改了用户的 posixAccounts 属性,则必须在请求中指定当前或新的 usernameuidgid 值。

如果您修改了用户的 sshPublicKeys 属性,则必须在请求中指定 key 值。

以下是 PUT 请求的示例:

PUT https://admin.googleapis.com/admin/directory/v1/users/USER_KEY

{
 "posixAccounts": [
  {
    "username": "USERNAME",
    "uid": "UID",
    "gid": "GID",
    "homeDirectory": "USER_HOME_PATH",
    "shell": "SHELL_PATH"
   }
  ],
 "sshPublicKeys": [
  {
    "key": "KEY_VALUE",
    "expirationTimeUsec": EXPIRATION_TIME
   }
  ],
}

替换以下内容:

  • USER_KEY:用户的主电子邮件地址、别名电子邮件地址或唯一用户 ID。
  • USERNAME:Compute Engine 为用户添加到虚拟机的用户名。此值在您的组织中必须唯一,并且不得以波浪号(“~”)结尾,也不能包含英文句点(“.”)。
  • UID:此用户在虚拟机上使用的用户 ID。此属性的值必须介于 100160000 之间,或介于 655352147483647 之间。如需访问 Container-Optimized OS,UID 的值必须介于 65536214748646 之间。UID 在您的组织中必须是独一无二的。
  • GID:用户所属虚拟机的组 ID。
  • USER_HOME_PATH:(可选)用户在虚拟机上的主目录。例如 /home/example_username
  • SHELL_PATH:(可选)用户连接实例后,指向其默认 shell 的路径。例如 /bin/bash/bin/sh
  • KEY_VALUE:SSH 公钥值。
  • EXPIRATION_TIME:(可选)密钥的到期时间(以微秒为单位,从新纪元开始计算,1 秒 = 106 微秒)。

移除账号属性

如需清除用户的 posixAccountssshPublicKeys 数据,请向 directory.users.update 方法发出 PUT 请求,并将 posixAccountssshPublicKeys 字段设置为 null

PUT https://admin.googleapis.com/admin/directory/v1/users/USER_KEY

{
 "posixAccounts": null,
 "sshPublicKeys": null
}

USER_KEY 替换为用户的主电子邮件地址、别名电子邮件地址或唯一身份用户 ID。

将 Linux 群组与 OS Login 搭配使用

组织管理员可以通过创建和管理 POSIX 组,使用 Cloud Identity Groups API 为 OS Login 用户配置补充的 Linux 组。OS Login 将 POSIX 组与组织虚拟机中的补充 Linux 组相关联,以便您可以管理用户在虚拟机中拥有的权限。

管理 Linux 群组中的用户成员资格

如需创建 POSIX 组,请参阅创建和更新 POSIX 组

如需将用户添加到组,请参阅将用户添加到组或邀请用户加入组

成员资格更新会在 10 分钟内生效。组更改将在所有新创建的虚拟机中反映。POSIX 组更新最多可能需要六小时才能传播到所有正在运行的虚拟机。用户可能需要退出或使用 newgrp 命令来观察组更改。

采用 OS Login 的 Linux 群组的速率限制

采用 OS Login 的 Linux 群组使用 oslogin.googleapis.com/metadata_server_groups_requests 配额。默认情况下,针对特定区域,每个项目的配额限制为 60 个请求/分钟

如果您需要更高的速率限制,可以在 Google Cloud 控制台的“配额”页面中申请更多配额

转到“配额”

将员工身份联合与 OS Login 搭配使用

使用员工身份联合的组织可以使用 OS Login 管理对虚拟机的访问权限。为组织启用员工身份联合后,OS Login 会使用基于证书的身份验证,而不是基于密钥的身份验证来验证用户身份。

须知事项

限制

  • 您要连接的虚拟机必须具有 OpenSSH 7.4 或更高版本,才能将员工身份联合与 OS Login 搭配使用。

  • 使用员工身份联合的组织中的用户无法访问虚拟机的串行端口

连接到使用 OS Login 和员工身份联合的虚拟机

您可以使用 Google Cloud 控制台、gcloud CLI 或其他 SSH 客户端连接到将 OS Login 与员工身份联合搭配使用的虚拟机。

控制台

当您通过 SSH-in-browser 连接到将 OS Login 和员工身份联合搭配使用的虚拟机时,Compute Engine 会在您尝试连接时代表您配置 SSH 证书。

如需连接到虚拟机,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 在虚拟机实例列表中,点击要连接的实例所在行中的 SSH

    实例名称旁边的 SSH 按钮。

gcloud

使用 gcloud CLI 连接到将 OS Login 与员工身份联合搭配使用的虚拟机时,Compute Engine 会在您尝试连接时代表您配置 SSH 证书。

通过运行 gcloud compute ssh 命令使用 SSH 连接到虚拟机:

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 运行以下命令:

    gcloud compute ssh --project=PROJECT_ID --zone=ZONE VM_NAME

    通过运行以下命令连接到虚拟机:

    • PROJECT_ID:包含虚拟机的项目 ID
    • ZONE:该虚拟机所在的可用区的名称
    • VM_NAME:虚拟机的名称

    如果您已为 Google Cloud CLI 设置默认属性,则可以在此命令中省略 --project--zone 标志。例如:

    gcloud compute ssh VM_NAME

IAP 桌面

使用 IAP 桌面连接到将 OS Login 与员工身份联合搭配使用的虚拟机时,Compute Engine 会在您尝试连接时代表您配置 SSH 证书。

要使用 IAP 桌面连接到虚拟机,请执行以下操作:

  1. 在工作站上安装 IAP 桌面(如果尚未安装)。

  2. 打开 IAP 桌面。此时会打开添加项目窗口。

  3. 出现提示时,使用员工身份联合登录

  4. 添加项目窗口中,输入包含要连接的虚拟机的项目的项目 ID 或名称。

  5. Project Explorer 窗口中,再次右键点击虚拟机的名称,然后选择连接以连接到虚拟机。

SSH 客户端

如需使用 SSH 客户端连接到将 OS Login 与员工身份联合搭配使用的虚拟机,请执行以下操作:

  1. 如果您还没有 SSH 密钥,请创建 SSH 密钥
  2. 使用 users.projects.locations.signSshPublicKey 方法为您的 SSH 公钥签名:

    POST https://oslogin.googleapis.com/v1beta/users/USER/projects/PROJECT_ID/locations/LOCATION:signSshPublicKey
    
    {
     "ssh_public_key": "PUBLIC_KEY"
    }
    

    替换以下内容:

    • USER:员工池中的单个身份,格式如下:

      principal:%2F%2Fiam.googleapis.com%2Flocations%2Fglobal%2FworkforcePools%2POOL_ID%2Fsubject%2FSUBJECT_ATTRIBUTE_VALUE
      

      替换以下内容:

    • PROJECT_ID:要连接的虚拟机所属项目的 ID。

    • LOCATION:要连接的虚拟机所在的可用区。

    • PUBLIC_KEY:SSH 公钥文件的内容。

  3. user.signSshPublicKey 方法的输出中复制 SSH 证书,并将内容保存在新文件中。

  4. 运行以下命令,设置 SSH 证书文件的权限:

    sudo chmod 600 FILE_NAME
    

    FILE_NAME 替换为该文件的名称。

  5. 使用以下命令连接到虚拟机:

    ssh -i PATH_TO_PRIVATE_KEY -o CertificateFile=PATH_TO_SSH_CERTIFICATE USERNAME@EXTERNAL_IP
    

    替换以下内容:

    • PATH_TO_PRIVATE_KEY:您的 SSH 私钥文件的路径。
    • PATH_TO_SSH_CERTIFICATE:SSH 证书文件的路径。
    • USERNAME:用户的 google.posix_username 属性映射的值。
    • EXTERNAL_IP:虚拟机的外部 IP 地址。

后续步骤