~/.ssh/authorized_keys与谷歌云项目/实例级元数据有何关联?
GCP Compute Engine SSH 登录异常原因说明
核心原因
你遇到的问题是由 Google Compute Engine 实例默认运行的 Guest Agent 服务的同步规则和gcloud compute ssh的执行逻辑共同导致的:
- Guest Agent 负责同步项目/实例元数据到本地系统配置,SSH 密钥的同步默认是单向全量覆盖逻辑:只会用元数据中存储的公钥列表覆盖本地
~/.ssh/authorized_keys文件,不会把本地文件的修改反向同步到元数据。 - 为了避免覆盖用户的自定义配置,Guest Agent 检测到
authorized_keys被手动修改后,会暂时停止该文件的自动同步,直到元数据中的 SSH 密钥列表发生更新,才会重新用元数据内容覆盖本地文件。 gcloud compute ssh执行时会先校验本地的google_compute_engine.pub是否已经存在于项目/实例元数据中:如果已存在则不会重复推送,直接用对应的私钥发起SSH登录请求。
场景复现逻辑
- 初始状态下元数据存储了你的公钥,Guest Agent 正常同步到
authorized_keys,你可以正常登录 - 你手动删除了
authorized_keys中的对应公钥条目,Guest Agent 检测到文件被修改,停止同步 - 退出SSH会话后重新登录时,本地
authorized_keys已经没有对应公钥,因此登录失败;此时gcloud compute ssh检测到元数据中已有你的公钥,不会重新推送,也无法登录 - 你在控制台删除元数据中的对应条目后,
gcloud compute ssh检测到元数据中没有你的公钥,会重新把google_compute_engine.pub上传到元数据;Guest Agent 检测到元数据SSH密钥更新,会用最新的元数据内容覆盖你手动修改过的authorized_keys,登录恢复正常。
实例级元数据的适配说明
上述所有逻辑完全适用于实例级元数据:
- Guest Agent 同步SSH密钥的优先级为:如果实例级元数据配置了
block-project-ssh-keys = true,则仅同步实例级存储的SSH密钥;否则会合并项目级、实例级的所有SSH密钥同步到本地。 - 手动修改本地
authorized_keys触发的同步锁定规则、gcloud compute ssh的公钥校验推送规则,对实例级元数据和项目级元数据完全一致。
注意事项
如果需要自定义authorized_keys的内容,不要直接修改本地文件,可通过以下两种方式操作:
- 在控制台修改对应项目/实例的元数据SSH密钥列表,配置会自动同步到所有关联实例
- 修改Guest Agent的配置文件,关闭SSH密钥自动同步功能,之后可自由编辑本地
authorized_keys文件
内容的提问来源于stack exchange,提问作者Han Qi
相关产品推荐
相关产品推荐

