Linux-PAM 允许应用程序将身份验证策略委托给由管理员控制的模块。应用程序拥有用户交互和权限边界;PAM 拥有事务句柄,加载已配置的栈,并组合模块结果。因此,应用程序可以使用本地密码、智能卡、目录服务、多因素身份验证或账户限制,而无需内嵌这些机制。
事务角色 #
PAM 事务有五个角色:
- 应用程序启动并结束事务;
- 服务是提供给
pam_start的策略名称,通常为login、sshd或sudo; - 管理组选择操作:
auth、account、session或password; - 模块是实现一个或多个管理组入口点的共享对象;
- 对话函数允许模块通过应用程序请求提示、信息消息和响应。
应用程序从 pam_start(service, user, &conversation, &pamh) 开始。pam_handle_t 是不透明的,属于一个事务;另一个并发事务应创建另一个句柄。典型的授权路径调用 pam_authenticate,可选调用 pam_setcred,然后调用 pam_acct_mgmt;授予会话前调用 pam_open_session,拆除会话时调用 pam_close_session。密码更改使用 pam_chauthtok。无论采用哪条路径,应用程序都要调用 pam_end(pamh, last_status),该调用会使句柄失效并运行已注册的清理回调。
pam_handle_t *pamh = NULL;
int status = pam_start("example", user, &conversation, &pamh);
if (status == PAM_SUCCESS)
status = pam_authenticate(pamh, 0);
if (status == PAM_SUCCESS)
status = pam_acct_mgmt(pamh, 0);
if (pamh != NULL)
pam_end(pamh, status);auth 建立身份,并可能建立凭据。account 检查当前是否允许访问,包括过期和策略限制。session 执行审计设置、限制或挂载等生命周期工作。password 更新身份验证令牌。没有相应的账户和会话调用,身份验证成功并不是完整的登录流程。
策略文件和栈 #
当目录存在时,Linux-PAM 读取 /etc/pam.d/SERVICE;否则使用 /etc/pam.conf。/etc/pam.d 策略会覆盖 /usr/lib/pam.d 中同名的供应商文件。pam.conf 规则包含服务字段,而 pam.d 下的文件从文件名获得服务名称:
service type control module-path arguments
example auth required pam_unix.so try_first_pass四种简单控制定义结果流:
required记录失败,但继续评估栈的其余部分;requisite立即失败;- 当之前没有必需模块失败时,
sufficient成功会立即返回,而其失败会被忽略; - 只有当它是栈中唯一有效模块时,
optional才有影响。
扩展控制(例如 [success=1 default=bad])将特定的 PAM_* 返回值映射到包括 ignore、bad、die、ok、done、reset 和数字跳转在内的操作。它们不是装饰:更改跳转或默认操作可能绕过某个因素,或将服务中断变成授权结果。
include 从另一个策略文件插入所请求管理类型的规则。substack 也会评估另一个文件,但 done、die 和跳转会被限制在该子栈内。模块参数由模块决定;应保留引号,不要假设一个模块接受的选项对另一个模块有意义。
安全编写模块 #
模块实现特定于管理组的符号,例如 pam_sm_authenticate、pam_sm_acct_mgmt、pam_sm_open_session 和 pam_sm_chauthtok。使用 pam_get_user 获取用户,使用 pam_get_authtok 获取身份验证令牌,而不是创建竞争性的提示。通过 pam_set_data 存储事务范围状态,提供清理回调,并通过 pam_syslog 报告诊断信息,但不要记录密码、令牌或源自秘密的数据。
返回表示失败的文档规定的 PAM_* 结果。不要将目录不可用、密码无效和内部错误错误地合并为成功。模块代码在安全敏感且有时具有特权的进程中执行,因此应验证每个外部输入,避免不安全的环境假设,使用有界内存处理,并使清理操作幂等。
先使用专用服务名称和账户测试策略更改。保留由已知良好策略认证的现有 root 控制台或恢复路径,安装前验证语法,并测试成功路径和每条预期失败路径。没有恢复路径时编辑远程管理会话使用的策略,可能会锁定所有管理员。
Linux-PAM 应用程序手册,尤其是 pam_start(3)、pam_end(3) 和 pam.conf(5),是 Linux-PAM 行为的权威接口文档。
评论
在 GitHub 上阅读或评论(发表评论需要登录)