【问题标题】:PAM - What to do when password is required to be changed?PAM - 需要更改密码时该怎么办?
【发布时间】:2014-03-25 15:37:32
【问题描述】:

我在网上找到了一段代码,似乎是一个很好的例子——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

我还使用了在security/pam_misc.h 中声明的misc_conv,并在-lpam_misc 中可用,但我得到了相同的结果 - 没有要求更改密码或没有迹象表明需要更改密码。

知道我该如何解决吗? 如果我删除对话功能,我会得到同样的错误,除了没有提示输入密码。

【问题讨论】:

    标签: pam rhel5


    【解决方案1】:

    我花了一整天的时间阅读了几十页,做了大量的实验。我希望这次调查也能帮助到我以外的其他人。

    我遇到的问题是我以非超级用户身份运行 PAM 应用程序,而我的程序具有通常的权限属性。

    为了完成密码更改,我必须进行两项更改。两个更改都可以:

    • 我必须成为根 OR...
    • 我必须以 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2012-03-07
      相关资源
      最近更新 更多