ssh不能密钥登陆?记一次BUG排查
本文最后更新于:2022年4月22日 早上
ssh不能密钥登陆?记一次BUG排查
1.问题复述:
使用同样的公钥配置root和git用户,root用户轻松免密登陆,git用户却无法使用公钥登陆。
2.问题背景:
书接上回,我在云服务器上搭了一个hexo博客并写了一件配置脚本,方便服务器被人搞了快速重置或者以后换服务器。当时免密登陆没有写在脚本里是因为人们不总是每次重装都重做密钥。
但时间一长,仍不免觉得输密码太费事。
在试图配置git用户免密登陆时发现无论如何都无法免密登陆,使用root用户却轻松免密登陆。
3.解决过程
3.1.已排查的无效问题
- 调整
.ssh
目录下的公钥各种权限(不起作用) - 在
sshd_config
中调整一些设置,如选择RSA、选择认证文件位置等(不起作用) - 清除本地ssh的相关
known_hosts
缓存(不起作用) - 给服务器的git设置用户名和邮箱(不起作用)
- 用多种方法将公钥传到服务器尝试chown给不同用户(不起作用)
- 以防回车、空格、EOF等不可见字符导致翻车
- 直接传过去重命名、传过去复制到新文件里、从root用户直接拷给git用户
- 检索阿里云对可以密钥登陆的用户是否有白名单(没有)
- 检索是否有在ssh中配置可以密钥登陆用户的白名单(没有)
- 检索Mac的ssh是否错误配置密码登陆优先于密钥登陆(没有)
- 检索git是否对密钥登陆有一些限制(没有)
- 检索linux是否限制两个用户不能用同一个密钥(没有)
- 检索密钥认证过程是否会用到其他一些我在防火墙中关闭了的端口(没有)
- 检索git-shell是否会导致密钥认证出现问题或者默认配置中优先选择密码(没有)
以上常规解法都没能解决我的问题。事实上linux确实对.ssh
文件夹以及里面的密钥和登陆信息有权限的最低和推荐要求,但是按照官方要求的权限仍然无法解决问题。图片来源于知乎。
3.2.问题锁定
关闭密码登陆后,root用户仍然顺利登陆,git用户无法登陆,显示 permission denied(publickey)
。这一般是公钥错误或找不到情况下产生的回显。接下来排查是否是Mac本地设置的问题。
删除本地电脑中公私钥,发现root依然能登陆,git依然不能登陆。这说明Mac的命令行对密钥确实有缓存。
重启电脑,此时不能登陆root了。
恢复私钥,又能登陆root,还是不能登陆git。
给git用户切换到bash,重复以上步骤。表现依旧。
以上现象表明是git用户的某些设置导致了公钥认证失败。
3.3.有用的帖子
我检索到 SSH公钥认证失败排错 ,其中提到了“公钥确实发出去了,但是服务器拒绝了”。我决定按照他的调试操作查看公钥到底有没有发过去。如果确实发过去了,那就是服务端认证的问题,否则就是我笔记本电脑的问题。
ssh -vvv
查看连接的细节。观察到确实有receive packet: type 51
,也就是说服务端拒绝了密钥在
sshd_config
末尾添加LogLevel DEBUG
,打开ssh的调试模式登陆git用户。果然密钥又认证失败了
按照文章中说的使用
journalctl -u sshd |tail -300
查看日志,没有看到任何信息打开
/var/log
,按照修改时间顺序调整文件,重新尝试登陆git显然最下面两个文件中应该有相关日志。在
auth.log
中找到了相关调试信息。用户家目录的权限有问题,拒绝认证
3.4.找到答案
我之前在别的帖子中看到“权限要设置为XXX,否则不能登陆”,还以为是权限给低了不能读取公钥导致认证失败。但是我git用户家目录给的777
权限。显然是权限高了。
- 权限递归地调整为
700
,果然能使用密钥登陆。但hexo上传失败。应该是缺写权限了 - 权限递归地调整为
720
,hexo上传成功,但无法免密登陆。说明不能给其他用户写权限 - 权限递归地调整为
750
,能使用密钥登陆,hexo上传成功。但访问网页时任意一个跳转nginx都会返回错误。说明nginx还需要写权限来运行 /home/git/Blog
目录递归地调整为777
权限,问题依旧。- 家目录权限递归地调整为
755
,/home/git/Blog
目录递归地调整为777
权限,所有问题解决。此时能使用密钥登陆,hexo上传成功,网页能正常显示。
问题成功解决!
参考文章
本博客所有文章除特别声明外均为原创,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!