我有用C编写的程序。它使用2个参数用户名/密码,并尝试使用PAM验证此用户。当我是root用户时它工作正常。当我是'普通'用户时,它适用于该用户,但不适用于另一个用户。我想,这是因为使用了影子密码..
作为我正在使用的服务:
retval = pam_start("test", username, &local_conversation, &local_auth_handle);
我将其添加到/etc/pam.d/test
#%PAM-1.0
auth required pam_unix.so shadow nullok
account required pam_unix.so
session required pam_unix.so
你能帮助我吗?
非常感谢!
答案 0 :(得分:7)
该应用程序需要能够阅读/etc/shadow
。
有关实现此目的的一种方法,请参阅my post。
编辑: 如果链接中断,请从上面的链接添加帖子
我在C ++中编写了认证模块,可以检查 Linux中的PAM用户名/密码(我正在使用Fedora Linux)。一世 我愿意和你分享,我做了什么:-)。那么,我们走了: - )
Prerequisities:
Install package pam-devel (This step is necessary when you use shadow password) Create new Linux user and group. Set this group as default for this user. Then
按照以下步骤操作: 转到/ etc 以root身份登录(su) 将组更改为新文件阴影组(chgrp new_group shadow) 为这个组设置'read'privilage(chmod 0440 shadow)
编写此代码:(authModule.c)查看plaincopy到clipboardprint?
#include <stdio.h> #include <security/pam_appl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> struct pam_response *reply; // //function used to get user input int function_conversation(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) { *resp = reply; return PAM_SUCCESS; } int authenticate_system(const char *username, const char *password) { const struct pam_conv local_conversation = { function_conversation, NULL }; pam_handle_t *local_auth_handle = NULL; // this gets set by pam_start int retval; retval = pam_start("su", username, &local_conversation, &local_auth_handle); if (retval != PAM_SUCCESS) { printf("pam_start returned: %d\n ", retval); return 0; } reply = (struct pam_response *)malloc(sizeof(struct pam_response)); reply[0].resp = strdup(password); reply[0].resp_retcode = 0; retval = pam_authenticate(local_auth_handle, 0); if (retval != PAM_SUCCESS) { if (retval == PAM_AUTH_ERR) { printf("Authentication failure.\n"); } else { printf("pam_authenticate returned %d\n", retval); } return 0; } printf("Authenticated.\n"); retval = pam_end(local_auth_handle, retval); if (retval != PAM_SUCCESS) { printf("pam_end returned\n"); return 0; } return 1; } int main(int argc, char** argv) { char* login; char* password; printf("Authentication module\n"); if (argc != 3) { printf("Invalid count of arguments %d.\n", argc); printf("./authModule <username> <password>"); return 1; } login = argv[1]; password = argv[2]; if (authenticate_system(login, password) == 1) { printf("Authenticate with %s - %s through system\n", login, password); return 0; } printf("Authentication failed!\n"); return 1; }
编译代码:
gcc -o authModule authModule.c -lpam
运行代码(作为新用户!):
./authModule user password
这就是全部!! :-)希望它有所帮助!
答案 1 :(得分:0)
由于代表太低,我还不能评论弗拉迪斯拉夫的帖子,但我不得不对他的代码说些什么。
如果您不以root用户身份运行此代码,则仅工作。以root身份运行时已接受已知用户的每个密码。
有谁知道如何解决这个问题?
修改强>
要解决此问题,您应该使用sudo
服务的su
pam服务内容pam_start()