Rocky Linux 9.2配置AuthorizedKeysCommand后SSH登录仍要求输入密码的问题排查
我来帮你一步步拆解这个问题,从你提供的日志、配置和脚本信息来看,核心问题出在AuthorizedKeysCommand执行失败,加上服务器端默认禁用了ssh-rsa算法,导致公钥认证完全走不通,最终触发了PAM的键盘交互认证(也就是密码提示)。下面是具体的排查和解决方向:
一、先看关键错误日志的提示
从journalctl -u sshd的输出里,有三个必须重视的错误:
sshd[3840]: main: sshd: ssh-rsa algorithm is disabled
Rocky Linux 9的OpenSSH默认禁用了ssh-rsa算法(因为SHA1哈希算法的安全性问题),而你客户端提供的是id_rsa(RSA密钥),这会直接导致服务器拒绝你的公钥尝试,这是公钥认证失败的第一个诱因。AuthorizedKeysCommand /usr/local/bin/fetch_gitlab_keys.sh user failed, status 1
这是最核心的问题:sshd调用你的密钥获取脚本时执行失败了。虽然你手动运行脚本没问题,但sshd在调用外部命令时,会使用非常受限的环境变量(比如PATH只包含基础目录,没有你手动登录时的环境变量),这是脚本在sshd上下文里失效的常见原因。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调用时的上下文:
如果这个命令失败,就能复现sshd遇到的问题,进而定位原因(比如DNS解析失败、GitLab地址无法访问、权限问题等)。su -s /bin/sh root -c "/usr/local/bin/fetch_gitlab_keys.sh user"
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




