Linux-PAM模块如何具体应用于各种认证场景?
摘要:明月不知君已去,夜深还照读书窗。 导航 壹 - PAM 简介 认证流程 文件配置 贰 - 参考查询 叁 - 模块介绍 pam_nologin.so、pam_rootok.so、pam_wheel.so【特权用户组】 pam_access.
明月不知君已去,夜深还照读书窗。
导航
壹 - PAM 简介
认证流程
文件配置
贰 - 参考查询
叁 - 模块介绍
pam_nologin.so、pam_rootok.so、pam_wheel.so【特权用户/组】
pam_access.so、pam_listfile.so、pam_time.so、pam_limits.so【访问控制】
pam_motd.so、pam_issue.so、pam_echo.so【消息提醒】
pam_faildelay.so、pam_faillock【登录安全】
pam_pwquality.so、pam_pwhistory.so【密码安全】
pam_permit.so、pam_deny.so、pam_env.so、pam_exec.so、pam_userdb.so【杂七杂八】
肆 - 杂项
壹 - PAM 简介
PAM(可插拔认证模块)是 Linux/Unix 系统中的一个 认证框架,它为各种需要身份认证的应用程序提供了一种统一且灵活的认证方式,让调用者不必大费周章地更改自己程序的代码 只需修改相应的 PAM 配置文件便可实现程序所需的各种身份验证需求。因此,了解它的认证流程以及配置文件的修改规则显得极为重要。
认证流程
在 PAM 的认证流程中,主要有 3+1 个阶段,分别是:auth(身份验证)、account(账户管理)、session(会话管理)、password(密码管理)。
各阶段的功能作用如下表:
类别
主要作用
触发时机
典型任务
auth
验证身份凭据
登录初期
检查密码、多因素认证
account
检查账户状态
身份确认后
是否过期、时间限制
session
管理会话过程
登录/退出时
挂载目录、记录日志
password
管理密码变更
改密码时
检查复杂度、更新数据库
各阶段的流程顺序如下图:
文件配置
每个调用 PAM 认证的应用程序都会在 /etc/pam.d/ 目录下对应着一个相应名称命名的 PAM 配置文件,这些配置文件中的描述规则都是以 type control module-path module-arguments 这样的格式书写着。其中,
type(验证类别):auth、acconut、session、password。【对应着 PAM 认证的四个阶段】
control(流程控制):required、requisite、sufficient、optional。【控制着每一行的规则在成功与否之后的下一步动作是继续还是返回】
module-path(模块路径):默认是 /usr/lib/x86_64-linux-gnu/security/*.so 目录下各种已安装模块的名称。
module-arguments(模块参数):每个模块所支持的功能各有不同,所以各自支持的参数及用法自然也是大同小异。
注意:一个配置文件中通常都会存在着多行相同验证类别(如 auth)的规则,以及包含另外一个 PAM 配置文件规则(如 common-auth 或 system-auth)的情况,而且各规则之间的配置顺序可能并不是严格按照 auth -> acconut -> session -> password 这样的顺序进行,那么 PAM 系统在进行身份验证流程的时候是如何去对这些配置文件中的规则进行匹配的呢?
其实,它是依据验证类别来看的。例如,当进行 ssh 认证的时候,首先进行的便是 auth 阶段,那么这时候 PAM 系统便会将 /etc/pam.d/sshd 文件中有关 auth 以及包含文件中的 auth 规则全部按照先后顺序摘出来,然后再逐一执行这些规则。当 auth 阶段的流程结束且用户身份验证通过时,便会进入到下一个阶段(account),下一阶段的流程依旧如 auth 那样。最终,直到流程全部都走完,本次的 PAM 验证也就结束了。【当然,如果规则匹配在中途提前就结束了,那么也就不需要将流程全部都走完便可以结束本次的 PAM 验证了。】
贰 - 参考查询
了解了 PAM 的工作流程,接下来就需要对其在操作系统中的文件分布情况进行一个摸底。以下以 kali 系统为例:
/etc/pam.d/:调用 PAM 的第三方程序的配置文件聚集地。
/etc/security:部分 PAM 模块的参数配置文件(亦或是规则文件)。
/usr/lib/x86_64-linux-gnu/security/:PAM 模块默认的位置。
PAM 系统主要的文件就是上面这些了,此外还可借助一些命令进行扩展延伸。
