You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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参数:
    auth        required        pam_unix.so shadow
    account     required        pam_unix.so shadow
    
    缺点是shadow组用户能读取所有用户的密码哈希,存在泄露风险。

关键代码修正

你的代码里pam_start第二个参数传的是NULL,PAM会默认认证当前进程的用户(UserA),而不是客户端发来的UserB。必须把客户端传入的username作为第二个参数传入:

retval = pam_start(service_name, username, &conv, &handle);

内容的提问来源于stack exchange,提问作者testermaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:42:38