PAM从入门到精通(十二)

接前一篇文章:PAM从入门到精通(十一)

本文参考:

《The Linux-PAM Application Developers' Guide》

先再来重温一下PAM系统架构:

更加形象的形式:

五、主要函数详解

10. pam_chauthtok

概述:

更新身份验证令牌。

函数声明:

#include <security/pam_appl.h>

int pam_chauthtok (pamh , flags);

pam_handle_t *pamh;

int flags;

详细描述:

pam_chauthtok函数用于更改给定用户的身份验证令牌(如与句柄pamh关联的状态所示)。

参数说明:

  • pam_handle_t *pamh

pamh参数是通过先前调用pam_start()获得的身份验证句柄。

  • int flags

flags参数是以下值中的零或更多的二进制或:

PAM_SILENT

不发出任何消息。

PAM_CHANGE_EXPIRED_AUTHTOK

此参数向模块指示,用户的身份验证令牌(密码)只有在过期时才应更改。如果未传递此参数,则应用程序要求更改所有身份验证令牌。

返回值:

  • PAM_AUTHTOK_ERR:模块无法获取新的身份验证令牌。
  • PAM_AUTHTOK_RECOVERY_ERR:模块无法获取旧的身份验证令牌。
  • PAM_AUTHTOK_LOCK_BUSY:一个或多个模块无法更改身份验证令牌,因为它当前已锁定。
  • PAM_AUTHTOK_DISABLE_AGING:至少有一个模块的身份验证令牌老化已被禁用。
  • PAM_PERM_DENIED:权限被拒绝。
  • PAM_SUCCESS:身份验证令牌已成功更新。
  • PAM_TRY_AGAIN:并非所有模块都可以更新身份验证令牌。在这种情况下,用户的身份验证令牌都不会被更新。
  • PAM_USER_UNKNOWN:密码服务未知的用户。

实例:

实例1. 一般性代码

cpp 复制代码
    /*  通过了密码认证之后再调用帐号管理API,检查用户帐号是否已经过期 */
    if ((status = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS)
    {
        if (status == PAM_AUTHTOK_EXPIRED)
        {
            status = pam_chauthtok(pamh, 0);  /* 过期则要求用户更改密码 */
            if (status != PAM_SUCCESS)
                exit(1);
        }
    }

实例2. SDDM中的代码

参见SDDM包源码目录src/helper/backend/PamHandle.cpp中的PamHandle::acctMgmt函数。

代码如下:

cpp 复制代码
    bool PamHandle::chAuthTok(int flags) {
        m_result = pam_chauthtok(m_handle, flags | m_silent);
        if (m_result != PAM_SUCCESS) {
            qWarning() << "[PAM] chAuthTok:" << pam_strerror(m_handle, m_result);
        }
        return m_result == PAM_SUCCESS;
    }

更多函数请看后续文章。

相关推荐
ManageEngine卓豪7 个月前
如何监控特权帐户,保护敏感数据
pam·敏感数据保护·特权账户监控
ManageEngine卓豪1 年前
适用于 Linux 和 Unix 的特权访问管理
linux·unix·pam·特权访问管理
岬淢箫声1 年前
如何通过PAM禁止部分用户登录
linux·ubuntu·centos·ssh·pam·sssd
ManageEngine卓豪1 年前
零信任特权访问管理
零信任·pam·特权访问·特权访问管理
蓝天居士1 年前
PAM从入门到精通(十九)
pam·linux安全
蓝天居士1 年前
PAM从入门到精通(十六)
pam·linux安全
蓝天居士1 年前
PAM从入门到精通(十五)
pam·linux安全
蓝天居士1 年前
PAM从入门到精通(十)
pam·linux安全
蓝天居士1 年前
PAM从入门到精通(七)
pam·linux安全