SSH 密钥无法从实例元数据正确传播到 authorized_keys:密钥丢失、用户差异和密钥重复

SSH 密钥无法从实例元数据正确传播到 authorized_keys:密钥丢失、用户差异和密钥重复

我想通过实例元数据添加八个公钥,以避免手动添加它们(即:ssh 到虚拟机,将密钥粘贴到 .ssh/authorized_keys 等)。
我使用以下元数据属性在 Terraform 中添加了密钥(两个用户的四个不同密钥)google_compute_instance

resource "google_compute_instance" "host" {
  count         = var.number_of_hosts
  
  // vm details...

  metadata = {
    "ssh-keys" = <<EOF
    user1:${file("${path.root}/key1.pub")}
    user1:${file("${path.root}/key2.pub")}
    user1:${file("${path.root}/key3.pub")}
    user1:${file("${path.root}/key4.pub")}
    user2:${file("${path.root}/key1.pub")}
    user2:${file("${path.root}/key2.pub")}
    user2:${file("${path.root}/key3.pub")}
    user2:${file("${path.root}/key4.pub")}
    EOF
  }

我运行了terraform apply。我打开了 GCP 控制台并单击了其中一台已部署的机器。在“详细信息”选项卡中,我可以在 SSH 密钥选项卡中看到所有八个密钥。现在,当我从本地计算机 ssh 时,即ssh user2@EXTERNAL_IP(我故意从 user2 开始,而不是 user1 - 不是打字错误),然后cat ~/.ssh/authorized_keys我只能看到以下内容:

user1 : key1
user2 : key4

因此,我无法 ssh 到 VM2,因为用户 2 可以访问的密钥对的公共部分并不存在,~/.ssh/authorized_keys尽管它在实例元数据中进行了声明。

另一方面,当我执行user1@EXTERNAL_IP和时cat ~/.ssh/authorized_keys,我可以看到:

user1 : key1
user2 : key4
user1 : key1 (duplicate)

由于对应的私钥user1 : key1在那里,我可以成功 ssh 到 VM2。

令我困惑的是:

  1. 为什么没有将实例元数据中声明的所有键都添加到authorized_keys
  2. authorized_keys为什么根据用户的不同,内容会有差异?
  3. 重复项从何而来?

编辑-一些附加信息:

  1. 使用的图像 -ubuntu-minimal-2004-focal-v20230427
  2. ssh_config(仅未注释的行):
Include /etc/ssh/ssh_config.d/*.conf
Host *
SendEnv LANG LC_*
HashKnownHosts yes
GSSAPIAuthentication yes
  1. sshd_config(仅未注释的行):
Include /etc/ssh/sshd_config.d/*.conf
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem       sftp    /usr/lib/openssh/sftp-server


编辑2-相关片段/var/log/syslog

@约翰·汉利

你说的没错。我可以看到以下形式的一些消息:google_guest_agent[566]: ERROR non_windows_accounts.go:199 Invalid ssh key entry - unrecognized format:在 中syslog。但是,查看我的密钥的形式,我不能完全同意你的评论的一部分:“一些公钥附加了用户名,这不起作用”。我在 Terraform 中读取的密钥后来出现在 中,authorized_keys如下所示:

ssh-rsa AAArsT3 username1

或者

ecdsa-sha2-nistp256 AAAAE2= username1

不幸的是,仍然需要进行一些猜测。我现在可以看到四个键authorized_keys(3x username1,1x username2)。这比 2 个好,但我在问自己为什么其他四个仍然缺失。我进行了复制粘贴,只在最后更改了用户。对于通过实例元数据传递给 GCP 的键应该如何显示(用户名的存在/不存在、换行符等),是否有一致意见?

相关内容