我们使用 PAM 与外部 radius 服务器进行身份验证。/etc/pam.d/common-auth 中有以下行
身份验证 [成功=6 默认=忽略] pam_exec.so reveal_authtok /home/cliuser/radiusAuth.sh
PAM 将密码写入脚本的标准输入,并将用户名作为环境变量提供。
此功能在 libpam-modules 版本 1.1.1-6.1 之前一直有效。升级到 1.1.3-7.1 后,当我尝试读取脚本时,密码显示为空。我们使用 open-ssh 作为 ssh 服务器。
谢谢,Prasanth
答案1
简短答案
我遇到了这个问题,原因是 /etc/ssh/sshd_config 中的一项策略被违反了。我的问题是设置了 AllowUsers,而我试图以系统中不存在的用户身份登录。
较长的答案
更详细的答案是密码被覆盖了。它实际上并不是空的。只是第一行有一个不可显示的退格符 (^H) 和一个新行。我使用的 read 命令只将第一行读入变量。在 stdin 上使用 cat 后,完整内容(如 vim 和 :set list 所示)是
"^H$
^M^?INCORRECT^@"
美元符号是一条新线。
经过一番挖掘,我们在 openssh 源代码中发现了这一点
这表明密码被覆盖了
其中包含了我们期望的字符。注释解释了原因:
/*
* If the user logging in is invalid, or is root but is not permitted
* by PermitRootLogin, use an invalid password to prevent leaking
* information via timing (eg if the PAM config has a delay on fail).
*/
用于将 authctxt->valid 标记为 false 的验证逻辑在这里 https://github.com/openssh/openssh-portable/blob/df56a8035d429b2184ee94aaa7e580c1ff67f73a/auth.c#L98
其中列出了用户/密码可能无效的所有原因。
编辑:我已更新链接以锁定特定提交,以便它们保持正确。虽然代码已更改,但行为没有改变。
答案2
另一个常见的错误/误解是如何从通过 stdin 传递的 pam 中获取密码。我见过的最简单的方法是
PASS=`cat -`
。从 $@、$1 等参数读取的更常见方法不起作用。