我正在开发一个在PHP中使用PAM身份验证的脚本。当我尝试进行身份验证时,它适用于拥有该文件的用户,但尝试登录的任何其他用户都将失败。
如何让任何拥有系统帐户的用户进行身份验证,而不仅仅是拥有该文件的用户?
这是我对php的pam配置的副本:
auth optional pam_faildelay.so delay=3000000
@include common-auth
@include common-account
@include common-session
common-auth包含:
auth [success=1 default=ignore] pam_unix.so nullok_secure
auth requisite pam_deny.so
auth required pam_permit.so
普通帐户包含:
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
account requisite pam_deny.so
account required pam_permit.so
common-session包含:
session [default=1] pam_permit.so
session requisite pam_deny.so
session required pam_permit.so
session required pam_unix.so
这是我如何发出身份验证请求的示例:
if(pam_auth($username,$password)){
displayMappings();
}
else{
echo("authentication failure. Please try again.");
}
答案 0 :(得分:1)
PAM模块pam_unix.so需要root访问权限[1](例如来自suid根文件的调用)来验证与当前用户不同的用户。使用帮助程序unix_chkpwd验证当前用户密码 - 这是您正在观察的情况。
所以我想说任何直接从PHP脚本使用PAM(pam_unix.so)的尝试都注定要失败。
如果你必须检查/ etc / shadow密码,那么我会尝试将saslauthd守护进程配置为使用shadow password database / PAM。在大多数情况下,安装程序是微不足道的,但请查看saslauth套接字的文件和目录访问权限(在/ var / run中的某处)。
在PHP中,您可以使用this module或使用用户和密码参数调用testsaslauthd可执行文件并检查它的返回码。
[1]好的,影子组可能已经足够了。
答案 1 :(得分:0)
使用完整的pam_auth()
调用,您可以使用解决整个阴影问题的选项,只要您只使用最基本的功能:
$error="";
$auth = pam_auth($user,$pass,$error,false);
关闭其余的帐户检查,并使其进行简单的密码验证。