Docker容器配置SSH公钥认证并检查权限后仍要求输入密码
SSH公钥认证失效排查与解决
核心排查步骤(按优先级排序)
- 检查容器内sshd的实际生效配置
不要依赖默认的sshd_config静态判断,直接在容器内执行命令查询sshd对当前用户的实际校验规则:/usr/sbin/sshd -T -C user=remote_user,host=staging.local,addr=你的本地连接IP
重点核对3项输出值:pubkeyauthentication必须为yesauthorizedkeysfile路径必须指向用户家目录下的.ssh/authorized_keys(部分裁剪镜像会将路径改到全局/etc目录下,导致读取不到你COPY的公钥)strictmodes为开启状态时,sshd会递归校验从根目录到目标文件的所有路径权限,只要任意一级目录存在属主外可写的情况,就会直接跳过公钥认证。
- 核对密钥对的匹配一致性
客户端日志显示你尝试提交了两个不同的公钥,直接在容器内执行命令查看实际存入的公钥内容:cat /home/remote_user/.ssh/authorized_keys
逐字符和本地执行cat ~/.ssh/id_rsa.pub输出的内容对比,排除构建镜像时COPY公钥带入多余换行、空格、文本格式错误的问题,确认你尝试提交的两个公钥都在文件列表中存在。 - 通过sshd运行日志定位精准拒因
客户端debug日志只会提示公钥被拒绝,不会显示具体原因,直接查看容器的sshd运行日志:docker logs <你的容器ID或名称>
日志会明确标注拒签原因,常见的匹配问题包括:- 用户shell为nologin:Ubuntu基础镜像默认用
useradd创建用户时,未指定shell参数会默认配置为/usr/sbin/nologin,这类用户即使通过公钥校验,也会被跳过认证流程直接转密码验证。 - 递归路径权限异常:即使你看到家目录、.ssh目录、authorized_keys的权限正确,只要中间任意一级路径(比如
/home目录)存在组可写的权限配置,就会触发strict mode校验失败。
- 用户shell为nologin:Ubuntu基础镜像默认用
- 用debug模式快速定位问题
直接在容器内前台启动带调试输出的sshd进程,监听临时端口:/usr/sbin/sshd -d -p 2222
本地连接时用ssh -p 2222 remote_user@staging.local,终端会实时输出sshd收到公钥后的每一步判断逻辑,可直接定位到具体卡在哪一步。
当前Dockerfile的可修正点
- 修改用户创建命令,添加自动生成家目录、指定登录shell的参数:
原命令:useradd remote_user
修正为:useradd -m -s /bin/bash remote_user - 显式写入sshd的公钥认证配置,避免基础镜像裁剪导致配置缺失:
在安装完openssh-server的步骤后追加:echo -e "PubkeyAuthentication yes\nAuthorizedKeysFile .ssh/authorized_keys" >> /etc/ssh/sshd_config - 权限校验补充递归检查步骤,确认从根目录到authorized_keys的所有路径权限均为属主可写、其他用户无写权限。
内容的提问来源于stack exchange,提问作者splunk
相关产品推荐
相关产品推荐

