我用 C 语言构建了一个程序,在 Ubuntu 上运行它。 我正在使用 PAM 来验证用户身份,例如我启动一个客户端,客户端发送用户名和密码,服务器对用户进行身份验证。 问题是,如果我从 userA 启动进行 PAM 身份验证的程序,我只能对 userA 进行身份验证,而如果我尝试对 userB 进行身份验证,我会得到:
Failure in pam authentication: Authentication service cannot retrieve authentication info
只有使用
sudo
运行程序才能解决这个问题,但我认为这不是合适的方法?
以下是我目前如何使用 PAM 的总结:
pam_handle_t *handle = NULL;
const char *service_name = "myservice";
int retval;
char *username;
retval = pam_start(service_name, NULL, &conv, &handle); // &conv is the standard/default misc_conv function
if (retval != PAM_SUCCESS){
...
}
retval = pam_authenticate(handle, 0);
if (retval != PAM_SUCCESS) {
...
}
我也在 pam.d 文件夹中找到了这个文件:
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
只有使用 sudo 运行程序才能解决这个问题,但我认为这不是合适的方法?
您正在为您的服务使用身份验证堆栈中的
pam_unix
模块。仅当通过 PAM 调用身份验证的程序具有特权时,这才有用,因为 pam_unix
需要访问系统的安全凭证存储(/etc/shadow
文件,或安全身份验证服务,例如 sssd)。当然,除非您正在验证与当前会话关联的已验证用户。这就是为什么当您通过 sudo
运行应用程序时它可以工作,但当您作为普通用户运行它时则不行。
从某种意义上说,使用
sudo
运行应用程序是正确的方法。您需要根据系统的身份验证数据库对用户进行身份验证的权限,这是获取它的好方法。
获取所需权限的另一种风险更大的方法是使程序成为 SUID root,或为其提供适当的“功能”。如果您这样做,那么您会希望程序尽快删除不需要的权限。这是有这种需求的系统服务通常会采取的方式。 但是如果您不编写系统服务,那么最好的答案可能是
只是不写。想要冒充其他用户身份的普通用户应该使用 su
或
sudo
命令来执行此操作,或者应该首先以该用户身份登录。并且不应授权普通用户出于任何其他目的以不同用户的身份进行身份验证。