2014-03-25 8 views
1

나는 좋은 예가 될 듯 인터넷에서 코드 조각을 발견했다. su - user (루트가 아닌 계정에서) 암호를 묻는 메시지가 나타나면 암호를 변경해야합니다. 프로그램을 실행할 때 비밀번호를 묻는 메시지가 표시되지만 비밀번호 변경 요청이 없으며 코드 안에는 그러한 필요성조차 없다는 표시가 없습니다. 어디에 문제가 있습니까?PAM - 암호를 변경해야 할 때 수행 할 작업은 무엇입니까? <a href="http://www.freebsd.org/doc/en/articles/pam/article.html#pam-sample-appl" rel="nofollow">http://www.freebsd.org/doc/en/articles/pam/article.html#pam-sample-appl</a></p> <p>이 Unfortunatelly 제대로 첫 로그인시 비밀번호 변경을 필요로 계정 처리하지 않습니다 -

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

또한 security/pam_misc.h에 선언 된 misc_conv을 사용했지만 -lpam_misc에서 사용할 수 있지만 동일한 결과가 나타납니다. 비밀번호를 변경하거나 요청이 필요하지 않습니다.

어떻게하면 해결할 수 있을까요? 대화 기능을 제거하면 암호를 입력하라는 메시지를 제외하고 동일한 오류가 발생합니다.

답변

1

나는 수십 페이지를 읽고 긴 톤의 실험을 해왔다. 이 조사가 나보다 다른 사람을 도울 수 있기를 바랍니다.

문제는 필자가 PAM 응용 프로그램을 슈퍼 유저가 아니며 프로그램에 일반적인 권한 속성이 있다는 것입니다.

암호 변경을 수행하기 위해 수행해야했던 두 가지 변경 사항이있었습니다. 두 변화는 괜찮다고 :

  • 내가 루트로 로그인 한
  • ... 루트 OR되고, 그럼 내가 할 수 있었다이 순간부터는 chmod +의 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를 할 수 루트로, 루트는 "SU"에서 "시스템 인증을"대체 나는 내 프로그램을 호출 한 경우 변경했다 한 추가 것.