Использование PAM в программе на C для обновления пароля пользователя

Я создаю программу на C, которая обновляет пароль пользователя. Для этого я использую PAM. Я основал свой минимальный код вне этого.

#include <stdio.h>
#include <unistd.h>
#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <security/pam_modules.h>

int main(int argc, char** argv)
{
    setuid(0);
    int retval;
    int started;

    const char *user = "user";
    pam_handle_t *pamh=NULL;
    const struct pam_conv conv = {
    misc_conv,
    NULL
    };

    if(argc == 2)
    {
        const char *updated = argv[1];

        started = pam_start("update_password", user, &conv, &pamh);
        int setTok;
        if(started == PAM_SUCCESS)
        {
            setTok = pam_set_item(pamh, PAM_AUTHTOK_TYPE, updated);
            int setPass;
            setPass = pam_chauthtok(pamh, PAM_SILENT);
            retval = setPass;
        }
        printf("Started: %d\n", started);
        printf("SetTok: %d\n", setTok);
        printf("SetPass: %d\n", retval); 

    }
    else{
        printf("incorrect number of args");
    }

    if (pam_end(pamh,retval) != PAM_SUCCESS){
        pamh = NULL;
        exit(1);
    }

    return ( retval == PAM_SUCCESS ? 1:0);
} 

Выход такой:

Started: 0
SetTok: 0
SetPass: 20

Я использовал это, чтобы определить, какие цифры: коды состояния PAM

Прежде всего, я не понимаю, как передать мой обновленный пароль pam_chauthtok(), я использовал pam_set_item который "преуспел", но на самом деле не помог мне в получении информации pam_chauthtok функция. Я думаю, что мне может понадобиться передать обновленный пароль pam_handle_t или же pam_conv, но я не уверен, как это сделать, и я не понял, как это в конечном итоге отправит информацию pam_chauthtok()

Обещаю, я много гуглил и стараюсь изо всех сил, я просто очень потерян. Пожалуйста, попросите разъяснений, если то, что я сказал или написал, имеет мало смысла. Я на самом деле новичок в C, так что если есть какие-то явные синтаксические ошибки, которые я пропускаю, вот почему.

1 ответ

вы должны увидеть libmisc/pam_pass_non_interactive.c в github shadow-masters. Это то, что использует chpasswd. Существует интересное использование pam_conv путем регистрации обратного вызова внутри него. Новый пароль просто помещается в корзину ответа входного параметра в аргументах обратного вызова и обновляется до pam. В идеале вызов chpasswd, как показано ниже, в оболочке Linux, проходит через этот поток и попадает в стек паролей в служебном файле.

эхо : | chpasswd

ИЛИ если вы не вошли в систему как root и получили разрешение sudoer на chpasswd

эхо : | sudo chpasswd

Другие вопросы по тегам