题 尝试从本地Ubuntu SSH到Amazon EC2服务器时,为什么会出现“Permission denied(publickey)”?


我在Amazon EC2实例上有一个在云端运行的应用程序实例,我需要从本地Ubuntu连接它。它适用于本地ubuntu和笔记本电脑之一。当尝试在另一个本地Ubuntu上访问到EC2的SSH时,我收到消息“Permission denied(publickey)”。这对我来说太奇怪了。

我正在考虑Amazon EC2上的安全设置存在某些问题,这些问题对一个实例或证书的IP访问权限有限,可能需要重新生成。

有谁知道解决方案?


213
2017-07-13 07:38




“之前曾经工作过” 什么? - womble♦
我有一个Elastic Beanstalk EC2实例。截至2013年8月,解决方案是以ec2-user用户身份访问实例,该用户使Permission Denied(publicKey)错误消失。即:ssh -i ./mike-key-pairoregon.pem ec2-user@ec2-some-address.us-west-2.compute.amazonaws.com。当然,你必须按照所有其他的东西 stackoverflow.com/questions/4742478/... - mikemay
如果您指定了错误的用户名,则会出现此问题。 aws文档(docs.aws.amazon.com/AWSEC2/latest/UserGuide/...)目前以用户名ec2-user [ssh -i /path/my-key-pair.pem ec2-user@ec2-198-51-100-1.compute-1.amazonaws.com]为例,而我(旧的)ubuntu框的用户名为ubuntu,因此当我使用该示例时,我收到此错误,更改为正确的用户名解析。 - david.barkhuizen
@ david.barkhuizen,你的评论对我有帮助。我有类似的问题;事实证明它与用户名有关。谢谢。 - NaijaProgrammer


答案:


在这种情况下要做的第一件事是使用 -v 选项 ssh,这样您就可以看到尝试了哪种类型的身份验证以及结果是什么。这有助于启发这种情况吗?

在您的问题更新中,您提到“在另一个本地Ubuntu上”。您是否已将ssh私钥复制到另一台计算机上?


140
2017-07-13 07:44



我已经将ssh私钥复制到了另一台机器上,就像@Greg建议的那样。它现在有效。谢谢! - Vorleak Chy
仅供参考,您可以使用-i标志指向键的路径而不安装它们 - Jorge Vargas
就我而言,我使用的是bitnam。。并且没有意识到你需要以用户名为bitnami的身份登录,例如: ssh -i <keyfile> bitname@<ec2-address>。不幸的是 -v 选项并没有帮我找到这个,但检查它仍然非常有用! - Matt Connolly
好吧,在我的情况下,我使用了错误的用户名。使用“ubuntu”而不是“bitnami”。像这样:ssh -i key.pem bitnami @ hostaddress - Lucas Pottersky
一个好的领导也是远程节点本身,请看 /var/log/auth.log,有时您会看到以下消息: Authentication refused: bad ownership or modes for file /var/lib/jenkins/.ssh/authorized_keys 或者是其他东西 - Jonas Libbrecht


