You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Rocky Linux 9.2配置AuthorizedKeysCommand后SSH登录仍要求输入密码的问题排查

Rocky Linux 9.2配置AuthorizedKeysCommand后SSH登录仍要求输入密码的问题排查

我来帮你一步步拆解这个问题,从你提供的日志、配置和脚本信息来看,核心问题出在AuthorizedKeysCommand执行失败,加上服务器端默认禁用了ssh-rsa算法,导致公钥认证完全走不通,最终触发了PAM的键盘交互认证(也就是密码提示)。下面是具体的排查和解决方向:

一、先看关键错误日志的提示

journalctl -u sshd的输出里,有三个必须重视的错误:

  1. sshd[3840]: main: sshd: ssh-rsa algorithm is disabled
    Rocky Linux 9的OpenSSH默认禁用了ssh-rsa算法(因为SHA1哈希算法的安全性问题),而你客户端提供的是id_rsa(RSA密钥),这会直接导致服务器拒绝你的公钥尝试,这是公钥认证失败的第一个诱因。

  2. AuthorizedKeysCommand /usr/local/bin/fetch_gitlab_keys.sh user failed, status 1
    这是最核心的问题:sshd调用你的密钥获取脚本时执行失败了。虽然你手动运行脚本没问题,但sshd在调用外部命令时,会使用非常受限的环境变量(比如PATH只包含基础目录,没有你手动登录时的环境变量),这是脚本在sshd上下文里失效的常见原因。

  3. User user authorized keys /dev/null is not a regular file
    你配置了AuthorizedKeysFile /dev/null,但sshd期望这个路径是常规文件,/dev/null是字符设备文件,所以会抛出这个警告。虽然它不一定是致命错误,但会干扰日志排查,建议修正。

二、针对性的排查和修复步骤

1. 启用ssh-rsa算法,让客户端RSA密钥能被识别

/etc/ssh/sshd_config里添加一行:

PubkeyAcceptedAlgorithms +ssh-rsa

添加后重启sshd服务:systemctl restart sshd,这样服务器就会接受客户端的RSA公钥了。

2. 修复AuthorizedKeysCommand脚本的执行问题

你手动跑脚本正常,但sshd调用时失败,大概率是环境差异导致的,建议做这些调试:

  • 指定curl的绝对路径:sshd的PATH可能不包含curl所在目录(虽然一般curl在/usr/bin,但保险起见),把脚本里的curl改成/usr/bin/curl
  • 添加详细调试日志:在脚本里增加更多输出,比如把环境变量、curl命令详情写入日志,方便排查:
    # 在脚本开头添加
    echo "[$(date)] - Running with user: $(whoami)" >> /tmp/fetch_gitlab_keys.log
    echo "[$(date)] - Environment variables:" >> /tmp/fetch_gitlab_keys.log
    env >> /tmp/fetch_gitlab_keys.log
    # 在curl命令前添加
    echo "[$(date)] - Executing curl command: curl --header 'Private-Token: $TOKEN' --silent --fail --write-out 'HTTPSTATUS:%{http_code}' $USER_KEY_URL" >> /tmp/fetch_gitlab_keys.log
    
  • 模拟sshd的执行环境:用root用户以非登录shell的方式运行脚本,模拟sshd调用时的上下文:
    su -s /bin/sh root -c "/usr/local/bin/fetch_gitlab_keys.sh user"
    
    如果这个命令失败,就能复现sshd遇到的问题,进而定位原因(比如DNS解析失败、GitLab地址无法访问、权限问题等)。

3. 修正AuthorizedKeysFile的配置

/etc/ssh/sshd_config里的:

AuthorizedKeysFile /dev/null

改成:

AuthorizedKeysFile none

none是OpenSSH官方支持的参数,表示不检查本地授权密钥文件,这样就能消除日志里的警告。

4. 调整PAM配置,避免 fallback 到密码认证(可选)

你设置了UsePAM yes,而PasswordAuthentication no,但PAM的keyboard-interactive模块仍然会触发密码提示。如果前面的步骤解决了公钥认证问题,这个可以不用改,但如果想彻底防止密码提示,可以编辑/etc/pam.d/sshd,把:

auth       include      password-auth

注释掉,换成:

auth       required     pam_nologin.so

这样即使公钥认证失败,也不会触发密码提示,但要注意不要影响其他合法的认证方式。

三、总结

当前的密码提示是因为公钥认证完全失败(脚本执行失败+ssh-rsa算法被禁用),sshd自动 fallback 到了PAM的键盘交互认证。只要解决了脚本在sshd上下文里的执行问题,同时启用ssh-rsa算法,公钥认证就能正常工作,密码提示自然会消失。

备注:内容来源于stack exchange,提问作者zamunda68

火山引擎 最新活动