魁睥
2025-8-18 23:40:12
明月不知君已去,夜深还照读书窗。
导航
- 壹 - 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 系统主要的文件就是上面这些了,此外还可借助一些命令进行扩展延伸。如,
man pam_:查看 PAM 各模块的功能、类型及用法示例。
apt search libpam-:搜索其它 PAM 模块。
dpkg -L libpam-modules:查看 PAM 基础安装包所释放的文件。
叁 - 模块介绍
注意:各模块所支持的 功能、类型 并不一定适用于所有应用,因此,各应用在使用之前需依据参考示例去不断实验,以确定该模块是否适合自己。此外,模块的有效与否,有时也与配置项的 前后位置 以及 流程控制指令(required 等)有关,必要时需要适当调整一下。
特权用户/组
pam_nologin.so
功能:阻止非 root 用户登录。
类型:auth、account- account required pam_nologin.so
- #/etc/pam.d/sshd 启用此模块之后,若系统中存在 /etc/nologin 文件,则非 root 用户便无法登录系统。在登录被拒绝之后,还会给对方提示 /etc/nologin 文件中的内容;当该文件不存在时,非 root 用户便可以正常登录。
复制代码 pam_rootok.so
功能:检测当前用户是否是 root 用户。【注:所以它通常用于用户已登录系统之后的授权再认证场景,对于 sshd 那样的登录场景并不适用。】
类型:auth、account、password- auth sufficient pam_rootok.so
- #/etc/pam.d/su 启用此模块之后,root 用户可以使用 su 免密切换到其它用户。
复制代码 pam_wheel.so
功能:限制用户在知晓其它用户凭证之后可以随意切换身份。
类型: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 切换用户身份。
复制代码 访问控制
pam_access.so
功能:基于 用户、组、来源主机、终端 等条件,来限制用户是否可以访问系统。
类型: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
复制代码 pam_listfile.so
功能:基于一个文件名单,来限制用户是否可以访问系统。【注:效果类似黑/白名单】
类型: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] 使用的,多数时候用不到。
复制代码 pam_time.so
功能:基于时间范围,来限制用户是否可以访问系统。
类型: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
复制代码 pam_limits.so
功能:操作系统资源限制。支持限制的资源有:进程数量、文件大小、打开文件数、同时登录数、所有用户最大登录数等等
类型: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 其实效果是一样的。
消息提醒
pam_motd.so
功能:以命令行的方式 登录系统之后 的消息提醒。
类型:session- session optional pam_motd.so motd=/run/motd.dynamic
- #/etc/pam.d/sshd 启用此模块之后,当用户每次登上系统的时候,便会显示指定文件中的静态消息。由于 /run/motd.dynamic 是由 /etc/update-motd.d/*.sh 中的脚本生成的动态内容,因此也可以间接地理解为每次登录所显示的消息是动态消息。
复制代码 pam_issue.so
功能:以命令行的方式 登录系统之前 的消息提醒。
类型:auth- auth required pam_issue.so issue=/etc/issue
- #/etc/pam.d/login 启用此模块之后,当用户在控制台以非图形化的方式登录之前,便会展现 /etc/issue 文件中描述的登录提示信息。
复制代码 注意:此模块似乎仅对本地控制台登录文件 /etc/pam.d/login 有效,在 /etc/pam.d/sshd 中使用时并未能生效。而要想让 sshd 服务也达到同样的效果,似乎只能借助 sshd 内置的 Banner 指令来实现了。
pam_echo.so
功能:各认证阶段均可使用的消息提醒。【注:但似乎只是对 password 类型的使用较为友好,在其它类型上效果似乎不佳。】
类型:auth、account、session、password- password optional pam_echo.so file=/path/test.txt
- #/etc/pam.d/passwd 启用此模块之后,当用户使用 passwd 修改密码时,便会弹出提示信息。
复制代码 登录安全
pam_faildelay.so
功能:登录失败时延时返回失败消息。
类型:auth- auth optional pam_faildelay.so delay=3000000
- #/etc/pam.d/sshd 启用此模块之后,当用户登录输入错误的账户密码时,会延时 3 秒才返回登录失败的消息。若账户密码正确则直接登录无延时。
复制代码 pam_faillock.so
功能:多次登录失败时,暂时锁住账户。
类型:auth、account- #@include common-auth
- auth required pam_faillock.so preauth
- auth sufficient pam_unix.so
- auth [default=die] pam_faillock.so authfail
- #/etc/pam.d/sshd 启用此模块之后,需配合文件 /etc/security/faillock.conf 来限制用户的登录。【注意:该模块的配置较为特殊,需要 2 条指令配合使用。】
复制代码 以下便是参数文件 /etc/security/faillock.conf 的示例展示。- #非 root 用户在 30 秒内登录失败 4 次之后将会被锁住,直到 30 秒之后此账户才会被解锁。【若想提前解锁用户,需以 root 身份在后台执行 faillock --user testuser --reset 解锁】
- deny = 4
- fail_interval = 30
- unlock_time = 30
- local_users_only
复制代码 密码安全
pam_pwquality.so
功能:修改密码时,对新密码按照规范要求进行检查。
类型:password- password required pam_pwquality.so
- #/etc/pam.d/passwd 启用此模块之后,可配合此模块的参数文件 /etc/security/pwquality.conf 加强新密码强度的管控。通过此参数文件,管理员可规范的密码要求有:密码长度、字典检查、用户名包含等功能。
复制代码 pam_pwhistory.so
功能:记录并检查用户历史密码,防止用户在修改密码时重复使用旧密码。
类型:password- password required pam_pwhistory.so
- #/etc/pam.d/passwd 启用此模块之后,当用户修改密码时,该模块会先检查新密码是否已存在 /etc/security/opasswd 文件中,若不存在且密码质量也还行便可修改成功,并将此新密码记录在 opasswd 文件之中。
复制代码 杂七杂八
pam_permit.so
功能:无条件允许。
类型:auth、account、session、password- auth sufficient pam_permit.so
- #/etc/pam.d/sshd 在首行启用此模块之后,便可以让所有用户以任意密码登录系统。
复制代码 pam_deny.so
功能:无条件拒绝。
类型:auth、account、session、password- auth requisite pam_deny.so
- #/etc/pam.d/sshd 在首行启用此模块之后,便可以让所有用户无法登录系统。
复制代码 pam_env.so
功能:用户环境变量的多样性加载。
类型:auth、session- session required pam_env.so readenv=1
- #/etc/pam.d/sshd 在启用此模块之后,便可以让所有用户有了额外的路径位置可以加载全局变量,分别是 /etc/security/pam_env.conf 和 /etc/environment。
复制代码 注:该模块可同时存在多行,也就意味着用户加载环境变量的位置又变多了一些。
pam_exec.so
功能:在认证或会话阶段执行外部命令或脚本,并根据脚本返回值决定是否允许继续。
类型:auth、account、session、password- auth optional pam_exec.so seteuid log=/tmp/log.txt /bin/id
- #/etc/pam.d/sshd 在启用此模块之后,只要进入认证阶段不管用户认证成功与否,后台也会自动执行此命令,并将命令执行时间和命令输出结果追加在 log 文件中。
复制代码 pam_userdb.so
功能:让 PAM 可以使用一个简单的数据库文件来验证用户名和密码,而不是依赖 /etc/passwd 或 /etc/shadow。【注:这类用户也被叫做虚拟用户,这对于 FTP 这类的服务来说非常有用。】
类型:auth、account- auth sufficient pam_userdb.so icase db=/etc/dbtest
- #/etc/pam.d/vsftpd 在启用此模块之后,便会使用 /etc/dbtest 文件作为账户密码验证的根据。
复制代码 肆 - 杂项
- PAM 仓库:https://github.com/linux-pam/linux-pam
- 有趣的 PAM 利用:仓库一、仓库二。
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |
|
|
|
相关推荐
|
|