it-swarm.cn

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

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

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

有人知道解决方案吗?

217
Vorleak Chy

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

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

143
Greg Hewgill

尚未明确提及,默认情况下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出现,并且甚至不会在sshd日志(!)中显示,除非您将日志级别设置为DEBUG。

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

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

76
Kjetil Joergensen

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

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

37
pkmk

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

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

19
user60587

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

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

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

16
Znarkus

检查您的/ etc/ssh/sshd_config文件。在那里找到那行说

PasswordAuthentication no

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

Sudo /etc/init.d/ssh restart
10
Sudipta Chatterjee

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

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

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

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

6
Eric Hammond

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

5
Patrick Collins

如果要连接到运行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

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

2
Naftuli Kay

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

2
uichin

即使我遵循了所有步骤,包括

$ ec2-authorize default -p 22

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

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

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

1
Ajit Verma

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

1
Cian

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

超级令人讨厌的是,您收到的错误是“权限被拒绝”,这意味着建立了某种连接,grr。

1
chichilatte

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

我发现是通过运行tail -f /var/log/secure在机器上看到错误Authentication refused: bad ownership or modes for directory /home/<username>

0
Jacob Tomlinson

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

0
Reese