即使将公钥添加到authorized_keys中也无法SSH


16

我有一个Digital Ocean小滴,我正在尝试让自己的ssh访问。我不确定以前对它做了什么。我尝试通过Digital Ocean UI添加我的公钥。那没有用,我一直都在permission denied (publickey)

我通过Digital ocean控制台访问了服务器,并手动将公钥添加到/root/.ssh/authorized_keys。然后,我尝试使用ssh ssh root@x.x.x.x。那没有用(权限被拒绝)。

所以我尝试添加一个新用户,创建/home/me/.ssh目录的权限700.ssh目录本身,并600authorized_keys文件中。然后我尝试了ssh me@x.x.x.x。那也不起作用。

重新启动ssh守护程序也不会更改任何内容。

我想念什么?

编辑:

这是详细的ssh输出。

https://gist.github.com/jaesung2061/a37cfd68308414cede8abf7f0137daa9

编辑2:

LogLevel DEBUG3 输出:

在此处输入图片说明


在服务器日志中发布来自连接的详细日志,sshd_config的内容以及与ssh相关的可能错误。
加库耶

@Jakuje我已经添加了输出...我之前没有注意到您的评论。
杰夫(Jeff)

密钥被拒绝。检查服务器日志中是否可能存在问题(可能是LogLevel DEBUG3in中sshd_config)。我怀疑这些是权限问题,但是可能有几个原因。
雅库耶

它说[date omitted] www sssh[15029]: Connection closed by x.x.x.x port 55519 [preauth]
Jeff

authorized_keys文件的权限是什么?ls -ld ~ ~/.ssh ~/.ssh/authorized_keys?对于详细的日志服务器修改文件上面提到的,重启ssh服务,再次连接并张贴日志(应该是也auth.log
Jakuje

Answers:


20

客户端配置

设定 ~/.ssh/config

设置主机条目ssh非常简单,并且可以节省很多麻烦。这是一个例子:

Host digitaloceanbox
Hostname 111.111.111.111
User root
PubKeyAuthentication yes
IdentityFile /home/user/.ssh/digitalocean-rsa
ForwardX11 yes


Host github github.com
Hostname github.com
User git
PubKeyAuthentication yes
IdentityFile /home/user/.ssh/github-rsa
ForwardX11 no

在此示例中,我们设置digitaloceanboxgithubgithub.com以便我们可以执行以下命令:

  1. ssh github
  2. ssh digitaloceanbox

如果我们要使用与配置文件中指定的用户不同的用户身份登录,则只需将其放在开头user@

  • ssh user@digitaloceanbox

产生金ssh

ssh-keygen -t rsa -b 4096 -C user@homemachine
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):  /home/user/.ssh/digitalocean-rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/digitalocean-rsa
Your public key has been saved in /home/user/.ssh/digitalocean-rsa.pub.
The key fingerprint is:
SHA256:p9PYE/tveF2n//bLbp3ogYDtMtYEC5ziQiPxeob6fbo user@homemachine

请注意,当由提示时,我已经指定了要生成的私钥的完整路径ssh-keygen。我还定义了注释(-C),它使我可以轻松识别远程计算机上的键。

这将创建两个文件:

  1. .ssh/digitalocean-rsa
    • 私人密钥。 永远不要分享这个
  2. .ssh/digitalocean-rsa.pub
    • 公钥。这是您存储在服务器上以进行身份​​验证的内容。

当您提供ssh密钥时,请确保它是.pub版本!!当您添加到时~/.ssh/config,请确保添加与您添加到系统的公钥匹配的正确私钥。


服务器配置

大多数安装将启用“公共密钥身份验证”。如果您开始做所有的事情,那么您可能会遇到一些问题。在OP遇到问题的地方,我建议OP删除/root/.ssh/目录以重新开始。

不建议您用于ssh访问远程系统上的root用户。建议您ssh成为另一个用户,然后使用您的密码(sudo su -)升级为root用户。

使用添加密钥到主机 ssh-copy-id

无论您决定创建另一个用户并ssh以该用户还是root用户的身份使用,以下是建议ssh在服务器上放置密钥的方法:

  1. ssh-copy-id -i /home/user/.ssh/digitalocean-rsa.pub user@digitaloceanbox

这样可以sshd创建具有所需权限的所需目录和文件。这意味着您零散使用权限或需要记住详细信息的机会为零。只需使用该工具上传密钥即可。

禁用密码认证

话虽如此,一旦您拥有了自己的密钥并验证了您能够使用密钥进行连接,建议您在其中禁用密码身份验证sshd并重新启动服务:

  1. 编辑 /etc/ssh/sshd_config
  2. PasswordAuthentication no
  3. sudo systemctl restart sshd

新用户呢?

如果禁用密码身份验证,那么如何锁定新用户?一种方法是将模板文件添加到/etc/skel目录中。锁定一位用户的密钥后,请执行以下操作:

  1. sudo cp -r .ssh/ /etc/skel/
  2. ls /etc/skel/.ssh
  3. 编辑其中找到的所有文件,/etc/skel/.ssh/使它们为空白,除非您要为每个新创建的用户自动设置自己的密钥。

当您使用创建新用户时sudo useradd -m newuser,该用户将具有.ssh/authorized_keys,您可以对其进行编辑并具有适当的权限。

调试

您可以查看sshd日志文件以查看连接失败或被拒绝的原因:

  1. sudo tail -f /var/log/auth.log

在运行此命令时,请使用另一个终端尝试登录。提供的消息很多时候足以帮助您查明问题或在线找到解决方案。


