使用 OS Login 管理实例访问权限

OS Login 允许您使用 Compute Engine IAM 角色来管理对 Linux 实例的 SSH 访问权限,这种替代功能让您可以通过在元数据中添加和移除 SSH 密钥来手动管理实例访问权限。

要配置 OS Login 并连接到您的实例,请使用以下过程:

  1. 在您的项目或单个实例上启用 OS Login 功能
  2. 向您自己、项目成员或组织成员授予必要的 IAM 角色
  3. (可选)完成以下任何步骤:
  4. 连接实例
  5. 查看预期的登录行为

限制

  • Google Kubernetes Engine 目前不支持 OS Login 功能。启用 OS Login 功能后,Google Kubernetes Engine 集群节点将继续使用元数据 SSH 密钥。

  • Windows Server 和 SQL Server 映像系列尚不支持 OS Login。

启用或停用 OS Login

您必须先通过在项目或实例的元数据中设置元数据键/值对 (enable-oslogin=TRUE) 来启用 OS Login 功能,然后才能使用 IAM 角色管理实例访问权限。要禁用 OS Login,请将元数据值设置为 FALSE。例如,您可以在项目级别使用 enable-oslogin=TRUE 在整个项目中启用该功能,但在尚且无法使用它的特定实例上设置 enable-oslogin=FALSE

您可以使用以下某种方式在项目或实例上应用 enable-oslogin 元数据值:

Console

在项目范围的元数据中设置 enable-oslogin,使其应用于项目中的所有实例:

  1. 转到元数据页面
  2. 点击修改
  3. 添加一个元数据条目,其中键为 enable-oslogin,值为 TRUE。或者,将该值设置为 FALSE 以停用该功能。
  4. 点击保存以应用更改。

对于未运行 CoreOS 的虚拟机,此更改将立即生效;您无需重启实例。对于 CoreOS 分发,请重新引导或重启实例,以使更改生效。要重新启动,请先在实例上执行停止,然后执行启动操作。

在现有实例的元数据中设置 enable-oslogin

  1. 转到“虚拟机实例”页面
  2. 点击要为其设置元数据值的实例的名称。
  3. 在实例详情页面的顶部,点击修改以修改实例设置。
  4. 自定义元数据下方,添加一个元数据条目,其中键为 enable-oslogin,值为 TRUE。或者,将该值设置为 FALSE 以在实例上停用该功能。
  5. 在实例详情页面的底部,点击保存以将更改应用于实例。

对于除 CoreOS 之外的所有操作系统,此更改将立即生效;您无需重启实例。对于 CoreOS 分发,请重新引导或重启实例,以使更改生效。要重新启动,请先在实例上执行停止,然后执行启动操作。

创建实例时,请在实例元数据中设置 enable-oslogin

  1. 在 GCP Console 中,转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例
  3. 创建新实例页面上,为实例填写所需的属性。
  4. 元数据部分,添加一个元数据条目,其中键为 enable-oslogin,值为 TRUE。或者,将该值设置为 FALSE 以在实例上停用该功能。
  5. 点击创建以创建实例。

gcloud

在项目范围的元数据中设置 enable-oslogin,使其应用于项目中的所有实例:

gcloud 命令行工具中使用 project-info add-metadata 命令并设置 oslogin=TRUE 以启用 OS Login:

gcloud compute project-info add-metadata --metadata enable-oslogin=TRUE

或者,您可以将 enable-oslogin 设置为 FALSE 以停用 OS Login。

对于未运行 CoreOS 的虚拟机,此更改将立即生效;您无需重启实例。对于 CoreOS 分发,请重新引导或重启实例,以使更改生效。

在现有实例的元数据中设置 enable-oslogin

gcloud 命令行工具中使用 instances add-metadata 命令并设置 oslogin=TRUE 以启用 OS Login:

gcloud compute instances add-metadata [INSTANCE_NAME] --metadata enable-oslogin=TRUE

或者,您可以将 enable-oslogin 设置为 FALSE 以在您的实例上停用 OS Login。

对于除 CoreOS 之外的所有操作系统,此更改将立即生效;您无需重启实例。对于 CoreOS 分发,请重新引导或重启实例,以使更改生效。

创建实例时,请在实例元数据中设置 enable-oslogin

gcloud 命令行工具中使用 instances create 命令并设置 oslogin=TRUE 以启用 OS Login:

