尝试从本地Ubuntu SSH到Amazon EC2服务器时,为什么会出现“权限被拒绝(公钥)”的提示?


218

我有一个在Amazon EC2实例上的云中运行的应用程序的实例,我需要从本地Ubuntu连接它。它可以在本地ubuntu之一和笔记本电脑上正常工作。尝试在另一个本地Ubuntu上访问SSH到EC2时,出现消息“权限被拒绝(公钥)”。我真奇怪

我正在考虑Amazon EC2上的安全性设置存在某种问题,该IP地址只能限制对一个实例或证书的IP访问,可能需要重新生成。

有人知道解决方案吗?


11
“以前曾经工作过” –在什么之前?
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 2013年

3
如果您指定了错误的用户名,则会出现此问题。aws docs(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,您的评论对我有所帮助。我有一个类似的问题。原来,这与用户名有关。谢谢。
NaijaProgrammer18年

Answers:


143

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

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


2
我已经按照@Greg的建议将ssh私钥复制到另一台计算机上。现在可以使用了。谢谢!
Vorleak Chy

3
仅供参考,您可以使用-i标志指向键的路径而不安装它们
Jorge Vargas,2010年

20
就我而言,我使用的是bitnami .ami,却没有意识到您需要以名为bitnami的用户身份登录,例如:ssh -i <keyfile> bitname@<ec2-address>。不幸的是,该-v选项并没有帮助我找到此选项,但是检查它仍然非常有用!
马特·康诺利

7
好吧,就我而言,我使用了错误的用户名。使用“ ubuntu”而不是“ bitnami”。像这样:ssh -i key.pem bitnami @ hostaddress
Lucas Pottersky 2012年

3
一个不错的线索也是远程节点本身,调查一下/var/log/auth.log,有时您会看到以下消息:Authentication refused: bad ownership or modes for file /var/lib/jenkins/.ssh/authorized_keys或其他消息
Jonas Libbrecht

76

尚未明确提及,默认情况下,sshd对authorized_keys文件的权限非常严格。所以,如果authorized_keys可写的用户以外的任何人或可以进行写由用户以外的任何人,它会拒绝进行身份验证(除非sshd的配置了StrictModes no

我的意思是“可以写”是指,如果任何父目录对用户以外的其他人都是可写的,那么被允许修改那些目录的用户可以以修改/替换authorized_keys的方式开始修改权限。

此外,如果该/home/username/.ssh目录不属于该用户所有,因此该用户无权读取密钥,则可能会遇到问题:

drwxr-xr-x 7 jane jane 4096 Jan 22 02:10 /home/jane
drwx------ 2 root root 4096 Jan 22 03:28 /home/jane/.ssh

请注意,简并不拥有该.ssh文件。通过修复此问题

chown -R jane:jane /home/jane/.ssh

这些类型的文件系统权限问题不会显示在ssh -v,并且在您将日志级别设置为DEBUG之前,它们甚至都不会显示在sshd日志(!)中。

  • 编辑/etc/ssh/sshd_config。您想要一条LogLevel DEBUG在某处读取的行。使用发行版提供的机制重新加载SSH服务器。(service sshd reload在RHEL / CentOS / Scientific上。)平稳的重载不会删除现有的会话。
  • 再次尝试进行身份验证。
  • 找出您的身份验证工具日志的去向并阅读它们。(IIRC,/var/log/auth.log基于Debian的发行版;/var/log/secureRHEL / CentOS / Scientific。)

更容易找出包含文件系统权限错误的调试输出出了什么问题。切记将更改还原到/etc/ssh/sshd_config完成后!


5
令我感到“可写”的一点是
wmarbut 2012年

7
FWIW密钥文件的正确权限是600(请参阅此处
Matt Lyons 2012年

1
是的,我的.authorized_keys文件可按组写入,因此拒绝接受。
Aditya MP

2
我的头撞在墙上!我的用户文件夹权限错误。谢谢!
XJones 2014年

4
〜/ .ssh文件夹本身也是如此。您可能会收到以下错误消息:Authentication refused: bad ownership or modes for directory
Yevgeniy M.

37

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

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


25
ssh host -l user和一样ssh user@host吗?
Znarkus

3
@Znarkus是的,是一样的。
cregox 2011年

是的,这也解决了导致“权限被拒绝(公钥)”错误的问题。
Brooks Moses

1
这是我的问题。我期望用户“ root”可以工作,但是我使用的是具有默认用户“ ubuntu”的Ubuntu EC2映像。
Cerin 2013年

20

我在基于Ubuntu AMI的新实例上收到此消息。我正在使用-i选项来提供PEM,但它仍显示“权限被拒绝(公钥)”。

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


是的...我正在使用运行命令sudo,这就是为什么它不起作用的原因。
thaddeusmt 2011年

16

ssh -v(我认为当然)更容易阅读的内容是tail -f /var/log/auth.log。它应在尝试连接的服务器上运行。它将以纯文本显示错误。

这帮助我解决了我的问题:

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


这是服务器日志。RHEL / CentOS 7:tail -f /var/log/secure
Gianfranco P.

10

检查您的/ etc / ssh / sshd_config文件。在那里找到那行,上面写着

PasswordAuthentication no

该行需要修改为是而不是否。另外,之后重新启动sshd服务器。

sudo /etc/init.d/ssh restart

18
这样会使服务器的安全性降低。
Znarkus

这就是我遇到的问题:我想为另一个用户设置一个帐户,仅使用密码进行身份验证。我还希望能够在没有私钥的地方以自己的身份登录。
丹尼尔(Daniel)

1
/etc/ssh/sshd_config如果我们什至无法进入服务器,该如何去?
京东2015年

要进入服务器本身,必须使用它们在创建实例时给出的PEM文件。该说明之后。
Sudipta Chatterjee 2015年

这对我sudo service sshd reload
有用

6

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

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

我在这里写了一篇有关此过程的文章:

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


+1正正是出于这个原因查找了这个问题。
约翰·里塞尔瓦托

我在关注您的文章时看到此错误。region = $(ec2-describe-regions | cut -f2)必填选项'-K,--private-key KEY'丢失(-h使用)
KashifAli 2013年

@KashifAli您将需要设置EC2 API命令行工具凭据,因此您不必总是在每个命令行上都传递凭据。
埃里克·哈蒙德

5

奇怪的是,我的问题原来是服务器已重新启动,并被赋予了新的DNS名称。我使用的是旧的DNS名称。我知道这听起来很愚蠢,但花了我一段时间才弄清楚。


谢谢!这正是我的问题。重新启动实例时,我没有意识到DNS名称已更改。
Tim Swast 2012年

就我而言,*。compute.amazonaws.com URL在分配弹性IP时发生了更改。
杰弗里·布斯

2

如果要连接到运行Dropbear的CyanogenMod电话,则应运行以下行,以确保所有权限都正确:

chmod 600 /data/dropbear/.ssh/authorized_keys

要么

chmod 700 /data/dropbear/.ssh/authorized_keys # In case of MacOS X 10.6-10.8

chmod 755 /data/dropbear/ /data/dropbear/.ssh

这对我来说已经解决了,否则什么也无法连接。


“当尝试在另一个本地Ubuntu上将SSH访问EC2时。”
2015年

1
如果我没有authorized_keys怎么办?
IgorGanapolsky '16

2

如果您使用的是CentOS 5,则可能要设置StrictModes no/etc/ssh/sshd_config。我正在使用NIS / NFS共享/ home目录,并且我正确设置了所有权限,但始终会提示我输入密码。我设置好之后StrictModes no,问题就消失了!


1

Greg的答案说明了如何更好地解决它,但是实际的问题是,您在事务的一侧(客户端)设置了一个ssh密钥,该密钥正在尝试公用密钥身份验证,而不是基于密码的身份验证。由于您在EC2实例上没有相应的公钥,因此将无法使用。


2
您如何解决该问题?
Julien Grenier

1

我遇到了同样的问题,在尝试了许多无法解决的解决方案后,我在路由器的防火墙上打开了SSH端口(路由器的防火墙控制面板很乱,因此很难告诉发生了什么事)。无论如何,它解决了:)

超级血腥的烦人,您得到的错误是“权限被拒绝”,这意味着建立了某种连接,grr。


1

即使我按照以下所有步骤进行,我也遇到了同样的问题

$ ec2-authorize default -p 22

但是,我是在us-west-1地区开始工作的。因此,以上命令还应指定该内容。

$ ec2-authorize default -p 22 --region us-west-1

执行此命令后,我就可以进入实例了。我花了一段时间才意识到这个问题,希望这篇文章对其他人有所帮助。


0

这是一种罕见的情况,但是如果启用了selinux,并且正在使用带有nfs的authorized_keys目录(例如共享主目录),则需要禁用selinux(出于安全原因不建议使用,但可以暂时禁用它)。看看是否是引起问题的原因)或允许selinux使用nfs主目录。我不清楚细节,但这对我有用 setsebool -P use_nfs_home_dirs 1


0

在无意中将组写权限添加到用户主目录后,我遇到了同样的问题。

我是在tail -f /var/log/secure计算机上运行并看到错误的原因,这是原因Authentication refused: bad ownership or modes for directory /home/<username>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.