明月不知君已去,夜深还照读书窗。
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 系统主要的文件就是上面这些了,此外还可借助一些命令进行扩展延伸。如,
man pam_
:查看 PAM 各模块的功能、类型及用法示例。
apt search libpam-
:搜索其它 PAM 模块。
dpkg -L libpam-modules
:查看 PAM 基础安装包所释放的文件。
注意:各模块所支持的 功能、类型 并不一定适用于所有应用,因此,各应用在使用之前需依据参考示例去不断实验,以确定该模块是否适合自己。此外,模块的有效与否,有时也与配置项的 前后位置 以及 流程控制指令(required 等)有关,必要时需要适当调整一下。
功能:阻止非 root 用户登录。
类型:auth、account
account required pam_nologin.so
#/etc/pam.d/sshd 启用此模块之后,若系统中存在 /etc/nologin 文件,则非 root 用户便无法登录系统。在登录被拒绝之后,还会给对方提示 /etc/nologin 文件中的内容;当该文件不存在时,非 root 用户便可以正常登录。
功能:检测当前用户是否是 root 用户。【注:所以它通常用于用户已登录系统之后的授权再认证场景,对于 sshd 那样的登录场景并不适用。】
类型:auth、account、password
auth sufficient pam_rootok.so
#/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
功能:限制用户在知晓其它用户凭证之后可以随意切换身份。
类型:auth、account
auth required pam_wheel.so
#/etc/pam.d/su 启用此模块之后,只有加入 wheel 组的用户才能使用 su 切换用户;而在未启用之前,任何用户都可以使用 su 切换。
auth sufficient pam_wheel.so trust
#/etc/pam.d/su 启用此模块之后,加入 wheel 组的用户可以免密使用 su 切换到其它用户。
auth sufficient pam_wheel.so trust group = test
#/etc/pam.d/su 启用此模块之后,加入 test 组的成员可以免密使用 su 切换用户身份。
auth sufficient pam_wheel.so deny group = test
#/etc/pam.d/su 启用此模块之后,禁止加入 test 组的用户使用 su 切换用户身份。
功能:基于 用户、组、来源主机、终端 等条件,来限制用户是否可以访问系统。
类型:auth、account、session、password
account required pam_access.so
#/etc/pam.d/sshd 启用此模块之后,需配合规则文件 /etc/security/access.conf 来灵活限制哪些用户才能登录或禁止登录系统。
account required pam_access.so
#/etc/pam.d/su 启用此模块之后,可以限制哪些用户使用 su,哪些用户禁止使用 su。
以下便是规则文件 /etc/security/access.conf
的示例展示。(1)其规则设置的方式和交换机上的 ACL 非常相似。(2)比 sshd 配置文件中的 DenyUsers 指令更加的灵活。
#只允许 ubuntu 用户登录,其它用户均阻止登录。
+ : ubuntu : ALL
- : ALL : ALL
功能:基于一个文件名单,来限制用户是否可以访问系统。【注:效果类似黑/白名单】
类型:auth、account、session、password
auth required pam_listfile.so onerr=succeed item=user sense=deny file=/tmp/userlist.txt
#/etc/pam.d/sshd 启用此模块之后,相当于为 sshd 服务制定了一个登录用户黑名单,只要在名单上的用户便无法登录本系统,名单之外正常登录。 注意:apply 参数是配合 item = [tty|rhost|shell] 使用的,多数时候用不到。
功能:基于时间范围,来限制用户是否可以访问系统。
类型:account
account requisite pam_time.so
#/etc/pam.d/sshd 启用此模块之后,需配合规则文件 /etc/security/time.conf 来灵活限制哪些用户才能登录或禁止登录系统。
以下便是规则文件 /etc/security/time.conf
的示例展示。
#控制 test 用户只有在每天的 12 点到 24 点之间才能使用 ssh 登录或使用 su 切换到 test 身份。
su|sshd;*; test; Al1200-2359
功能:操作系统资源限制。支持限制的资源有:进程数量、文件大小、打开文件数、同时登录数、所有用户最大登录数等等
类型:session
session required pam_limits.so
#/etc/pam.d/sshd 启用此模块之后,需配合文件 /etc/security/limits.conf 来限制系统中各种资源的使用情况。
以下便是文件 /etc/security/limits.conf
的示例展示。
#限制 test 用户的同时在线会话不超过 4 个
test soft maxlogins 4
#限制系统中所有的用户的会话总数不超过 10 个
* hard maxsyslogins 10
soft 和 hard 的区别是:soft 类型的限制,可以通过 ulimit 命令去动态调整,而 hard 类型的限制则是硬性的,无法被手动调高。如果用户不懂的使用 ulimit 调整的话,soft 和 hard 其实效果是一样的。
功能:以命令行的方式 登录系统之后 的消息提醒。
类型:session
auth sufficient pam_rootok.so
#/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
0
功能:以命令行的方式 登录系统之前 的消息提醒。
类型:auth
auth sufficient pam_rootok.so
#/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
1
注意:此模块似乎仅对本地控制台登录文件 /etc/pam.d/login
有效,在 /etc/pam.d/sshd
中使用时并未能生效。而要想让 sshd 服务也达到同样的效果,似乎只能借助 sshd 内置的 Banner 指令来实现了。
功能:各认证阶段均可使用的消息提醒。【注:但似乎只是对 password 类型的使用较为友好,在其它类型上效果似乎不佳。】
类型:auth、account、session、password
auth sufficient pam_rootok.so
#/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
2
功能:登录失败时延时返回失败消息。
类型:auth
auth sufficient pam_rootok.so
#/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
3
功能:多次登录失败时,暂时锁住账户。
类型:auth、account
auth sufficient pam_rootok.so
#/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
4
以下便是参数文件 /etc/security/faillock.conf
的示例展示。
auth sufficient pam_rootok.so
#/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
5
功能:修改密码时,对新密码按照规范要求进行检查。
类型:password
auth sufficient pam_rootok.so
#/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
6
功能:记录并检查用户历史密码,防止用户在修改密码时重复使用旧密码。
类型:password
auth sufficient pam_rootok.so
#/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
7
功能:无条件允许。
类型:auth、account、session、password
auth sufficient pam_rootok.so
#/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
8
功能:无条件拒绝。
类型:auth、account、session、password
auth sufficient pam_rootok.so
#/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
9
功能:用户环境变量的多样性加载。
类型:auth、session
auth required pam_wheel.so
#/etc/pam.d/su 启用此模块之后,只有加入 wheel 组的用户才能使用 su 切换用户;而在未启用之前,任何用户都可以使用 su 切换。
auth sufficient pam_wheel.so trust
#/etc/pam.d/su 启用此模块之后,加入 wheel 组的用户可以免密使用 su 切换到其它用户。
auth sufficient pam_wheel.so trust group = test
#/etc/pam.d/su 启用此模块之后,加入 test 组的成员可以免密使用 su 切换用户身份。
auth sufficient pam_wheel.so deny group = test
#/etc/pam.d/su 启用此模块之后,禁止加入 test 组的用户使用 su 切换用户身份。
0
注:该模块可同时存在多行,也就意味着用户加载环境变量的位置又变多了一些。
功能:在认证或会话阶段执行外部命令或脚本,并根据脚本返回值决定是否允许继续。
类型:auth、account、session、password
auth required pam_wheel.so
#/etc/pam.d/su 启用此模块之后,只有加入 wheel 组的用户才能使用 su 切换用户;而在未启用之前,任何用户都可以使用 su 切换。
auth sufficient pam_wheel.so trust
#/etc/pam.d/su 启用此模块之后,加入 wheel 组的用户可以免密使用 su 切换到其它用户。
auth sufficient pam_wheel.so trust group = test
#/etc/pam.d/su 启用此模块之后,加入 test 组的成员可以免密使用 su 切换用户身份。
auth sufficient pam_wheel.so deny group = test
#/etc/pam.d/su 启用此模块之后,禁止加入 test 组的用户使用 su 切换用户身份。
1
功能:让 PAM 可以使用一个简单的数据库文件来验证用户名和密码,而不是依赖 /etc/passwd
或 /etc/shadow
。【注:这类用户也被叫做虚拟用户,这对于 FTP 这类的服务来说非常有用。】
类型:auth、account
auth required pam_wheel.so
#/etc/pam.d/su 启用此模块之后,只有加入 wheel 组的用户才能使用 su 切换用户;而在未启用之前,任何用户都可以使用 su 切换。
auth sufficient pam_wheel.so trust
#/etc/pam.d/su 启用此模块之后,加入 wheel 组的用户可以免密使用 su 切换到其它用户。
auth sufficient pam_wheel.so trust group = test
#/etc/pam.d/su 启用此模块之后,加入 test 组的成员可以免密使用 su 切换用户身份。
auth sufficient pam_wheel.so deny group = test
#/etc/pam.d/su 启用此模块之后,禁止加入 test 组的用户使用 su 切换用户身份。
2