我已经使用 Google Compute Engine 设置了我的新服务器。sshKeys
我在 Google Cloud 控制台 ( )的元数据中添加了一个用户及其公钥。
我试图替换元数据中的公钥,但现在旧公钥似乎是唯一能够通过 ssh 进入我的服务器的公钥(使用 PuTTY)。新的好像没有更新。
现在,即使我删除了整个元数据或在sshKeys
字段中输入乱码,它仍然可以工作!
是否需要一段时间才能将元数据推送到服务器(我之前的尝试是即时的)?
我已经使用 Google Compute Engine 设置了我的新服务器。sshKeys
我在 Google Cloud 控制台 ( )的元数据中添加了一个用户及其公钥。
我试图替换元数据中的公钥,但现在旧公钥似乎是唯一能够通过 ssh 进入我的服务器的公钥(使用 PuTTY)。新的好像没有更新。
现在,即使我删除了整个元数据或在sshKeys
字段中输入乱码,它仍然可以工作!
是否需要一段时间才能将元数据推送到服务器(我之前的尝试是即时的)?
要了解 Google Compute Engine 如何管理 ssh 密钥,您必须了解 GCE 如何管理元数据(因为正如您所写,它们位于元数据存储中)。
更具体地说,项目元数据和实例元数据之间的区别至关重要。要引用文档(请参阅以前的链接):
元数据可以在项目和实例级别分配。项目级元数据传播到项目内的所有虚拟机实例,而实例级元数据仅影响该实例。您可以同时设置项目和实例级元数据,但如果您为项目和实例元数据设置相同的键,Compute Engine 将使用实例元数据。
虽然这看起来相当合乎逻辑和直截了当,但必须非常密切地注意所使用的术语:
项目级元数据传播到项目内的所有虚拟机实例 [...]
和
您可以同时设置两个 [...],但如果您为两个 [...] 设置相同的键,Compute Engine将使用实例元数据。
如果你考虑这两个断言,它意味着两件事:
这样做的直接后果是,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 的经验
从 sshKeys 元数据中删除密钥不会导致从实例中删除该密钥。
听起来新密钥的格式可能有错误,这就是未添加新密钥的原因。sshKeys 元数据的每一行应该看起来像“用户名:ssh-rsa AAAAB3Nza.....sjr 评论”。不应该有多余的空间,空行。
一个常见的错误是,如果您从开发人员控制台中的 sshKeys 元数据中复制、添加密钥并将其粘贴回来,您必须非常小心新行,因为开发人员控制台会丢失 html 输出中的新行。