2014-03-25 78 views
1

我發現,似乎是一個很好的例子,在互聯網上的一段代碼 - http://www.freebsd.org/doc/en/articles/pam/article.html#pam-sample-applPAM - 需要更改密碼時該怎麼辦?

可惜的是它不妥善處理需要在首次登錄密碼變更賬戶。 當我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,並在-lpam_misc中可用,但我得到了相同的結果 - 沒有請求更改密碼或沒有指示,這將需要。

任何想法我怎麼解決它? 如果我刪除對話功能,我會得到相同的錯誤,除非沒有提示輸入密碼。

回答

1

我有一整天讀數十頁,並做了大量的實驗。我希望這次調查也能幫助別人。

我遇到的問題是我以非超級用戶身份運行PAM應用程序,並且我的程序具有通常的權限屬性。

爲了通過密碼更改,我必須做兩個更改。這兩種變化都沒事:

  • 我不得不成爲根或...
  • 我不得不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: 

,我不得不的情況下,我打電話給我的程序作爲根正取代「蘇」到「系統身份驗證」,以改變,因爲根可以通過su沒有密碼一件其他的東西。

相關問題