启用 reveal_authtok 后,pam_exec.so 不会将密码写入脚本

启用 reveal_authtok 后,pam_exec.so 不会将密码写入脚本

我们使用 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 源代码中发现了这一点

https://github.com/openssh/openssh-portable/blob/df56a8035d429b2184ee94aaa7e580c1ff67f73a/auth-pam.c#L1198

这表明密码被覆盖了

https://github.com/openssh/openssh-portable/blob/df56a8035d429b2184ee94aaa7e580c1ff67f73a/auth-pam.c#L234

其中包含了我们期望的字符。注释解释了原因:

/*
 * 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 等参数读取的更常见方法不起作用。

相关内容