Использование 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