PAM身份验证失败,出现suphp


PAM authentication failing with suphp

我正在编写一个在PHP中使用PAM身份验证的脚本。当我尝试进行身份验证时,它对拥有该文件的用户来说很好,但任何其他尝试登录的用户都会失败。

如何让任何拥有系统帐户的用户(而不仅仅是拥有该文件的用户)进行身份验证?

这是我的php:的pam配置的副本

auth       optional   pam_faildelay.so  delay=3000000
@include common-auth
@include common-account
@include common-session

公共身份验证包含:

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

公共会话包含:

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.");
}

PAM模块PAM_unix.so需要root访问权限[1](例如从suid根文件调用)来验证不同于当前用户的用户。当前用户密码是通过帮助程序unix_chkpwd验证的——这是您正在观察的情况。

所以我想说,任何直接从PHP脚本中使用PAM(PAM_unix.So)的尝试都是注定要失败的。

如果您必须检查/etc/shadow密码,那么我会尝试通过saslauthd守护进程配置为使用shadow口令数据库/PAM。在大多数情况下,安装程序都很简单,但请查看saslauth套接字(/var/run中的某个位置)的文件和目录访问权限。

在PHP中,您可以使用此模块,也可以使用用户和密码参数调用testsaslauthd可执行文件,并检查其返回代码。

[1] 好吧,影子小组可能就足够了。

使用完整的pam_auth()调用允许您使用绕过整个阴影问题的选项,只要您只使用最基本的功能:

$error="";
$auth = pam_auth($user,$pass,$error,false);

关闭其余的帐户检查,并使其进行简单的密码验证。