我有一个 Digital Ocean droplet,我正尝试授予自己 ssh 访问权限。我不确定之前对它做了什么。我尝试通过 Digital Ocean UI 添加我的公钥。这没有用,我一直收到permission denied (publickey)
。
我通过 Digital ocean 控制台访问了服务器,并手动将我的公钥添加到/root/.ssh/authorized_keys
。然后我尝试使用 ssh 。但这没有用(权限被拒绝)。ssh [email protected]
因此,我尝试添加一个新用户,并创建了具有目录本身和文件权限/home/me/.ssh
的目录。然后我尝试了。但还是没用。700
.ssh
600
authorized_keys
ssh [email protected]
重新启动 ssh 守护进程也不会改变任何东西。
我错过了什么?
编辑:
这是详细的 ssh 输出。
https://gist.github.com/jaesung2061/a37cfd68308414cede8abf7f0137daa9
编辑2:
LogLevel DEBUG3
输出:
答案1
客户端配置
设置~/.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
在此示例中,我们设置和digitaloceanbox
以便可以执行以下命令:github
github.com
ssh github
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
),它允许我轻松识别远程计算机上的密钥。
这将创建两个文件:
.ssh/digitalocean-rsa
- 私人的钥匙。 永远不要分享。
.ssh/digitalocean-rsa.pub
- 公钥。这是您存储在服务器上用于进行身份验证的信息。
当您提供ssh
密钥时,请确保它是该.pub
版本!!当您添加到时~/.ssh/config
,请确保添加与您添加到系统的公钥相匹配的正确私钥。
服务器配置
大多数安装都会启用公钥身份验证。但是,如果你开始胡乱操作,可能会遇到一些问题。对于 OP 遇到的问题,我建议 OP 删除目录/root/.ssh/
重新开始。
不建议您使用ssh
访问远程系统上的 root 用户。建议您先ssh
登录另一个用户,然后使用您的密码升级为 root 用户 ( sudo su -
)。
使用以下方式将密钥添加到主机ssh-copy-id
无论您决定创建另一个用户并ssh
以该用户或根用户身份使用,以下都是ssh
在服务器上放置密钥的推荐方法:
ssh-copy-id -i /home/user/.ssh/digitalocean-rsa.pub user@digitaloceanbox
这允许sshd
创建具有所需权限的目录和文件。这意味着您完全不会弄乱权限或需要记住详细信息。只需使用该工具上传密钥即可。
禁用密码验证
话虽如此,一旦您输入了密钥并验证能够使用密钥进行连接,建议您禁用密码验证sshd
并重新启动服务:
- 编辑
/etc/ssh/sshd_config
PasswordAuthentication no
sudo 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
运行此命令时,使用另一个终端尝试登录。很多时候提供的消息足以帮助查明问题,或在线找到解决方案。
答案2
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 [email protected] -i .ssh/id_rsa
这可能使调试更容易,并且在命令行上这应该始终在本地计算机上工作。
答案3
仔细检查 ssh 守护进程配置(应该在/etc/ssh/sshd_config
)并检查:
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
还要检查配置文件,看看是否允许用户或者允许群组已经设置,因为它们分别充当用户和组的白名单。
另外,我注意到您正在尝试为 root 用户添加密钥。默认情况下,root 登录应被禁用,但您也可以通过以下方式更改此设置:允许Root登录场地。
答案4
我最终重新安装了系统,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
假设您的 ssh 客户端/密钥均井然有序,您应该能够通过 SSH 进入您的服务器。