由于没有明确提到,sshd默认对权限非常严格 authorized_keys 文件。因此,如果 authorized_keys 是  对于除用户或以外的任何人 可以写成 除了用户以外的任何人,它都会拒绝进行身份验证(除非sshd配置了 StrictModes no

我的意思是“可以写入”是指如果任何父目录对于除用户之外的任何人都是可写的,则允许修改这些目录的用户可以开始修改权限,以便他们可以修改/替换authorized_keys。

这不会出现 ssh -v,它将显示在sshd发出的日志中(通常放入 /var/log/secure 要么 /var/log/auth.log,取决于发行版和 syslogd 组态)。

来自man sshd(8):

 ~/.ssh/authorized_keys
         Lists the public keys (RSA/DSA) that can be used for logging in
         as this user.  The format of this file is described above.  The
         content of the file is not highly sensitive, but the recommended
         permissions are read/write for the user, and not accessible by
         others.

         If this file, the ~/.ssh directory, or the user's home directory
         are writable by other users, then the file could be modified or
         replaced by unauthorized users.  In this case, sshd will not
         allow it to be used unless the StrictModes option has been set to
         “no”.

73
2018-01-05 14:38



那个“可以写成”有点让我感到高兴 - wmarbut
FWIW密钥文件的正确权限是600(参见 这里) - Matt Lyons
是的,我的.authorized_keys文件是可写的,所以它拒绝接受。 - Aditya M P
我正撞在墙上!我的用户文件夹具有错误的权限。谢谢! - XJones
同样适用于〜/ .ssh文件夹本身。您可能会收到以下错误消息: Authentication refused: bad ownership or modes for directory - Yevgeniy M.


我收到此错误,因为我忘了添加 -l 选项。我的本地用户名与远程系统上的用户名不同。

这不能回答你的问题,但我来到这里寻找我的问题的答案。


37
2018-04-01 21:51



ssh host -l user 是相同的 ssh user@host, 对? - Znarkus
@Znarkus是的,它是一样的。 - cregox
是的,这解决了我的问题导致“Permission denied(publickey)”错误。 - Brooks Moses
这对我来说是个问题。我期待用户“root”工作,但我使用的是Ubuntu EC2图像,默认用户为“ubuntu”。 - Cerin


我在基于Ubuntu AMI的新实例上得到了这条消息。我使用-i选项提供PEM但它仍然显示“Permission denied(publickey)”。

我的问题是我没有使用正确的用户。通过使用ubuntu @ ec2运行ssh ......它正常工作。


19
2017-11-17 16:29



是的......我正在执行命令 sudo这就是它无法正常工作的原因。 - thaddeusmt


比起容易阅读的东西 ssh -i (在我看来当然),是 tail -f /var/log/auth.log。这应该在您尝试连接的服务器上运行,同时尝试连接。它将以纯文本显示错误。

这有助于我解决我的问题:

不允许来自xx.yy.com的用户[用户名],因为AllowGroups中未列出任何用户组


16
2018-02-01 14:07



我想你的意思 -v - Tim Tisdall
这是服务器日志。对于RHEL / CentOS 7: tail -f /var/log/secure - Gianfranco P.


检查你的 的/ etc / SSH / sshd_config中 文件。在那里,找到说的线

PasswordAuthentication no

需要修改该行以表示“是”而不是“否”。此外,之后重新启动sshd服务器。

sudo /etc/init.d/ssh restart

11
2017-12-10 06:15



这会降低服务器的安全性。 - Znarkus
这就是我遇到的问题:我想为另一个用户设置一个帐户,仅使用密码进行身份验证。我还希望能够从我没有私钥的地方以自己的身份登录。 - Daniel
我们怎么去 /etc/ssh/sshd_config  - 如果我们甚至无法进入服务器? - kyo
要进入服务器本身,必须使用他们在创建实例时提供的PEM文件。之后的说明就是这样。 - Sudipta Chatterjee
这对我有用,虽然重新启动sshd需要以下命令: sudo service sshd reload - pacoverflow


也许与当前的海报无关,但可能会帮助其他人在寻找类似情况的答案时找到它。我建议不要让Amazon生成ssh密钥对,而是将您自己的标准默认公共ssh密钥上传到Amazon,并在运行EC2实例时指定。

这使您可以在ssh中删除“-i”类型语法,将rsync与标准选项一起使用,还可以在所有EC2区域中使用相同的ssh密钥。

我在这里写了一篇关于这个过程的文章:

将个人ssh密钥上传到Amazon EC2
http://alestic.com/2010/10/ec2-ssh-keys


6
2017-09-29 21:15



+1正是因为这个原因才查出这个问题。 - John Riselvato
我在关注你的文章时看到了这个错误。 regions = $(ec2-describe-regions | cut -f2)缺少必需选项'-K, - private-key KEY'(-h用途) - KashifAli
@KashifAli您需要设置EC2 API命令行工具凭据,这样您就不必总是在每个命令行上传递凭据。 - Eric Hammond


奇怪的是,我的问题结果是服务器已经重新启动并且它被发出了一个新的DNS名称。我使用旧的DNS名称。我知道这听起来很愚蠢,但我花了一段时间才弄明白这一点。


5
2017-08-08 21:00



谢谢!这正是我的问题。重启实例时,我没有意识到DNS名称已更改。 - Tim Swast
就我而言,当我分配弹性IP时,* .compute.amazonaws.com网址会发生变化。 - Geoffrey Booth