我用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 a pointer to the struct with 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
1条答案
按热度按时间91zkwejq1#
我可以解决这个问题,只有当我运行程序与sudo,但我不认为这是适当的方法?
您正在为您的服务使用身份验证堆栈中的
pam_unix
模块。这仅在通过PAM调用身份验证的程序具有特权时才有用,因为pam_unix
需要访问系统的安全凭证存储(/etc/shadow
文件或安全身份验证服务,如sssd)--可能的例外是对与当前会话关联的已通过身份验证的用户进行身份验证。这就是为什么当您通过sudo
运行应用程序时,它可以工作,而当您作为普通用户运行它时,它却不能工作。从某种意义上说,使用
sudo
运行应用程序是正确的方法。您需要根据系统的身份验证数据库对用户进行身份验证的特权,这是获得它的一个好方法。另一种风险更大的获得所需特权的方法是使程序成为SUID根,或者给予适当的capabilities。如果你这样做,那么你会希望程序尽快删除不需要的特权。这是具有这种需求的系统服务通常会采用的方式。
但是如果你不是在写一个系统服务,那么最好的答案可能是不要**。想要使用不同用户身份的普通用户应该使用
su
或sudo
命令来执行此操作,或者应该首先以该用户身份登录。这将使您的应用程序不需要验证不同的用户。