首页 文章

如何使用没有root权限的PAM验证用户名/密码

提问于
浏览
4

我有用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

请问你能帮帮我吗?非常感谢!

2 回答

  • 6

    该应用程序需要能够阅读 /etc/shadow .

    有关这种方法的一种方法,请参见my post .

    编辑:如果链接中断,请从上面的链接添加帖子

    我在C中编写了身份验证模块,它可以通过Linux中的PAM检查用户名/密码(我正在使用Fedora Linux) . 我想和你分享,我做了什么:-) . 那么,我们走吧:-) Prerequisities:安装包pam-devel
    (使用影子密码时必须执行此步骤)创建新的Linux用户和组 . 将此组设置为此用户的默认组 . 然后
    按照以下步骤操作:转至/ 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;

    // //用于获取用户输入的函数
    int function_conversation(int num_msg,const struct pam_message ** msg,struct pam_response ** resp,void * appdata_ptr)
    {

    • resp =回复;
      返回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; //这是由pam_start设置的

    int retval;
    retval = pam_start(“su”,username,&local_conversation,&local_auth_handle);

    if(retval!= PAM_SUCCESS)
    {
    printf(“pam_start返回:%d \ n”,retval);
    返回0;
    }

    reply =(struct pam_response *)malloc(sizeof(struct pam_response));

    回复[0] .resp = strdup(密码);
    回复[0] .resp_retcode = 0;
    retval = pam_authenticate(local_auth_handle,0);

    if(retval!= PAM_SUCCESS)
    {
    if(retval == PAM_AUTH_ERR)
    {
    printf(“身份验证失败 . \ n”);
    }
    其他
    {
    printf(“pam_authenticate返回%d \ n”,retval);
    }
    返回0;
    }

    的printf( “认证\ n”);
    retval = pam_end(local_auth_handle,retval);

    if(retval!= PAM_SUCCESS)
    {
    printf(“pam_end返回\ n”);
    返回0;
    }

    返回1;
    }

    int main(int argc,char ** argv)
    {
    char *登录;
    char *密码;

    printf(“身份验证模块\ n”);

    if(argc!= 3)
    {
    printf(“参数的无效计数%d . \ n”,argc);
    printf(“./ authModule <username> <password>”);
    返回1;
    }

    login = argv [1];
    password = argv [2];

    if(authenticate_system(login,password)== 1)
    {
    printf(“使用%s进行身份验证 - %s到系统\ n”,登录,密码);
    返回0;
    }

    printf(“身份验证失败!\ n”);
    返回1;
    }
    编译代码:gcc -o authModule authModule.c -lpam
    运行代码(作为新用户!):./ authModule用户密码
    就这样!! :-) 希望能帮助到你!

  • 0

    由于代表太低,我还不能评论弗拉迪斯拉夫的帖子,但我不得不对他的代码说些什么 .

    如果您不以root用户身份运行此代码,则会执行 ONLY . 以root身份运行它时,接受已知用户的密码 EVERY 密码 .

    有谁知道如何解决这一问题?

    EDIT: 要解决此问题,您应该使用 su 服务的 sudo pam服务intead与 pam_start()

相关问题