OS Login 问题排查


本文档介绍如何使用元数据服务器排查 OS Login 问题。如需了解如何设置 OS Login 或查看分步说明,请参阅设置 OS Login

您可以从虚拟机实例中查询元数据服务器。 如需了解详情,请参阅存储和检索实例元数据

准备工作

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

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

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

      gcloud init
    2. Set a default region and zone.
    3. REST

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

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

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

常见的错误消息

以下是使用 OS Login 时可能会遇到的常见错误示例。

找不到群组名称

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

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

忽略此错误消息。此错误不会影响您的虚拟机。

获取群组失败

创建虚拟机时,您可能会看到如下所示的日志:

Dec 10 22:31:05 instance-1 google_oslogin_nss_cache[381]: oslogin_cache_refresh[381]: Refreshing group entry cache
Dec 10 22:31:05 instance-1 google_oslogin_nss_cache[381]: oslogin_cache_refresh[381]: Failure getting groups, quitting

这些日志表明您的组织未配置 OS Login Linux 群组。请忽略这些消息。

Failed precondition

使用 SSH 连接到虚拟机时,您可能会看到如下所示的错误:

ERROR: (gcloud.compute.ssh) FAILED_PRECONDITION: The specified username or UID is not unique within given system ID.

当 OS Login 尝试生成组织中已存在的用户名时,会发生此错误。删除用户账号后,不久之后就创建了具有相同电子邮件地址的新用户,这种情况很常见。删除用户账号后,最长可能需要 48 小时才能移除用户的 POSIX 信息。

如需解决此问题,请执行以下某项操作:

参数无效

使用 SSH 连接到虚拟机或使用 SCP 传输文件时,您可能会看到如下所示的错误:

ERROR: (gcloud.compute.ssh) INVALID_ARGUMENT: Login profile size exceeds 32 KiB. Delete profile values to make additional space.
ERROR: (gcloud.compute.scp) INVALID_ARGUMENT: Login profile size exceeds 32 KiB. Delete profile values to make additional space.

如需解决这些错误,请执行以下操作:

  1. 运行 gcloud compute os-login describe-profile 命令以查看 OS Login 配置文件:

    gcloud compute os-login describe-profile
    

    输出类似于以下内容:

    name: '00000000000000'
    posixAccounts:
    ...
    sshPublicKeys:
     ...:
       fingerprint: ...
       key: |
         ssh-rsa AAAAB3NzaC1yc2...
       name: ...
     ...
    
  2. 查看输出以确定任何未使用的 SSH 密钥。

  3. 使用 gcloud compute os-login ssh-keys remove 命令从输出中移除任何未使用的密钥:

    gcloud compute os-login ssh-keys remove --key=KEY
    

    KEY 替换为密钥的指纹或密钥字符串。

为防止将来出现此问题,请为 SSH 密钥添加过期时间。过期的密钥将在过期后 48 小时或在向配置文件添加新密钥时,自动从您的登录配置文件中移除。

默认 OS Login 元数据条目

Compute Engine 定义了一组提供 OS Login 信息的默认元数据条目。默认元数据始终由服务器定义和设置。默认元数据键区分大小写。

下表介绍了您可以查询的条目。

相对于 http://metadata.google.internal/computeMetadata/v1/
元数据条目 说明
project/attributes/enable-oslogin 检查当前 Google Cloud 项目是否已启用 OS Login。
instance/attributes/enable-oslogin 检查当前虚拟机是否已启用 OS Login。
oslogin/users/ 检索 OS Login 用户的个人资料信息。 您可以传递 usernameuidpagesizepagetoken 等查询参数。
oslogin/authorize/

检索 OS Login 用户的登录或管理级别权限设置。

要检查权限,您必须指定 policy 查询参数。 政策参数的值必须设置为 login(用于检查登录权限)或 adminLogin(用于检查 sudo 访问权限)。

检查是否已配置 OS Login

使用 Google Cloud 控制台或 Google Cloud CLI 查询元数据以确定是否已启用 OS Login。在项目或实例元数据中将 enable-oslogin 元数据键设置为 TRUE 时,系统会启用 OS Login。如果同时设置了实例元数据和项目元数据,则实例元数据中设置的值优先。

查看 OS Login 用户

要查看多个用户的个人资料信息,您需要指定 pagesizepagetoken 参数。将 pagesizepagetoken 替换为所需的数值。

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=PAGE_SIZE&
pagetoken=PAGE_TOKEN" -H "Metadata-Flavor: Google"

例如,要将 pagesize 设置为 1,将 pagetoken 设置为 0,请运行以下命令:

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=1&pagetoken=0" -H "Metadata-Flavor: Google"

在大多数发行版上,您还可以运行 Unix 命令 getent passwd 来检索组织用户的密码条目。

查看特定的 OS Login 用户

要查看虚拟机上特定用户的个人资料信息,请运行以下命令:

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=USERNAME" -H "Metadata-Flavor: Google"

USERNAME 替换为您要查询的用户的用户名。

例如,您可以执行请求来查找用户 user_example_com。以下命令和输出增加了格式,以提高可读性。

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=user_example_com" -H "Metadata-Flavor: Google"

输出内容类似如下:

{
    "loginProfiles": [{
        "name": "12345678912345",
        "posixAccounts": [{
            "primary": true,
            "username": "user_example_com",
            "uid": "123451",
            "gid": "123451",
            "homeDirectory": "/home/user_example_com",
            "operatingSystemType": "LINUX"
        }],
        "sshPublicKeys": {
            "204c4b4fb...": {
                "key": "ssh-rsa AAAAB3Nz...",
                "fingerprint": "204c4b4fb..."
            }
        }
    }]
}

在大多数发行版上,您还可以运行 getent passwd usernamegetent passwd uid 等 Unix 命令来检索个人资料信息。

要检索用户的 SSH 密钥,您还可以运行 /usr/bin/google_authorized_keys USERNAME。 如果未返回密钥,则说明用户可能没有登录虚拟机所需的权限。

检查登录权限

要查看登录权限和管理级别权限,您必须提供 policy=login&email=LOGIN_NAME 查询参数。

  1. 查询用户个人资料以获取 name 字段的值:

    curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=user_example_com" -H "Metadata-Flavor: Google"
  2. 在输出中,记下 name

  3. 使用 name 的值运行以下 login 命令:

    curl "http://metadata.google.internal/computeMetadata/v1/oslogin/authorize?policy=login&email=LOGIN_NAME" -H "Metadata-Flavor: Google"
    

例如,您可以查询在上一部分查看的用户 user_example_com 的登录权限:

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/authorize?policy=login&email=12345678912345" -H "Metadata-Flavor: Google"

命令输出表明用户有权登录虚拟机:

{"success":true}

检查您的虚拟机是否有服务账号

您可以查询元数据服务器以查找与您的虚拟机关联的服务账号。在虚拟机上,运行以下命令:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/" -H "Metadata-Flavor: Google"

输出内容类似如下:

12345-sa@developer.gserviceaccount.com/
default/

如果未找到服务账号,则输出为空。

后续步骤