设置 OS Login 及双重身份验证

如果使用 OS Login 管理对实例的访问权限,则可以使用双重身份验证(也称为 2FA)额外增加一层安全保障。

如需在实例上将 OS Login 与 2FA 身份验证结合使用,请完成以下步骤:

  1. 为您的 Google 帐号或网域启用 2FA
  2. 在您的项目或实例上启用 2FA
  3. 向您自己、项目成员或组织成员授予必要的 IAM 角色
  4. [可选] 如果您的项目属于组织,请查看管理组织中的 OS Login
  5. 连接实例
  6. 查看预期的登录行为

设置 OS Login 及 2FA 后,您可以使用审核日志来监控身份验证会话。

准备工作

限制

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

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

支持的操作系统

OS Login 双重身份验证需要在以下日期之后创建的操作系统映像:

操作系统 日期
CentOS 6 和 CentOS 7 2019 年 3 月 26 日
Debian 9 2019 年 3 月 26 日
RHEL 6 和 RHEL 7 2019 年 3 月 26 日
SUSE 12 和 SUSE 15 2019 年 6 月 17 日
Ubuntu 16.04 LTS、18.04 LTS、18.10 和 19.04 2019 年 6 月 28 日

支持的方法或验证类型

OS Login 支持以下 2FA 方法或验证类型:

为您的 Google 帐号或网域启用 2FA

您必须先对 Google 帐号或网域启用双重身份验证,然后才能为您的项目或实例启用这种验证方法。确保对包含项目或实例的网域启用 2FA,或者为拥有相应项目或实例的用户启用 2FA。

为保证安全性,您需要对所属组织中的用户帐号进行双重身份验证。启用 OS Login 双重身份验证不会阻止未配置双重身份验证的用户登录。

G Suite 管理员可以为网域启用双重身份验证,而个别 Google 用户可以在用户帐号级别启用双重身份验证。

网域

只有 G Suite 管理员才能为网域启用双重身份验证。

如需为网域启用 2FA,请参阅 G Suite 管理指南中的通过两步验证来保护您的企业

用户帐号

如果您的用户帐号并非由 G Suite 管理员管理,则可以为单个 Google 帐号配置 2FA。

如需为单个 Google 帐号配置 2FA,请参阅 Google 两步验证

在您的项目或实例上启用 2FA

在网域或用户帐号层级上启用双重身份验证后,您可以为单个实例或项目启用 OS Login 2FA 配置。

实例或项目必须首先启用 OS Login 才能使用 OS Login 2FA。

您可以在实例创建或项目设置期间同时配置 OS Login 和 OS Login 2FA, 也可以在已启用 OS Login 的现有实例或项目上配置 OS Login 2FA。

如需将您的项目或实例配置为使用 OS Login 双重身份验证,请在项目或实例元数据中设置“enable-oslogin-2fa=TRUE”。

控制台

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

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

    转到“虚拟机实例”页面

  2. 点击创建实例
  3. 创建新实例页面上,为实例填写所需的属性。
  4. 元数据部分中,添加以下元数据条目:

    • enable-oslogin,值为 TRUE
    • enable-oslogin-2fa,值为 TRUE
  5. 点击创建以创建实例。

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

  1. 转到“元数据”页面。

    转到“元数据”页面

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

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

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

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击要为其设置元数据值的实例的名称。
  3. 在实例详情页面的顶部,点击修改以修改实例设置。
  4. 自定义元数据下方,添加一个元数据键,其中键为 enable-oslogin-2fa,值为 TRUE。或者,将值设置为 FALSE 以在实例上停用该功能。您还应验证 enable-oslogin 是否设置为 True
  5. 在实例详情页面的底部,点击保存以将更改应用于实例。

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

gcloud

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

instance-name 替换为您的实例名称。

gcloud compute instances create instance-name \
    --metadata enable-oslogin=True,enable-oslogin-2fa=True

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

gcloud compute project-info add-metadata \
    --metadata enable-oslogin=True,enable-oslogin-2fa=True

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

instance-name 替换为您的实例名称。

gcloud compute instances add-metadata \
    --metadata enable-oslogin=True,enable-oslogin-2fa=True instance-name

为用户帐号配置 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 私钥后连接到该实例。

当您连接到该实例时,您将收到基于所选 2FA 方法或验证类型的消息。

  • 如果选择的是 Google 身份验证器,您将看到以下消息:

    "Enter your one-time password:"

  • 如果选择的是短信或电话验证,您将看到以下消息:

    "A security code has been sent to your phone. Enter code to continue:"

  • 如果选择的是电话提示,您将看到以下消息:

    A login prompt has been sent to your enrolled device:"

    使用电话提示方法时,请接受手机或平板电脑上的提示以继续操作。使用其他方法时,请输入您的安全代码或动态密码。

