You need to enable JavaScript to run this app. Docker容器配置SSH公钥认证并检查权限后仍要求输入密码
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器配置SSH公钥认证并检查权限后仍要求输入密码

SSH公钥认证失效排查与解决

核心排查步骤(按优先级排序)

  • 检查容器内sshd的实际生效配置
    不要依赖默认的sshd_config静态判断,直接在容器内执行命令查询sshd对当前用户的实际校验规则:
    /usr/sbin/sshd -T -C user=remote_user,host=staging.local,addr=你的本地连接IP
    重点核对3项输出值:
    • pubkeyauthentication必须为yes
    • authorizedkeysfile路径必须指向用户家目录下的.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校验失败。
  • 用debug模式快速定位问题
    直接在容器内前台启动带调试输出的sshd进程,监听临时端口:
    /usr/sbin/sshd -d -p 2222
    本地连接时用ssh -p 2222 remote_user@staging.local,终端会实时输出sshd收到公钥后的每一步判断逻辑,可直接定位到具体卡在哪一步。

当前Dockerfile的可修正点

  1. 修改用户创建命令,添加自动生成家目录、指定登录shell的参数:
    原命令:useradd remote_user
    修正为:useradd -m -s /bin/bash remote_user
  2. 显式写入sshd的公钥认证配置,避免基础镜像裁剪导致配置缺失:
    在安装完openssh-server的步骤后追加:
    echo -e "PubkeyAuthentication yes\nAuthorizedKeysFile .ssh/authorized_keys" >> /etc/ssh/sshd_config
  3. 权限校验补充递归检查步骤,确认从根目录到authorized_keys的所有路径权限均为属主可写、其他用户无写权限。

内容的提问来源于stack exchange,提问作者splunk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.10 15:36:04