gcloud compute instances create [INSTANCE_NAME] --metadata enable-oslogin=TRUE

或者,您可以将 enable-oslogin 设置为 FALSE 以在您的实例上停用 OS Login。

除必需的元数据值外,您的实例还必须安装最新版的 Linux 访客环境。如果您的实例在运行您导入的自定义映像,请在这些实例上安装 Linux 访客环境以启用 OS Login。

在项目中的实例上启用 OS Login 后,请向用户授予连接这些实例的权限

为用户帐号配置 OS Login 角色

为 OS Login 授予 IAM 角色

当您在项目中的一个或多个实例上启用 OS Login 后,这些实例将只接受来自在项目或组织中拥有必要 IAM 角色的用户帐号的连接:

例如,您可以通过以下过程向您的用户授予实例访问权限:

  1. 将必要的实例访问权限角色授予用户。用户必须具备以下角色:

  2. 如果您是组织管理员,并希望组织外部的成员能够访问您的实例,请在组织级别向用户授予 roles/compute.osLoginExternalUser

除非您直接向用户提供有关您的实例的详细信息或这些实例的外部 IP 地址,否则他们无法查看这些详细信息。您需要向用户授予额外的 IAM 角色,这样他们才能查看实例的详细信息。例如,向用户授予 roles/compute.viewer 角色即可让他们查看项目中的所有资源,包括实例详细信息。

撤消 OS Login 的 IAM 角色

要撤消用户对可使用 OS Login 的实例的访问权限,请从该用户帐号中移除用户角色。用户仍然会拥有与其帐号关联的公共 SSH 密钥,但这些密钥不再会对您的实例起作用。

连接实例

当您配置必要的角色后,请使用 Compute Engine 工具连接实例。Compute Engine 会自动生成 SSH 密钥并将其与您的用户帐号关联。

或者,如果您创建自己的 SSH 密钥并将公钥添加到您的用户帐号 ,则可以使用第三方工具连接到实例。该实例从您的用户帐号获取您的公钥,还允许您在提供正确的用户名和匹配的 SSH 私钥后连接到该实例。

连接到实例后,请查看预期的登录行为

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

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

如果外部 Google 帐号拥有 roles/compute.osLoginExternalUser 角色,则可以配置 POSIX 帐号信息,从而与其他 OS Login 角色进行互动。

要向组织外部的用户授予 roles/compute.osLoginExternalUser 和其他必需的 OS Login 实例访问权限角色,请执行以下操作:

  1. 转到项目和组织选择页面。

    转到项目和组织选择页面

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

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

将 SSH 密钥添加到用户帐号

您可以将公共 SSH 密钥与以下用户帐号类型相关联:

您可以使用 gcloud 命令行工具 OS Login API 将 SSH 密钥添加到您自己的帐号。或者,如果您是组织的网域管理员,则可以使用 Directory API 将 SSH 密钥添加到组织中的用户帐号。

gcloud

gcloud compute os-login 命令仅适用于 Google Cloud SDK 184 及更高版本。

使用 gcloud 命令行工具将公共 SSH 密钥与帐号相关联。

gcloud compute os-login ssh-keys add \
    --key-file [KEY_FILE_PATH] \
    --ttl [EXPIRE_TIME]

其中:

  • [KEY_FILE_PATH] 是指向本地工作站上公共 SSH 密钥的路径。
  • [EXPIRE_TIME] 是一个可选标志,用于设置公共 SSH 密钥的到期时间。例如,您可以指定 30m,这样 SSH 密钥就会在 30 分钟后到期。此标志的有效单位包括 s(表示秒)、m(表示分钟)、h(表示小时)和 d(表示天)。另外,您可以将该值设置为 0,以指示没有到期时间。

OS Login API

使用 OS Login API 以将公共 SSH 密钥与帐号相关联。

POST https://oslogin.googleapis.com/v1/users/[ACCOUNT_EMAIL]:importSshPublicKey

{
 "key": "[SSH_KEY]",
 "expirationTimeUsec": "[EXPIRATION_TIMESTAMP]"
}

其中:

  • [ACCOUNT_EMAIL] 是表示您的托管用户帐号的电子邮件地址。
  • [SSH_KEY] 是您想要应用于帐号的公钥。
  • [EXPIRATION_TIMESTAMP] 是密钥的到期时间(以微秒为单位,从新纪元开始算)。

Directory API

