Как аутентифицировать имя пользователя / пароль, используя PAM без корневых привилегий

У меня есть программа, написанная на C. Она принимает 2 аргумента имя пользователя / пароль и пытается аутентифицировать этого пользователя с помощью PAM. Он отлично работает, когда я root. Когда я 'm' нормальный ' пользователь, это работает для этого пользователя, но не для другого. Я думаю, это связано с использованием теневых паролей.

В качестве услуги я использую:

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

Не могли бы вы мне помочь, пожалуйста? Большое спасибо!

 Vladislav Krejcirik14 июн. 2012 г., 12:57
Я решил эту проблему. Проверьте мой сайт Vkrejcirik.info / 2012/06/09 / ...
 theY4Kman14 авг. 2013 г., 17:36
Я полагаю, что это небезопасно, потому что PAM разрешит неконтролируемое перебор паролей.
 HonkyTonk07 июн. 2012 г., 11:50
Очевидный ответ на ваш вопрос о безопасности: НЕТ!
 Vladislav Krejcirik06 июн. 2012 г., 11:08
Я нашел одно решение: chmod 444 / etc / shadow .. но: это безопасно ??

Ответы на вопрос(2)

утации, но я должен что-то сказать по его коду.

Это делаетТОЛЬК работать, если вы не запускаете этот код от имени пользователя root. Когда вы запускаете его как root КАЖДЫЙ пароль для известного пользователя принят.

Кто-нибудь знает, как это исправить

РЕДАКТИРОВАТЬ Чтобы решить эту проблему, вы должны использоватьsudo PAM сервис intead изsu сервис сpam_start()

Решение Вопроса

/etc/shadow.

Видетьмой пос для одного способа сделать это.

EDIT: Добавить ссылку сверху на случай, если ссылка когда-нибудь сломается

Я написал модуль аутентификации на C ++, который позволяет проверять имя пользователя / пароль через PAM в Linux (я использую 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 для этой группы (тень chmod 0440)

Написать этот код: (authModule.c) просмотреть обычную копию в буфер обмена?

#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  

Run код (как новый пользователь!):

./authModule user password  

Вот и все!! :-) Надеюсь, это поможет

Ваш ответ на вопрос