解决 SSH Keys 未正确传播的问题

62次阅读
没有评论

问题描述

在使用 Terraform 部署 Google Compute Engine (GCE) 实例时,通过在实例元数据中添加公钥,期望能够自动将这些公钥添加到 ~/.ssh/authorized_keys 文件中,以便实现 SSH 登录的自动化。然而,用户遇到了以下问题:
1. 并非所有在实例元数据中声明的公钥都被添加到 authorized_keys 文件中。
2. 不同用户登录时,authorized_keys 文件中的内容不同。
3. 存在重复的公钥。

用户怀疑问题可能涉及实例元数据解析、GCE 镜像、和 CloudInit 等因素。以下将介绍如何解决这些问题。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

问题1:部分公钥未被添加到 authorized_keys 文件中

问题的根本原因是实例元数据中声明的 SSH 公钥的格式不正确,导致部分公钥未被正确解析并添加到 authorized_keys 文件中。要解决这个问题,需要确保元数据中声明的公钥格式正确,并且能够被 SSH 服务器正确识别。

解决步骤:

  1. 确保元数据中的 SSH 公钥声明正确,每个公钥都以用户名开头,后跟冒号和公钥内容,例如:
    user1:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC...
    user2:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC...
  2. 验证每个公钥是否能够单独使用 ssh-keygen 命令添加到 ~/.ssh/authorized_keys 文件中。确保每个公钥能够成功添加且有效。

问题2:不同用户登录时,authorized_keys 文件内容不同

问题的原因是在元数据中声明的公钥都使用了相同的键名 "ssh-keys",导致不同用户的公钥被视为相同键名的多个值,从而只保留了最后一个值。

解决步骤:

  1. 在元数据中为每个用户单独声明公钥,使用不同的键名,例如:
    user1-ssh-keys: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC...
    user2-ssh-keys: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC...
  2. 确保每个用户的键名在元数据中唯一,这样每个用户的公钥都能被正确解析并添加到 authorized_keys 文件中。

问题3:存在重复的公钥

问题的原因是在元数据中为同一用户声明了多个相同的公钥,导致在 authorized_keys 文件中存在重复的公钥条目。

解决步骤:

  1. 在元数据中为每个用户只声明一个唯一的公钥,避免出现重复的公钥声明。

其他信息

用户提供了关于 GCE 镜像和使用的 CloudInit 的信息。根据用户提供的信息,GCE 实例使用了 ubuntu-minimal-2004-focal-v20230427 镜像,且 Ubuntu 官方的云镜像自 18.04 版本开始使用 CloudInit 进行启动初始化。

参考资料:

  1. Ubuntu Cloud Images 使用 CloudInit 进行启动初始化

总结

通过确保元数据中声明的 SSH 公钥格式正确、每个用户使用唯一的键名、避免声明重复的公钥,用户可以解决 SSH Keys 未正确传播的问题。此外,要注意 GCE 镜像使用的初始化工具,确保能够正确处理元数据并在启动时将公钥添加到 authorized_keys 文件中。

正文完