预期的登录行为

  • 在某些使用 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

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

  • 使用 gcloud compute ssh 命令登录实例时,对于属于 example.com 域的用户 user,登录消息的格式如下:

    Using OS Login user user_example_com instead of default user user

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

查看 OS Login 2FA 审核日志

Compute Engine 提供审核日志以跟踪双重身份验证请求。 双重身份验证有两种请求类型:

  • StartSession。启动新的身份验证会话。在 StartSession 调用中,客户端向服务器声明其功能并获取有关第一个验证的信息。StartSession 调用会返回以下内容:

    • 会话 ID。此会话 ID 会传递给所有后续 ContinueSession 调用。
    • 有关此新身份验证会话中所用验证方法或 2FA 方法的信息。
  • ContinueSession。继续现有身份验证会话。使用所提供的会话 ID,ContinueSession API 可以执行以下两项操作之一:

    • 接收对于验证或相应身份方法的响应,随后执行身份验证、拒绝验证请求或要求用户提供额外的验证信息。
    • 切换到与服务器最初在上一轮 API 调用中提出的验证类型不同的验证。如果客户端选择使用不同的验证类型(例如,选择 Google 身份验证器而非电话提示),则客户端可以使用所需类型的 request.challengeId,在对服务器的调用中请求不同的验证类型。

如需查看日志,您必须具有日志查看器的权限,或者具有项目的 Viewer 或 Editor 身份。

  1. 在 Cloud Console 中,转到“日志”页面。

    转到“日志”页面

  2. 展开下拉菜单并选择 Audited Resource
  3. 在搜索栏中,输入 oslogin.googleapis.com,然后按 Enter 键。
  4. 系统将显示描述双重身份验证请求的审核日志列表。 展开以下任一条目可以了解详情:

    用于双重身份验证的审核日志。

对于任何审核日志,您可以执行以下操作:

  1. 展开 protoPayload 属性。

    用于双重身份验证的审核日志指标。

  2. 查找 methodName 以查看此日志适用的活动(StartSessionContinueSession 请求)。例如,如果此日志跟踪的是 StartSession 请求,则方法名称将显示为 "google.cloud.oslogin.OsLoginService.v1.StartSession"。同样,ContinueSession 日志会显示为 "google.cloud.oslogin.OsLoginService.v1.ContinueSession"。每项启动会话和继续会话请求都会记录一个审核日志条目。

不同的日志类型有不同的审核日志属性。例如,与 StartSession 相关的审核日志具有特定于启动会话的属性,而 ContinueSession 的审核日志具有其自己的属性集。某些审核日志属性同时适用于这两种日志类型。

所有双重身份验证审核日志

属性
serviceName oslogin.googleapis.com
resourceName 包含项目编号的字符串。此项目编号指示审核日志所属的登录请求。例如 projects/myproject12345
severity 日志消息的严重级别。例如 INFOWARNING
request.email API 调用正在执行身份验证的用户的电子邮件地址。
request.numericProjectId Google Cloud 项目的编号。
response.@type type.googleapis.com/google.cloud.oslogin.OsLoginService.v1.StartOrContinueSessionResponse
response.sessionId 唯一标识会话的 ID 字符串。此会话 ID 将传递给序列中的下一项 API 调用。
response.authenticationStatus 会话状态。例如 AuthenticatedChallenge requiredChallenge pending
response.challenges 可供您为通过此轮身份验证而尝试的一组验证。其中最多有一项验证已开始,并且状态为 READY。其他验证则作为可选项提供,用户可以指定这些可选项来取代系统推荐的主要验证方案。

StartSession 审核日志

属性
methodName google.cloud.oslogin.OsLoginService.v1.StartSession
request.@type type.googleapis.com/google.cloud.oslogin.OsLoginService.v1.StartSessionRequest
request.supportedChallengeTypes 可供您从中选择的验证类型或 2FA 方法列表。

ContinueSession 审核日志

属性
methodName google.cloud.oslogin.OsLoginService.v1.ContinueSession
request.sessionId 唯一地识别上一次会话的 ID 字符串。此会话 ID 是由序列中的上一项 API 调用传递而来的。
request.@type type.googleapis.com/google.cloud.oslogin.OsLoginService.v1.ContinueSessionRequest
request.challengeId 标识要启动或执行哪项验证的 ID 字符串。此 ID 必须属于 response.challenges 调用在上一次 API 响应中返回的验证类型。
request.action 要执行的操作。

后续步骤

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

发送以下问题的反馈:

此网页
Compute Engine 文档