Ubuntu下从UserA启动程序时,PAM认证UserB失败的技术问询
问题:非root用户运行PAM认证程序无法跨用户认证
我在Ubuntu系统上用C语言开发了一个程序,采用PAM做用户认证——客户端发送用户名和密码,服务器端完成认证操作。现在碰到个问题:用UserA账户启动程序时,只能成功认证UserA;尝试认证UserB就会报错:Failure in pam authentication: Authentication service cannot retrieve authentication info
目前只有用sudo运行程序能解决,但这显然不是合理方案。
当前代码摘要
pam_handle_t *handle = NULL; const char *service_name = "myservice"; int retval; char *username; retval = pam_start(service_name, NULL, &conv, &handle); // &conv是指向包含标准/默认misc_conv函数的结构体指针 if (retval != PAM_SUCCESS){ ... } retval = pam_authenticate(handle, 0); if (retval != PAM_SUCCESS) { ... }
PAM配置文件(/etc/pam.d/myservice)内容
auth required pam_unix.so auth required pam_listfile.so onerr=fail item=group sense=allow file=/etc/login.group.allowed account required pam_unix.so
问题原因与解决办法
核心原因
这个报错本质是非root用户没有权限读取/etc/shadow文件——pam_unix.so需要读取shadow文件来验证其他用户的密码哈希,普通用户只能访问自己的条目,没法获取其他用户的认证信息。
可行解决方案
1. 给程序添加CAP_DAC_READ_SEARCH权限(推荐)
用Linux的capabilities机制给单个程序授予特定权限,不用全程以root身份运行:
sudo setcap cap_dac_read_search+ep /path/to/your/auth_program
该权限允许程序绕过文件系统的DAC(自主访问控制)检查,能正常读取shadow文件。注意:要确保程序本身没有安全漏洞,避免权限被滥用。
2. 将运行用户加入shadow组(不推荐)
这种方式风险较高,仅适合测试环境:
- 把UserA加入shadow组:
sudo usermod -aG shadow UserA - 修改PAM配置文件里的
pam_unix.so行,添加shadow参数:
缺点是shadow组用户能读取所有用户的密码哈希,存在泄露风险。auth required pam_unix.so shadow account required pam_unix.so shadow
关键代码修正
你的代码里pam_start第二个参数传的是NULL,PAM会默认认证当前进程的用户(UserA),而不是客户端发来的UserB。必须把客户端传入的username作为第二个参数传入:
retval = pam_start(service_name, username, &conv, &handle);
内容的提问来源于stack exchange,提问作者testermaster
相关产品推荐
相关产品推荐