如果您是组织的网域管理员,则可以使用 Directory API 参考将 SSH 密钥添加到组织中其他用户的帐号。例如,使用一个或多个 SSH sshPublicKeys 条目为 directory.users.update 方法创建 PUT 请求。

PUT https://www.googleapis.com/admin/directory/v1/users/[USER_ID_KEY]

{
 "sshPublicKeys": [
  {
   "key": "[SSH_KEY]",
   "expirationTimeUsec": "[EXPIRATION_TIMESTAMP]"
  },
  {
   "key": "[SSH_KEY]",
   "expirationTimeUsec": "[EXPIRATION_TIMESTAMP]"
  }
 ]
}

其中:

  • [USER_ID_KEY] 是用户的不可变 ID。
  • [SSH_KEY] 是您要应用于帐号的公钥。
  • [EXPIRATION_TIMESTAMP] 是密钥的到期时间(以微秒为单位,从新纪元开始算)。

要移除帐号中的所有密钥,请在正文中指定 "sshPublicKeys": null

PUT https://www.googleapis.com/admin/directory/v1/users/[USER_ID_KEY]

{
  "sshPublicKeys": null
}

其中 [USER_ID_KEY] 是用户的不可变 ID。

将密钥添加到帐号后,您可以使用第三方工具以及与帐号关联的用户名连接实例。请注意,您的组织管理员可以更改此用户名。您可以通过运行 gcloud compute os-login describe-profile 命令查找您帐号的用户名:

gcloud compute os-login describe-profile

name: [ACCOUNT_EMAIL]
posixAccounts:
⋮
  username: [USER_NAME]
⋮

其中:

  • [ACCOUNT_EMAIL] 是表示您的托管用户帐号的电子邮件地址。
  • [USER_NAME] 是用于建立 SSH 连接的用户名。默认情况下,此用户名是根据您的 [ACCOUNT_EMAIL] 生成的。

使用 Directory API 修改用户帐号

如果您是组织管理员,则可以修改用户帐号的实例登录设置以及多个其他用户属性。要了解如何让用户成为管理员,请参阅 Directory API 指南。您可以使用此 API 来添加和移除用户的 SSH 密钥、修改 POSIX 帐号信息,以及更改用户连接实例时使用的用户名。

例如,创建一个针对 directory.users.update 方法的 PUT 请求,并指定一个或多个要在用户帐号中更改的属性:

PUT https://www.googleapis.com/admin/directory/v1/users/[USER_ID_KEY]

{
 "posixAccounts": [
   {
    "username": "[USER_NAME]",
    "uid": "[UID]",
    "gid": "[GID]",
    "homeDirectory": "[USER_HOME_PATH]",
    "shell": "[SHELL_PATH]"
   }
  ],
}

其中:

  • [USER_ID_KEY] 是用户的不可变 ID。
  • [USER_NAME] 是 Compute Engine 为用户添加到实例的用户名。此值在您的组织中必须是独一无二的。
  • [UID] 是此用户在实例上使用的用户 ID。此属性的值必须介于 100165000 之间,或介于 655352147483647 之间。UID 在您的组织中必须是独一无二的。
  • [GID] 是此用户所属实例的组 ID。
  • [USER_HOME_PATH] 是此用户在实例上使用的主目录。例如,/home/example_username
  • [SHELL_PATH] 是用户连接实例后,指向其默认 shell 的路径。例如,/bin/bash/bin/sh

要了解您可以修改的所有帐号属性,请参阅 Directory API 参考

预期的登录行为

  • 在某些使用 OS Login 的实例上,您可能会在建立连线后收到以下错误消息:

    /usr/bin/id: cannot find name for group ID 123456789

    忽略此错误消息。此错误不会影响您的实例。

  • 如果 G Suite 管理员未设置用户名,则 OS Login 会通过组合用户的 Google 个人资料所关联电子邮件中的用户名和域来生成默认的 Linux 用户名。此命名惯例可确保唯一性。例如,如果与 Google 个人资料相关联的用户电子邮件是 user@example.com,则生成的用户名为 user_example_com

  • 使用 gcloud compute ssh 命令登录实例时,将显示以下消息:

    WARNING: Using OS Login user [user_example_com] instead of default user [user]

    此消息确认您是使用 OS Login 个人资料登录。

后续步骤

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

发送以下问题的反馈:

此网页
Compute Engine 文档