设置 OS Login

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

本主题介绍设置 OS Login 的基本步骤。设置 OS Login 时,您可以使用双重身份验证来增加一层安全性。如需了解详情,请参阅使用双重身份验证设置 OS Login

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

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

准备工作

限制

  • Google Kubernetes Engine (GKE) 目前不支持 OS Login。启用 OS Login 后,GKE 集群节点将继续使用元数据 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。

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

在项目中的实例上启用操作系统登录后,请向用户授予连接这些实例的权限

为用户帐号配置 OS Login 角色

为 OS Login 授予 IAM 角色

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

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

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

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

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

向服务帐号授予 SSH 访问权限

您可以使用 OS Login 角色来允许服务帐号建立与实例的 SSH 连接。这对于以下任务非常有用:

您可以通过以下过程向您的服务帐号授予 SSH 访问权限:

  1. 创建服务帐号
  2. 向您的服务帐号授予必要的 OS Login 角色。服务帐号需要使用与用户帐号相同的角色。如需了解如何为服务帐号配置角色和权限,请参阅向服务帐号授予角色
  3. 向您的服务帐号提供应用默认凭据,以便它可以为向必要 API 发出的请求授权。可使用以下选项之一提供应用默认凭据:

向您的服务帐号授予 SSH 访问权限之后,可以对应用进行配置以创建 SSH 密钥,并建立与 VPC 网络上其他实例的 SSH 连接。如需了解服务帐号 SSH 的示例应用,请参阅使用 SSH 将应用连接到实例教程。

撤消 OS Login IAM 角色

要撤消用户对可以使用操作系统登录的实例的访问权限,请从该用户帐号中移除用户角色。如需了解如何移除用户的 IAM 角色,请参阅授予、更改和撤消对资源的访问权限

撤消某用户的访问权限后,该用户仍然拥有与其帐号关联的公共 SSH 密钥,但这些密钥不再会对虚拟机实例起作用。

连接实例

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

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

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

预期的登录行为

  • 在某些使用操作系统登录的实例上,您可能会在建立连接后收到以下错误消息:

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

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

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

    系统在生成此用户名时会以与 G Suite 帐号关联的网域为依据。如果用户来自另一个 G Suite 组织,则生成的用户名带有“ext_”前缀。例如,如果 user@example.com 正在访问其他组织中的虚拟机,则其生成的用户名为 ext_user_example_com

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

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

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

将 SSH 密钥添加到用户帐号

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

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

gcloud

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

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

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

其中:

  • [KEY_FILE_PATH] 是指向本地工作站上公共 SSH 密钥的路径。确保公共 SSH 密钥格式正确。如果您在 Linux 系统上使用 PuTTYgen 来生成公钥,则必须使用 public-openssh 格式。
  • [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] 是您想要应用于帐号的公钥。确保公共 SSH 密钥格式正确。如果您在 Linux 系统上使用 PuTTYgen 来生成公钥,则必须使用 public-openssh 格式。
  • [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] 是您要应用于帐号的公钥。确保公共 SSH 密钥格式正确。如果您在 Linux 系统上使用 PuTTYgen 来生成公钥,则必须使用 public-openssh 格式。
  • [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] 生成的。

后续步骤

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

发送以下问题的反馈:

此网页
Compute Engine 文档