我正在使用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。但是如何在不访问影子文件的情况下检查密码?
非常感谢
答案 0 :(得分:0)
我正在使用Linux PAM模块,当用户无法访问影子文件时,我很困惑如何成功验证执行用户。
正如我在其他应用程序中看到的那样,通过SETUID将对影子文件的访问权限授予root,但这不是我的问题的范围:)
不,这肯定在您的问题范围内。
当PAM需要验证用户名-密码对时,它将派生一个子进程,该子进程执行setuid-root帮助程序(对于pam_unix,为/sbin/unix_chkpwd
)来进行验证。用户名和密码将传递给受信任的帮助程序。助手具有足够的特权来执行验证,并且仅响应验证是否成功。
尤其是,与用户相对应的影子条目数据永远不会传递到应用程序;该信息将保留在特权帮助程序中。