前因

在昨天白天突发奇想准备对我的个人博客做一波技术调整,经过了深刻的调研,我终于登录了由于期末和实验室繁忙而许久未登的服务器。

哐当,一个密码请求出现在我面前。

我之前应该是配置过 SSH 密钥免密登录的,但是由于这期间我重装了本地电脑系统,因此以为是我的本地问题,也就没再细究。

尝试

在完成了博客技术调整之后,需要一个自动部署脚本,而密码的存在是大大不利于自动化的,因此我便又看回了这个问题。

最开始我以为是本地莫名的原因优先尝试了密码登录而无视 SSH 密钥,就先登录了服务器禁用了密码登录。再次尝试登录后喜提权限拒绝

1
ubuntu@11.22.33.44: Permission denied (publickey).

可以看到确实是 SSH 密钥出现了问题。

便将目光看向了前面提过的因为重装系统而怀疑的本地环境,检查并确保了 SSH 相关文件的权限正确。

1
chmod 700 ~/.ssh && chmod 600 ~/.ssh/* && chmod 644 ~/.ssh/*.pub

再次尝试,问题依旧。

接着我又检查了 config 文件,也并未发现什么异常,通过 ssh -i 手动指定 SSH 密钥文件,避免受多密钥环境影响,也并未解决。

到此,对于本地可能存在的问题基本毫无头续了,我便将目光转向了服务器。

顺带在腾讯云后台检查了一遍 SSH 密钥的公钥内容,完全一致,也尝试了重新绑定一遍 SSH 密钥,并没能解决问题。

进入了腾讯云后台的 一键登录 ,登录上 lighthouse 账号后再 su ubuntu 到主账号进行接下来的排查。

首先检查了服务器的 SSH 文件情况,并用同样的方法修改了一遍 SSH 相关文件权限,但依旧无法登录。

到此,基本上我过往问题的解决经验,以及互联网上搜索到常见的解决方案基本已经尝试过了,中途我也尝试过 ssh-add 一类的解决方案,但都无能为力。

解决

没办法,经验不管用,只能老老实实从日志看起了。

首先在本地连接时使用 ssh -vvv 输出完整调试信息,这里截取最后一部分。

1
2
3
4
5
6
7
8
9
...

debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
ubuntu@11.22.33.44: Permission denied (publickey).

可以看到,在我们发送完公钥等待校验之后,SSH 请求便被拒绝了,整体流程在本地是没有什么问题的,因此可以排除本地的问题。

再来到服务器上,在本地发起 SSH 请求被拒绝后,使用 journalctl -r 查阅 sshd 的输出日志,看看服务端到底因何拒绝的连接。

1
2
3
4
5
6
7
8
...

Mar 02 21:56:14 VM-16-15-ubuntu sshd[10410]: Disconnected from invalid user cse 55.66.77.88 port 52971 [preauth]
Mar 02 21:56:14 VM-16-15-ubuntu sshd[10410]: Received disconnect from 55.66.77.88 port 52971:11: Bye Bye [preauth]
Mar 02 21:56:14 VM-16-15-ubuntu sshd[10410]: Invalid user cse from 55.66.77.88 port 52971
Mar 02 21:56:11 VM-16-15-ubuntu sshd[10404]: Connection closed by authenticating user ubuntu 55.66.77.88 port 23428 [preauth]
Mar 02 21:56:10 VM-16-15-ubuntu sshd[10404]: Authentication refused: bad ownership or modes for directory /home/ubuntu
Mar 02 21:56:01 VM-16-15-ubuntu CRON[10330]: pam_unix(cron:session): session closed for user root

在日志中,我们注意到了这么一句

1
Authentication refused: bad ownership or modes for directory /home/ubuntu

sshd 在抱怨 /home/ubuntu 目录的所有者/权限异常!

我顿感大事不妙,去检查了一下权限

好家伙呀 /home/ubuntu 果然喜提 0777,这是 ssh 完全无法接受的绝对开放权限。

赶紧把 /home/ubuntu 的权限降为 0755

再次尝试,连接成功!

反思

后面想了想,应该是之前某次为了省事,无知的我直接暴力地把家目录 chmod -R 0777 了,一直没出问题现在才发现也是够幸运的……

我这么蠢的做法也确实是很难找到第二个了。

  • Linux 完善严格的权限系统
  • 日志很重要
  • 权限杜绝 0777