Jef*_*eff 19 ssh networking 16.04
我有一个 Digital Ocean Droplet,我正试图让自己通过 ssh 访问。我不确定之前对它做了什么。我试过通过 Digital Ocean UI 添加我的公钥。那没有用,我一直得到permission denied (publickey)。
我通过数字海洋控制台访问服务器并手动将我的公钥添加到/root/.ssh/authorized_keys. 然后我尝试 ssh 使用ssh root@x.x.x.x. 这不起作用(权限被拒绝)。
所以我尝试添加一个新用户,创建/home/me/.ssh目录的权限700的.ssh目录本身,并600在authorized_keys文件中。然后我尝试了ssh me@x.x.x.x。那也没有用。
重新启动 ssh 守护进程也不会改变任何东西。
我错过了什么?
编辑:
这是详细的 ssh 输出。
https://gist.github.com/jaesung2061/a37cfd68308414cede8abf7f0137daa9
编辑2:
LogLevel DEBUG3 输出:
ear*_*Lon 26
~/.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
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我们建立digitaloceanbox和github和github.com,使我们可以做下面的命令:
ssh githubssh digitaloceanbox如果我们想以与配置文件中指定的用户不同的用户身份登录,我们只需放在开头user@:
ssh user@digitaloceanboxssh密钥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
Run Code Online (Sandbox Code Playgroud)
请注意,我已经指定了在提示时要生成的私钥的完整路径ssh-keygen。我还定义了注释 ( -C),它允许我轻松识别远程机器上的键。
这将创建两个文件:
.ssh/digitalocean-rsa
.ssh/digitalocean-rsa.pub
当您提供ssh密钥时,请确保它是.pub版本!!添加到您的 时~/.ssh/config,请确保添加与您添加到系统的公钥匹配的正确私钥。
大多数安装都将启用公钥身份验证。但是,如果您开始做事无所事事,您可能会遇到一些问题。在 OP 遇到问题的地方,我建议 OP 删除/root/.ssh/目录以重新开始。
不建议您使用sshroot 用户访问远程系统。建议您ssh切换到另一个用户,然后使用您的密码 ( sudo su -)升级到 root 。
ssh-copy-id无论您决定创建另一个用户并ssh作为该用户或 root 用户使用,以下都是将ssh密钥放置在服务器上的推荐方法:
ssh-copy-id -i /home/user/.ssh/digitalocean-rsa.pub user@digitaloceanbox这允许sshd使用所需的权限创建所需的目录和文件。这意味着您搞乱权限或需要记住细节的可能性为零。只需使用该工具上传密钥。
话虽如此,一旦您自己设置了密钥并验证您可以使用密钥进行连接,建议您禁用密码身份验证sshd并重新启动服务:
/etc/ssh/sshd_configPasswordAuthentication nosudo systemctl restart sshd如果禁用密码身份验证,您如何为新用户设置密钥?一种方法是将模板文件添加到/etc/skel目录中。锁定一位用户后,请执行以下操作:
sudo cp -r .ssh/ /etc/skel/ls /etc/skel/.ssh/etc/skel/.ssh/使它们为空,除非您想为每个新创建的用户自动键入自己的密钥。当您使用 来创建新用户时sudo useradd -m newuser,该用户将拥有.ssh/authorized_keys,您可以对其进行编辑并拥有适当的权限。
您可以查看sshd日志文件以了解连接失败或被拒绝的原因:
sudo tail -f /var/log/auth.log运行此命令时,请使用另一个终端尝试登录。很多时候提供的消息足以帮助查明问题或在线找到解决方案。
alb*_*t j 22
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
Run Code Online (Sandbox Code Playgroud)
对于用户我:
sudo chown me:me -R /home/me/
sudo chmod 700 /home/me/.ssh/
sudo chmod 600 /home/me/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)
然后再试一次。
当然,您还应该检查 /etc/ssh/sshd_config 是否完全允许 root 登录,或者只允许使用 ssh 密钥登录。
如果你有 :
PasswordAuthentication no
Run Code Online (Sandbox Code Playgroud)
然后你可以设置:
PermitRootLogin yes
Run Code Online (Sandbox Code Playgroud)
然后重新启动 sshd :
/etc/init.d/sshd restart
Run Code Online (Sandbox Code Playgroud)
然后再试一次。
请注意,使用 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
Run Code Online (Sandbox Code Playgroud)
之后在本地计算机上的命令行上尝试:
ssh -v my-vps
Run Code Online (Sandbox Code Playgroud)
当使用 ssh 密钥,以及其他一些登录不使用 ssh 密钥时,除了使用 ssh 密钥的条目外,您还可以在 ~/ssh/config 文件中定义不使用 ssh 密钥的 ssh 登录,例如:
Host pi
Hostname 192.168.1.111
Port 22
User pi
PasswordAuthentication yes
PreferredAuthentications password
Run Code Online (Sandbox Code Playgroud)
这对我来说很好用。也可以定义在命令行上使用哪个键:
ssh -v root@10.111.111.254 -i .ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)
这可能会使调试更容易,并且在命令行上这应该始终在本地计算机上工作。
小智 5
仔细检查 ssh 守护进程配置(应位于/etc/ssh/sshd_config)并检查:
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)
另请检查配置文件以查看是否已设置AllowUsers或AllowGroups,因为它们分别充当用户和组的白名单。
另外,我注意到您正在尝试向根用户添加密钥。默认情况下,应禁用 root 登录,但您也可以通过PermitRootLogin字段更改此设置。
我最终重新安装openssh-server解决了这个问题。给出的解决方案都很棒,但它们对我不起作用。我不知道是什么导致了这个问题,但我认为以前的开发人员可能搞乱了配置,把事情搞得非常糟糕。
我怀疑是否有人会遇到像我这样的具体问题。但是,如果您有 Digital Ocean Droplet,则无法获得 SSH 访问权限,并且给定的解决方案都不起作用,请通过 Digital Ocean 控制台运行这些命令来重新安装 SSH 服务器。请注意,这是一个破坏性过程,会删除/etc/ssh/(而不是您的.ssh目录)中的旧配置文件。
apt-get purge openssh-server
apt-get autoremove
apt-get autoclean
apt-get install openssh-server
Run Code Online (Sandbox Code Playgroud)
假设您的 ssh 客户端/密钥正常,您应该能够通过 SSH 连接到您的服务器。