PAM - Какво да направите, когато се изисква промяна на паролата?

Намерих част от кода в Интернет, който изглеждаше като добър пример - http://www.freebsd.org/doc/en/articles/pam/article.html#pam-sample-appl

За съжаление не се справя правилно с акаунти, които изискват промяна на парола при първото влизане. Когато su - user (от не-root акаунт,) получавам правилно запитване за парола и след това за промяна на парола. Когато стартирам програмата си, ме питат за паролата, но уви, нямам искане за промяна на парола и вътре в кода нямам индикация, че ще има дори такава нужда. Къде е проблема?

PAM отстраняването на грешки ми показва само това:

Mar 25 11:27:33 S-78 pam: pam_unix(su:auth): authentication failure; logname=greg uid=502 euid=502 tty=/dev/pts/4 ruser=greg rhost=SIR-78  user=tg

Резултатът от програмата, показана по-долу, е следният:

-bash-3.2$ ./pam tg
Password:
pam_authenticate = 7
pam_acct_mgmt = 0
Sorry - pam_err = 17

Ето част от малко модифициран код:

pam_start("su", user, &pamc, &pamh);
/* set some items */
gethostname(hostname, sizeof(hostname));
if ((pam_err = pam_set_item(pamh, PAM_RHOST, hostname)) != PAM_SUCCESS)
   goto pamerr;
user = getlogin();
if ((pam_err = pam_set_item(pamh, PAM_RUSER, user)) != PAM_SUCCESS)
   goto pamerr;
tty = ttyname(STDERR_FILENO);
if ((pam_err = pam_set_item(pamh, PAM_TTY, tty)) != PAM_SUCCESS)
   goto pamerr;
/* authenticate the applicant */
if ((pam_err = pam_authenticate(pamh, 0)) != PAM_SUCCESS)
{
   printf( "pam_authenticate = %d\n", ( int )pam_err ) ; /* returns error 7 - PAM_AUTH_ERR */
   pam_err = pam_acct_mgmt(pamh, 0) ;
   printf( "pam_acct_mgmt = %d\n", ( int )pam_err ) ; /* returns no error! */
}
/* establish the requested credentials */
if ((pam_err = pam_setcred(pamh, PAM_ESTABLISH_CRED)) != PAM_SUCCESS) /* returns error 17 - PAM_CRED_ERR */
   goto pamerr;

Програмата по-горе използва функция за разговор, копирана от тук: http://www.freebsd.org/doc/en/articles/pam/article.html#pam-sample-conv

Използвал съм също misc_conv, деклариран в security/pam_misc.h и наличен в -lpam_misc, но получих същия резултат - няма заявка за промяна на парола или няма индикация, че такава ще е необходима.

Някаква идея как мога да се справя? Ако премахна функцията за разговор, получавам същите грешки, с изключение на липсата на подкана за въвеждане на парола.


person Grzegorz    schedule 25.03.2014    source източник


Отговори (1)


Имах дълъг ден в четене на десетки страници и извършване на тонове експерименти. Надявам се това разследване да помогне и на някой друг освен мен.

Проблемът, който имах, беше, че изпълнявах PAM приложение като не-суперпотребител и програмата ми имаше обичайни атрибути за разрешение.

Имаше две промени, които трябваше да направя, за да премина през промяната на паролата. И двете промени бяха наред:

  • Трябваше да стана root ИЛИ...
  • Трябваше да вляза като root и след това да стартирам chmod +s pam

От този момент успях да поискам промяна на изтекла парола:

-bash-3.2$ chage -d 0 tg
-bash-3.2$ ./pam tg
Password:
Authenticated ok
You are required to change your password immediately (root enforced)
PAM_NEW_AUTHTOK_REQD
Changing password for tg
(current) UNIX password:
New UNIX password:
Retype new UNIX password:

Едно допълнително нещо, което трябваше да променя в случай, че извиквам програмата си като root, е замяната на "su" на "system-auth", тъй като root може да su без парола.

person Grzegorz    schedule 26.03.2014