谷歌云SSH密钥

6
我已经使用Google Compute Engine设置了我的新服务器。我在Google Cloud控制台的元数据中添加了一个用户和他们的公钥 (sshKeys)。
我尝试替换元数据中的公钥,但现在旧的公钥似乎是唯一能够通过PuTTY ssh连接到我的服务器的公钥。新的公钥似乎没有更新。
现在,即使我删除整个元数据或在sshKeys字段中输入无意义的文本,它仍然有效!
可能需要一些时间将元数据推送到服务器(之前的尝试是瞬间完成的)?

设置项目级元数据的sshKeys元数据值已经被弃用;请改用ssh-keys元数据值。更多信息请参见此处 - Mike
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相关的实例级别元数据即可。
同样地,如果您使用关键字sshKeys添加一些实例级别的元数据,它将禁用GCE平台管理的SSH密钥;除非您删除该实例级别的元数据。

关于延迟问题:到目前为止,除了网络延迟之外,我没有遇到任何延迟(因此没有注意到平台执行延迟)。我不认为平台偶尔有延迟是不可能的,但这似乎不太可能是您问题的原因。


额外说明:
一些发行版(如ubuntu)包括一个特定的用户(在ubuntu的情况下为:~ ubuntu),可以使用该用户登录到项目级别的ssh密钥中存在的每个用户。但是,在实例创建时生成了该用户的authorized_keys,并且似乎从未被GCE平台再次更改。在我看来,应优先选择自动ssh密钥管理。
来源:个人使用GCE、terraform和Google开发者控制台的经验。

设置项目级元数据的sshKeys元数据值已经被弃用;请改用ssh-keys元数据值。更多信息请参见此处 - Mike

1

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

这似乎是新密钥格式有误,导致未能添加新密钥。每行sshKeys元数据应该像这样:"用户名:ssh-rsa AAAAB3Nza.....sjr 评论"。不应该有额外的空格、空行。

常见错误之一是从开发者控制台的sshKeys元数据复制、添加密钥,然后粘贴回去,必须非常小心地处理换行符,因为开发者控制台在HTML输出中丢失换行符。


似乎已经添加了密钥,但只是添加到了一个单独用户的authorized_keys文件中,而没有创建新用户并将其添加为其密钥。 - toffee.beanns
为项目级元数据设置sshKeys元数据值已被弃用;请改用ssh-keys元数据值。请在此处了解更多信息:https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys#project-wide。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接