当启用expose_authtok 时,pam_exec.so 不会将密码写入脚本

Pra*_*lai 2 openssh pam

我们正在使用 PAM 与外部半径服务器进行身份验证。我们在 /etc/pam.d/common-auth 中有以下行

auth [success=6 default=ignore] pam_exec.so 暴露_authtok /home/cliuser/radiusAuth.sh

PAM 将密码写入脚本的 stdin 并提供用户名作为环境变量。

这一直工作到 libpam-modules 版本 1.1.1-6.1。升级到 1.1.3-7.1 后,当我尝试在脚本中读取时密码为空。我们使用 open-ssh 作为我们的 ssh 服务器。

谢谢,普拉桑斯

uil*_*wen 7

简答

我遇到了这个问题,问题是 /etc/ssh/sshd_config 中有一个被违反的策略。我的是设置了 AllowUsers 并且我试图以系统上尚不存在的用户身份登录。

更长的答案

更长的答案是密码被覆盖。它实际上并不是空的。碰巧第一行有一个不可显示的退格字符(^H)和一个新行。我使用的读取命令只是将第一行读入变量。在 stdin 上使用 cat 后,完整内容(如带有 :set list 的 vim 所示)是

"^H$
^M^?INCORRECT^@"
Run Code Online (Sandbox Code Playgroud)

美元符号是一条新线。

经过一番挖掘,我们在 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).
 */
Run Code Online (Sandbox Code Playgroud)

用于将 authctxt->valid 标记为 false 的验证逻辑在这里 https://github.com/openssh/openssh-portable/blob/df56a8035d429b2184ee94aaa7e580c1ff67f73a/auth.c#L98

其中列出了用户/密码可能无效的所有原因。

编辑:我已更新链接以锁定特定提交,以便它们保持正确。虽然代码改变了行为并没有改变。