gcloud compute ssh返回Permission Denied (publickey)错误。

11
根据Google Cloud文档,如果我是具有“计算实例管理员”角色的项目成员,则应该能够使用gcloud工具连接到项目中的任何实例。
在Google Cloud控制台的项目IAM页面上,我已经明确地添加了我的用户名,并赋予了“计算实例管理员(v1)”角色,但我仍然无法连接到一些通过自动化创建的实例。
[username]:~/src/infrastructure$ gcloud compute ssh [instance id]
Unauthorized use is strictly prohibited. All access and activity
is subject to logging and monitoring.
Permission denied (publickey).
ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255].

我似乎只能连接由我创建的实例。

可能出了什么问题?

顺便提一下,根据这份文档,我应该能够手动将我的RSA公钥添加到实例中,然后使用SSH进行连接。

我已将我的公钥从〜/ .ssh / google_compute_engine.pub添加到实例元数据中,但尝试使用SSH时没有成功。

[username]:~/src/infrastructure$ ssh -i ~/.ssh/google_compute_engine [public ip of instance]
Unauthorized use is strictly prohibited. All access and activity is subject to logging and monitoring.
Received disconnect from 35.197.127.143 port 22:2: Too many authentication failures for matts
Connection to 35.197.127.143 closed by remote host.
Connection to 35.197.127.143 closed.

按照谷歌的建议,我不想手动管理实例访问的SSH密钥。我希望gcloud compute ssh 能够正常工作,因此我对第二个故障不太关注(除非它们有关联)。


请查看此文档,以更新SSH密钥。此外,您的实例可能具有过时的VM guest环境。另外,请查看此问题报告,其中一些建议可能适用于您。错误255是非常通用的错误。 - N Singh
7个回答

9

我试图从 Docker 容器中连接到 gcloud 上的 VM 的 ssh。运行 Docker 容器时,默认用户命名为 root

除非指定,否则 gcloud compute ssh 命令使用与 ssh 相同的本地用户名。现在,密钥传播似乎不喜欢名称为 root 的名称。唯一的指示来自机器的串口输出:

[    5.621630] google_metadata_script_runner[638]: 2020/10/21 09:43:01 logging client: rpc error: code = PermissionDenied desc = The caller does not have permission
[    5.622286] google_guest_agent[635]: 2020/10/21 09:43:01 logging client: rpc error: code = PermissionDenied desc = The caller does not have permission
Oct 21 09:43:01 private-cluster-bastion-dced90d6 google_metadata_script_runner[638]: 2020/10/21 09:43:01 logging client: rpc error: code = PermissionDenied desc = The caller does not have permission
Oct 21 09:43:01 private-cluster-bastion-dced90d6 google_guest_agent[635]: 2020/10/21 09:43:01 logging client: rpc error: code = PermissionDenied desc = The caller does not have permission

我成功地通过在机器名称前添加USER@前缀来使其工作,如https://cloud.google.com/sdk/gcloud/reference/compute/ssh#USER中所述。

几乎任何用户名都可以使用。


3
哇,你真是个天才!在 Docker 容器中使用 gcloud compute ssh username@vmname 命令。 - piouson
谢谢!这是我缺少的最后一块。 - Jedrzej G

8

我遇到了这个问题。我无法使用gcloud命令登录,也无法使用-i标志手动ssh,甚至无法使用Web浏览器ssh客户端。

我还尝试手动在ssh密钥编辑器中添加新密钥,看起来一切都很顺利,但仍然无法让我进入。

增加启动磁盘的大小并重新启动实例解决了这个问题。


2
更改大小后,我不得不暂时从我的VM(“machine-1”)中分离磁盘,创建一个具有与“machine-1”相同操作系统的新VM(“machine-2”),并将“machine-1”的磁盘附加为附加磁盘。 然后,我根据以下说明使用“machine-2”调整分区以使用新的磁盘空间:https://cloud.google.com/compute/docs/disks/add-persistent-disk?&_ga=2.52427105.-97729003.1597981943#resize_partitions - hamx0r
哈哈哈,我喜欢它...这对我有用。谷歌搜索+堆栈溢出赢了! - Chad Brockman
@hamx0r 非常感谢你的帮助。 - undefined

4

如果您删除了 .ssh/authorized_keys 文件,则可能会出现此问题。如果您可以通过另一个用户访问该计算机,通常可以通过以下命令运行该用户来修复出问题的用户的连接:

gcloud compute ssh <machine-name> --project <project> --zone <zone>

通过将来自您要连接的计算机的 .ssh/google_compute_engine.pub 密钥添加到用户的 .ssh/authorized_keys 文件中创建该用户的文件。

sudo -i

cd /home/<misconfigured-user>

# Optional, verify the keys are not already set.
cat .ssh/authorized_keys

touch .ssh/authorized_keys

使用您喜欢的编辑器编辑该文件,并粘贴本地机器值。

然后,只需为文件设置适当的权限,可能不是必需的,但这些是默认权限。

chown <user> ~/.ssh/authorized_keys
chgrp <user> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

2

我在升级到Ubuntu 22.04后遇到了这个问题。根据这里所述:

由于存在各种安全漏洞,操作系统和SSH客户端正在快速弃用RSA SHA-1哈希算法,其中许多技术现在直接拒绝使用此算法。

似乎Ubuntu 22.04中的ssh客户端也出现了这个问题。RSA公私钥对不再被认为是安全的。

因此,如上面链接中所提到的,我使用以下命令创建了一个不同的密钥ed25519来解决这个问题:

ssh-keygen -t ed25519 -C "myname"

这将在路径~/.ssh/id_ed25519中生成一个新的密钥。如果您想要指定不同的路径,请在上述命令中使用-i参数。

生成新密钥后,可以在ssh命令中使用相同的密钥,使用ssh-key-file参数:

gcloud compute ssh  "my-instance" --ssh-key-file=~/.ssh/id_ed25519

顺便说一句,我在升级到22.04后仍然能够ssh进入某些实例,但对于某些实例无法工作。经过上述步骤,现在所有实例都可以正常工作了。


2

如果你的虚拟机启用了OS登录,就不能通过SSH连接。使用以下命令禁用OS登录:

gcloud compute project-info add-metadata \
--metadata enable-oslogin=FALSE

这解决了我的问题。

1
工作得就像魔术一样。感谢您的帮助,拯救了我! - Nir

1

在我们的情况下,报告的问题是具有误导性的。

$ gcloud compute ssh "[user]@[instance]"
Permission denied (publickey).

通过详细打印,实际问题变得更加清晰:

$ gcloud compute ssh "[user]@[instance]" -v
...
send_pubkey_test: no mutual signature algorithm
...
Permission denied (publickey).

我们可以解决这个问题的方法是接受RSA作为一种有效的算法(请注意,这是一个旧的debian操作系统,我们需要连接):

$ gcloud compute ssh "[user]@[instance]" --ssh-flag="-o PubkeyAcceptedKeyTypes=+ssh-rsa"

1
-v 详细模式标志已不再起作用。现在必须使用 --verbosity=debug - Agile Bean
1
不幸的是,RSA 标志也不再起作用了... - Agile Bean
我遇到了同样的问题。我试图登录一个非常过时的服务器来进行更新,这解决了我的问题。 - Mike Cantrell

0

请参考此过程文档更新SSH密钥。另外,您的实例可能存在过时的VM 客户环境。此外,请查看问题报告,其中一些建议可能适用于您。错误255是非常通用的错误。


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