账号未设置密码时的ssh密钥登陆

我在制作 Alpine Docker镜像 发现和其他发行版不同的是: 启用ssh后的容器,即使配置了公钥也无法使用密钥登陆。

这个问题折腾了好久,我最初以为是卷绑定的属主问题,反复对比验证。最后偶然发现,只要给用户账号设置一个密码,就立即能够使用密钥登陆了。这说明密钥对没有配置错,账号的 ~/.ssh 目录及相关密钥文件的属主也是正确的,

问题就聚焦到 sshd 服务配置上,哪个参数导致了没有设置密码的账号无法用密钥登陆(即使密钥正确)?

Alpine Linux 的默认 /etc/sshd_config 配置有如下内容说明(默认注释就是sshd默认配置):

默认 /etc/ssh/sshd_config
# To disable tunneled clear text passwords, change to "no" here!
#PasswordAuthentication yes
#PermitEmptyPasswords no

这说明在Alpine Linux上sshd默认允许密码登陆

但是对于Linux系统来说,一个新创建的账号如果没有通过 passwd 设置密码,账号初始是锁定(locked)状态的。这就导致了 ssh 密钥也无法使用

解决方法比较简单,就是给用户账号配置一个密码。不过,对于Docker容器来说,给用户账号配置密码不是好方法,最好还是通过ssh密钥登陆。所以,实际上在 Alpine Docker镜像 实践中,我是通过调整 /etc/ssh/sshd_config 配置,修订成和 Debian 等系统一样的默认只允许密钥登陆,就能够解决这个问题:

修订 /etc/ssh/sshd_config 关闭密码登陆,此时密钥登陆就无需设置用户密码
# To disable tunneled clear text passwords, change to "no" here!
#PasswordAuthentication yes
PasswordAuthentication no
#PermitEmptyPasswords no

参考