问题描述
可以通过密码登录 SSH 服务器,但是无法通过公钥登录远程主机。目前,服务配置文件正常(对比过配置文件);也正确分发公钥;相同的操作,对于其他主机也能正常公钥登录。
注意,这个问题的成因由很多,我们这里描述的只是我们遇到的问题。
# 12/04/2019 这是我们第一次遇到这个问题。
# 12/05/2019 不到一天,我们又遇到了这个问题。
解决方案
排查方法
当处理与 OpenSSH 相关问题时,在多数情况下,可以通过增加日志输出来排查问题。
但是,不建议直接调整原服务。因为错误配置导致服务连接主机,除非你有补救方案。
应该,使用其他端口来启动 SSHD 服务(/usr/sbin/sshd -d -p 2222),然后使用 SSH 客户端连接该端口,并在服务端查看日志。
第一种、目录权限错误
问题原因
既然服务配置文件正常,也正确分发公钥,凭借多年的“职业感觉”也能够猜到是目录权限导致无法登录(毕竟常见问题原因就那几个)。但是还是要验证一下,不然怎么知道修改哪个目录呢?
在连接服务器时,使用ssh -vvvv选项,以进入调试模式。在输出中出现ssh receive packet: type 51消息,而连接正常主机返回ssh receive packet: type 60消息。
接下来调试服务端,启动服务时,使用sshd -ddd选项,进入调试模式。在输出中显示Authentication refused: bad ownership or modes for directory /root消息。
问题已经非常清晰,由于目录权限错误而导致无法登录(有时也会提示bad ownership or modes for file /root/.ssh/authorized_keys错误)。因此修改对应目录权限即可。
解决办法
# 修改 root 目录权限: chmod g-w $HOME # 修改.ssh 目录权限: chmod 700 $HOME/.ssh # 修改 authorized_keys 文件权限: chmod 600 $HOME/.ssh/authorized_keys
第二种、服务配置错误
问题原因
按照排查方法的描述,使用/usr/sbin/sshd -d -p 2222命令启动服务,然后使用 SSH 客户端连接该端口,并在服务端查看日志。
然后我们看到如下错误:
debug1: trying public key file /etc/.ssh/authorized_keys debug1: fd 4 clearing O_NONBLOCK debug3: secure_filename: checking '/etc/.ssh' debug3: secure_filename: checking '/etc' debug3: secure_filename: checking '/' debug2: key not found
凭借经验,因该是/etc/ssh/sshd_config配置错误,导致公钥查找路径错误。(在昨天处理这问题的时候我们无意间看到了AuthorizedKeysFile .ssh/authorized_keys配置)
果然在/etc/ssh/sshd_config中,配置AuthorizedKeysFile /etc/.ssh/authorized_keys配置。
解决办法
在/etc/ssh/sshd_config中,修改AuthorizedKeysFile行为AuthorizedKeysFile /etc/.ssh/authorized_keys配置。
参考文献
How to check sshd log?
SSH Authentication Refused: Bad Ownership or Modes for Directory
How to check sshd log?