首页 > 解决方案 > 当 pam_unix 中的影子不可读时如何进行哈希检查?

问题描述

我正在使用 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 Password: 我得到一个成功的“认证”。每当我输入错误的密码或尝试使用其他用户时,我都会收到身份验证失败。后者对我来说很清楚,但我不明白,对于用户 testi 我如何得到不同的结果,具体取决于密码的正确性。

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

非常感谢

标签: clinuxpam

解决方案


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

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

不,这绝对在您的问题范围内。

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

特别是,与用户对应的影子条目数据永远不会传递给应用程序;该信息保留在特权助手进程中。


推荐阅读