未添加来自元数据的 Google Cloud Compute 实例 SSH 密钥

Posted

技术标签:

【中文标题】未添加来自元数据的 Google Cloud Compute 实例 SSH 密钥【英文标题】:Google Cloud Compute instance SSH key from metadata not added 【发布时间】:2018-08-16 20:27:27 【问题描述】:

我已经成功地将 SSH 密钥添加到新生成的实例有一段时间了,但突然之间它就不起作用了。它们的密钥不会添加到目标帐户(如果帐户不存在,则不会创建该帐户)。它仍然适用于我的一个项目,但它不适用于包含第一个代码的改编版本的另一个项目。两个代码执行的步骤如下:

    从快照创建磁盘。 生成 RSA 密钥对。 将元数据中的ssh-keys 属性设置为上一步生成的公钥,格式为Google Cloud 可理解的格式(<username>:ssh-rsa <key> <username>)。 使用第一步创建的磁盘和第三步创建的元数据创建实例。

当我在 Google Cloud Console 上查看实例数据时,它在 SSH 密钥部分为正确的用户分配了正确的密钥。但是,当我通过 SSH 连接到实例时,尚未将密钥添加到该用户的 authorized_keys 文件中。以防万一,我尝试在没有该用户的情况下重新创建快照,以便可以动态创建用户(这应该可以),但在这种情况下不会创建用户。

最后,Google Cloud 的行为就像 SSH 密钥不在元数据中一样,但它确实存在。我遇到了this answer,但似乎无法理解这部分:

因此,GCE 平台仅在您未指定自己的密钥(在创建实例时或之后)时才负责在实例中放置/删除您的 ssh 密钥(...)。如果这样做,GCE 平台会将 ssh 密钥管理视为手动管理,并且不会与元数据存储保持同步。

我没有看到我正在做的任何事情可能会触发它进入手动模式,但显然某处存在问题。


我刚刚尝试从较旧的快照运行相同的进程,它运行完美。我会进一步调查,看看是什么原因造成的。

【问题讨论】:

【参考方案1】:

您需要拥有最新版本的Guest Tools。以下是在 Ubuntu 上安装最新版本的示例:

$ sudo apt-add-repository universe

$ sudo apt install -y python-google-compute-engine python3-google-compute-engine google-compute-engine-oslogin gce-compute-image-packages

您可以阅读here更多详细信息和其他操作系统。

【讨论】:

它适用于旧快照,但不适用于新快照;我看不出旧快照如何在没有新版本的情况下拥有来宾工具(或正确版本)。 请我进一步了解这个问题。我为 Google Cloud 支持工作。您能否打开一个私人问题,并添加您的项目编号:issuetracker.google.com/issues/new?component=187164 一旦我们找到解决方案,我将发布它,以便任何人都可以得到答案。 刚刚打开了一个 ID 为 74599290 的问题。 您好@PLPeeters,根据我们对问题跟踪器的讨论,我们目前无法重现此行为。如果以后再次发生这种情况,您可以重新打开一个带有详细重现步骤的新问题跟踪器,我们很乐意为您提供帮助。 我希望我现在可以提供一个最小的工作示例,但是最近几周我的时间有点短。如果我有时间最终开始这样做,我一定会再次联系!【参考方案2】:

我尝试在 Debian-10 实例中重现此问题,但无法重现。我从快照创建了一个新实例,并在实例级元数据中的SSH Keys 部分中添加了一个公钥对,然后我尝试使用 SSH 密钥进行 SSH,我能够继续。


这似乎是您无法添加 SSH 密钥的特定操作系统的问题。在这种情况下,我建议收集尽可能多的信息来调试根本原因。

我建议验证来宾环境是否正在运行1,和/或手动安装它2,因为它使与Metadata server 的通信成为可能。

还要确认 VM 能够访问元数据服务器 169.254.169.254 metadata.google.internal

username@debian-10-000:~$ ping metadata.google.internal
PING metadata.google.internal (169.254.169.254) 56(84) bytes of data.
64 bytes from metadata.google.internal (169.254.169.254): icmp_seq=1     ttl=255 time=0.128 ms

Related.

【讨论】:

以上是关于未添加来自元数据的 Google Cloud Compute 实例 SSH 密钥的主要内容,如果未能解决你的问题,请参考以下文章

将自定义元数据设置为 Google Cloud Storage 中的对象

Google Cloud Functions 节点 JS - 来自客户端获取的 POST 请求,请求正文未通过 [重复]

google-cloud-profiler 元数据服务器警告

如何从 Google Cloud Storage 中获取特定对象元数据信息?

来自 DataProc 集群的 Google Cloud Sdk

指定要使用 Google Cloud Storage 通知发布的元数据