6

我已经使用 Google Compute Engine 设置了我的新服务器。sshKeys我在 Google Cloud 控制台 ( )的元数据中添加了一个用户及其公钥。

我试图替换元数据中的公钥,但现在旧公钥似乎是唯一能够通过 ssh 进入我的服务器的公钥(使用 PuTTY)。新的好像没有更新。

现在,即使我删除了整个元数据或在sshKeys字段中输入乱码,它仍然可以工作!

是否需要一段时间才能将元数据推送到服务器(我之前的尝试是即时的)?

4

2 回答 2

2

要了解 Google Compute Engine 如何管理 ssh 密钥,您必须了解 GCE 如何管理元数据(因为正如您所写,它们位于元数据存储中)。

更具体地说,项目元数据和实例元数据之间的区别至关重要。要引用文档(请参阅以前的链接):

元数据可以在项目和实例级别分配。项目级元数据传播到项目内的所有虚拟机实例,而实例级元数据仅影响该实例。您可以同时设置项目和实例级元数据,但如果您为项目和实例元数据设置相同的键,Compute Engine 将使用实例元数据。

虽然这看起来相当合乎逻辑和直截了当,但必须非常密切地注意所使用的术语:

项目级元数据传播到项目内的所有虚拟机实例 [...]

您可以同时设置两个 [...],但如果您为两个 [...] 设置相同的键,Compute Engine将使用实例元数据

如果你考虑这两个断言,它意味着两件事:

  1. 如果您仅在项目级别设置元数据,它将在您的实例中传播。
  2. 如果您在实例级别设置元数据,它将优先于项目级别的元数据,并且不会传播任何内容。

这样做的直接后果是,GCE 平台负责在实例中放置/删除您的 ssh 密钥(并在放置它们时创建相关用户,同时~user/.ssh/authorized_keys在删除它们时从文件中删除密钥 - 这样您就不会丢失~user)的任何数据当您未指定自己的密钥时(在实例创建时或之后)。如果这样做,GCE 平台会将 ssh 密钥管理视为手动管理,并且不会与元数据存储保持同步。

幸运的是,GCE 平台做得很好,因此,您无需重新创建实例来让 GCE 平台管理您的密钥:您只需删除与sshKeys.

同理,如果你用 key 添加一些实例级元数据sshKeys,它会禁用 ssh 密钥 GCE 平台管理;除非您删除该实例级别的元数据。

关于延迟问题:到目前为止,除了网络延迟(因此没有明显的平台执行延迟)之外,我没有任何延迟。我不认为平台不时出现延迟是不可能的,但它似乎不太可能是你问题的原因。


附加说明:

某些发行版(例如ubuntu)包含一个特定用户(在 ubuntu: 的情况下),项目级ssh 密钥中~ubuntu存在的每个用户都可以使用该用户登录;但是该用户是在实例创建时生成的,并且似乎永远不会被 GCE 平台再次更改。恕我直言,应该首选自动 ssh 密钥管理。authorized_keys


资料来源:个人使用 GCE、terraform 和 Google Developer Console 的经验

于 2015-04-08T13:52:56.937 回答
1

从 sshKeys 元数据中删除密钥不会导致从实例中删除该密钥。

听起来新密钥的格式可能有错误,这就是未添加新密钥的原因。sshKeys 元数据的每一行应该看起来像“用户名:ssh-rsa AAAAB3Nza.....sjr 评论”。不应该有多余的空间,空行。

一个常见的错误是,如果您从开发人员控制台中的 sshKeys 元数据中复制、添加密钥并将其粘贴回来,您必须非常小心新行,因为开发人员控制台会丢失 html 输出中的新行。

于 2014-05-26T20:48:19.657 回答