我想通过实例元数据添加八个公钥,以避免手动添加它们(即: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。
令我困惑的是:
- 为什么没有将实例元数据中声明的所有键都添加到
authorized_keys
? authorized_keys
为什么根据用户的不同,内容会有差异?- 重复项从何而来?
编辑-一些附加信息:
- 使用的图像 -
ubuntu-minimal-2004-focal-v20230427
ssh_config
(仅未注释的行):
Include /etc/ssh/ssh_config.d/*.conf
Host *
SendEnv LANG LC_*
HashKnownHosts yes
GSSAPIAuthentication yes
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 的键应该如何显示(用户名的存在/不存在、换行符等),是否有一致意见?