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;
    }

更多函数请看后续文章。

相关推荐
派拉软件7 天前
2025金融新规施行!AI+PAM打造智能合规知识库
人工智能·金融·pam·金融合规知识库
ManageEngine卓豪1 年前
如何监控特权帐户,保护敏感数据
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安全