c - 当 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。但是如何在不访问影子文件的情况下检查密码?
非常感谢
解决方案
我正在使用 Linux PAM 模块,当用户无权访问影子文件时,我很困惑如何成功地验证正在执行的用户。
正如我在其他应用程序中看到的那样,对影子文件的访问权限是通过SETUID 授予root 的,但这不是我的问题的范围:)
不,这绝对在您的问题范围内。
当 PAM 需要验证用户名-密码对时,它会派生一个执行 setuid-root 帮助程序(/sbin/unix_chkpwd
用于 pam_unix)的子进程来进行验证。用户名和密码被传递给受信任的助手进程。助手有足够的权限进行验证,并简单地响应验证是否成功。
特别是,与用户对应的影子条目数据永远不会传递给应用程序;该信息保留在特权助手进程中。
推荐阅读
- python - 无法限制内存
- r - 我应该使用什么方法/模块对文本进行分类/分类?
- laravel - Laravel 和图像验证
- c++ - 初始化一个类中的指针数组并在另一个类中检索它
- javascript - 如何在单击按钮时在反应挂钩中清除Interval
- python - 试图用python制作一个聊天机器人(有点)
- d3.js - Oracle APEX 5.0:在 D3 折线图上设置第二个 Y 轴
- c++ - 字符串数组上的 Sizeof 运算符在 C++ 中给出不同的输出
- xamarin.forms - 如何防止 Scrollview 扩展超出其最大可用扩展空间
- python - 请求(由 SSLError 引起(“无法连接到 HTTPS URL,因为 SSL 模块不可用。”)在 Linux 上