在pam_unix中无法读取阴影时,如何哈希检查?

时间:2018-12-21 13:28:06

标签: c linux pam

我正在使用Linux PAM模块,当用户无法访问影子文件时,我很困惑如何成功验证执行用户。

正如我在其他应用程序中看到的那样,通过SETUID将对影子文件的访问权限授予root,但这不是我的问题的范围:)

我的支票用户应用程序:

int main()
{
    struct pam_conv conv = {
        misc_conv,
        NULL
    };
    pam_handle_t *pamh=NULL;
    int retval;
    const char *user=NULL;
    user = argv[1];
    retval = pam_start("check_user", user, &conv, &pamh);
    if (retval == PAM_SUCCESS)
        retval = pam_authenticate(pamh, 0);
    if (retval == PAM_SUCCESS)
        fprintf(stdout, "Authenticated\n");
    else
        fprintf(stdout, "NOT\n");
    pam_end(pamh,retval);
}

我的/etc/pam.d/check_user:

auth    required                        pam_unix.so

当我以正确的密码作为用户testi执行该程序时: ./check_user testi 密码: 我获得了成功的“认证”。 每当我输入错误的密码或与其他用户尝试时,都会收到“身份验证失败”的信息。后者对我来说很清楚,但我不明白,根据密码的正确性,用户testi如何获得不同的结果。

在strace中,我看到对影子文件的访问被拒绝,并且进程的状态proc文件正在检查UID。但是如何在不访问影子文件的情况下检查密码?

非常感谢

1 个答案:

答案 0 :(得分:0)

  

我正在使用Linux PAM模块,当用户无法访问影子文件时,我很困惑如何成功验证执行用户。

     

正如我在其他应用程序中看到的那样,通过SETUID将对影子文件的访问权限授予root,但这不是我的问题的范围:)

不,这肯定在您的问题范围内。

当PAM需要验证用户名-密码对时,它将派生一个子进程,该子进程执行setuid-root帮助程序(对于pam_unix,为/sbin/unix_chkpwd)来进行验证。用户名和密码将传递给受信任的帮助程序。助手具有足够的特权来执行验证,并且仅响应验证是否成功。

尤其是,与用户相对应的影子条目数据永远不会传递到应用程序;该信息将保留在特权帮助程序中。