本文档介绍如何使用元数据服务器排查 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
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
运行
gcloud compute os-login describe-profile
命令以查看 OS Login 配置文件:gcloud compute os-login describe-profile
输出类似于以下内容:
name: '00000000000000' posixAccounts: ... sshPublicKeys: ...: fingerprint: ... key: | ssh-rsa AAAAB3NzaC1yc2... name: ... ...
查看输出以确定任何未使用的 SSH 密钥。
使用
gcloud compute os-login ssh-keys remove
命令从输出中移除任何未使用的密钥:gcloud compute os-login ssh-keys remove --key=KEY
将
KEY
替换为密钥的指纹或密钥字符串。查询用户个人资料以获取
name
字段的值:curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=user_example_com" -H "Metadata-Flavor: Google"
在输出中,记下
name
。使用
name
的值运行以下login
命令:curl "http://metadata.google.internal/computeMetadata/v1/oslogin/authorize?policy=login&email=LOGIN_NAME" -H "Metadata-Flavor: Google"
- 详细了解 OS Login。
- 了解到 Linux 虚拟机的 SSH 连接在 Compute Engine 上的工作原理。
- 如需查看分步说明,请参阅以下内容之一:
- 管理组织中的 OS Login
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。
Install the Google Cloud CLI, then initialize it by running the following command:
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.
如需解决这些错误,请执行以下操作:
为防止将来出现此问题,请为 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 用户的个人资料信息。 您可以传递 username
、uid
、pagesize
和pagetoken
等查询参数。oslogin/authorize/
检索 OS Login 用户的登录或管理级别权限设置。
要检查权限,您必须指定
policy
查询参数。 政策参数的值必须设置为login
(用于检查登录权限)或adminLogin
(用于检查 sudo 访问权限)。检查是否已配置 OS Login
使用 Google Cloud 控制台或 Google Cloud CLI 查询元数据以确定是否已启用 OS Login。在项目或实例元数据中将
enable-oslogin
元数据键设置为TRUE
时,系统会启用 OS Login。如果同时设置了实例元数据和项目元数据,则实例元数据中设置的值优先。查看 OS Login 用户
要查看多个用户的个人资料信息,您需要指定
pagesize
和pagetoken
参数。将pagesize
和pagetoken
替换为所需的数值。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 username
或getent passwd uid
等 Unix 命令来检索个人资料信息。要检索用户的 SSH 密钥,您还可以运行
/usr/bin/google_authorized_keys USERNAME
。 如果未返回密钥,则说明用户可能没有登录虚拟机所需的权限。检查登录权限
要查看登录权限和管理级别权限,您必须提供
policy=login&email=LOGIN_NAME
查询参数。例如,您可以查询在上一部分查看的用户
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/
如果未找到服务账号,则输出为空。
后续步骤
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2024-10-04。
-