「OpenSSH」- 无法通过公钥登录

  CREATED BY JENKINSBOT

问题描述

可以通过密码登录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?