1
调试步骤对我有用。根目录具有错误的权限(需要为700)
naisanza

12

Ssh对于使用ssh密钥的所有权,文件和目录权限非常挑剔。

〜/ .ssh /应该由所有者拥有,并具有700个权限。〜/ .ssh / authorized_keys应该由所有者拥有,并具有600个权限。

因此,对于root:

sudo chown root:root -R /root/.ssh/
sudo chmod 700 /root/.ssh/
sudo chmod 600 /root/.ssh/authorized_keys

对于用户我:

sudo chown me:me -R /home/me/
sudo chmod 700 /home/me/.ssh/
sudo chmod 600 /home/me/.ssh/authorized_keys

然后再试一次。

当然,您还应该在/ etc / ssh / sshd_config中检查是否允许root用户登录,或者仅使用ssh密钥登录。

如果你有 :

PasswordAuthentication no

然后可以设置:

PermitRootLogin yes

然后重新启动sshd:

/etc/init.d/sshd restart

然后再试一次。

请注意,使用ssh,即使为此使用ssh会话,也可以重新启动sshd守护程序.Openssh旨在处理该问题。

查看您上传的日志文件片段,似乎您正在使用MacOSX?您能在那里创建一个新的ssh密钥吗?

此外,我过去发现,当我在本地计算机上为用户使用多个ssh私钥时,这有时使无法使用ssh远程登录。为解决此问题,在本地计算机上的〜/ .ssh / config文件中进行输入非常有用。例如 :

Host my-vps
  HostName my-vps-ip-address-here
  IdentityFile ~/.ssh/id_rsa-my-private-key-location
  User my-username-here

之后,在本地计算机上的命令行上尝试:

ssh -v my-vps

使用ssh密钥以及某些其他登录名不使用ssh密钥时,除了具有ssh密钥的条目外,您还可以在〜/ ssh / config文件中定义不使用ssh密钥的ssh登录,例如:

Host pi
  Hostname 192.168.1.111
  Port 22
  User pi
  PasswordAuthentication yes
  PreferredAuthentications password

这对我来说很好。也可以在命令行上定义要使用的键:

ssh -v root@10.111.111.254 -i .ssh/id_rsa

这可能使调试更容易,并且在命令行上,它应始终在本地计算机上运行。


除了此解决方案之外,我还必须更改主文件夹的权限才能使SSH正常工作:sudo chmod 700 /home/me/
Rg90

你是救生员,@ albert-j!该IdentityFile行让我出去一个小时的车辙。
zev

4

仔细检查ssh守护程序配置(应该在中/etc/ssh/sshd_config)并检查:

PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

还要检查配置文件以查看是否已设置AllowUsersAllowGroups,因为它们分别充当用户和组的白名单。

另外,我注意到您正在尝试向根用户添加密钥。默认情况下,应该禁用root登录,但是您也可以通过PermitRootLogin字段更改此设置。


这些都不起作用:/我仍然知道Permission denied (publickey)
Jeff

3

根据您链接的日志,我认为您在客户端中找不到私钥文件时遇到了问题。

  • 首先检查文件~/.ssh/id_rsa在本地计算机上是否存在,并且是正确的_(如果还有更多文件)。

  • 检查.ssh文件夹权限drwx------如果不运行,则应为sudo chmod 700 ~/.ssh及其内容-rw-------如果不运行,则应为sudo chmod 600 ~/.ssh/*。也为远程计算机应用相同的权限。

另外,您可以尝试强制使用所需的私钥,直接将ssh其与-i参数一起提供。

  • 您可以运行以下内容:

    ssh -i /path/to/your/private-key root@X.X.X.X

    要么

    ssh -i ~/.ssh/id_rsa myRemoteUser@X.X.X.X

您可以在ssh联机帮助页上获取更多信息man ssh在终端上运行)

还要记住,如果要以root用户身份登录,必须在登录之前启用您的根帐户,并使用sudo passwd root或服务器管理工​​具为其创建密码(Ubutntu默认情况下禁用了根帐户)。您可以在Ubuntu Wiki上获得更多信息。

希望能帮助到你。


3

我最终重新安装openssh-server,从而解决了该问题。给出的解决方案都很棒,但是它们对我没有用。我不知道是什么引起了问题,但我认为以前的开发人员可能已经搞砸了配置,搞砸了。

我怀疑会不会有人遇到像我这样的特殊问题。但是,如果您有Digital Ocean分支,则无法访问SSH,并且给定的解决方案均无效,请通过Digital Ocean控制台运行这些命令来重新安装SSH服务器。当心,这是一个破坏性的过程,并且将删除/etc/ssh/(而不是您的.ssh目录)中的旧配置文件

apt-get purge openssh-server
apt-get autoremove
apt-get autoclean
apt-get install openssh-server

假设您的ssh客户端/密钥正确无误,那么您应该可以通过SSH进入服务器。


1

在Digital Ocean上使用Debian映像时,这个问题对我来说是突然出现的。在简短的设置过程中,可能会以某种方式在我设置root密码时将的所有者/root更改为user debian。我在中看到以下内容/var/log/auth.log

Jul 26 20:58:17 docker sshd[12576]: Authentication refused: bad ownership or modes for directory /root

只需执行即可chown root:root -R /root解决问题。

高温超导


0

只是有一个非常类似的问题。这对我有用-将这一行添加到/ etc / ssh / sshd_config

AuthorizedKeysFile %h/.ssh/authorized_keys 

然后以通常的方式重新启动ssh。

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.