60、深入理解 Linux PAM 认证机制及管理

深入理解 Linux PAM 认证机制及管理

1. PAM 简介

PAM(Pluggable Authentication Modules)简化了 Linux 系统和应用程序的认证管理过程。认证是确定主体(用户或进程)身份的过程,PAM 提供了一种集中式的认证方法。

具备 PAM 感知能力的应用程序可以使用 PAM 进行认证,当需要更改认证设置时,无需重新编写和编译应用程序,只需修改 PAM 配置文件即可,这使得认证管理更加集中和简化。

要检查某个 Linux 应用程序或实用工具是否具备 PAM 感知能力,可以查看它是否使用 PAM 库 libpam.so 进行编译。例如,使用以下命令检查 crontab 应用程序:

# ldd /usr/bin/crontab | grep pam
libpam.so.0 => /lib64/libpam.so.0 (0x00007fbee19ce000)

使用 PAM 的好处包括:
- 从管理员角度看,简化和集中了认证管理。
- 简化了应用程序开发,开发者可以使用已文档化的 PAM 库编写应用程序,而无需自己编写认证例程。
- 认证具有灵活性:
- 可以根据传统标准(如身份识别)允许或拒绝资源访问。
- 可以根据额外标准(如时间限制)允许或拒绝访问。
- 可以设置主体限制,如资源使用限制。

2. PAM 认证过程

当主体(用户或进程)请求访问具备 PAM 感知能力的应用程序或实用工具时,主要通过以下两个组件完成认证过程:
- 具备 PAM 感知能力的应用程序的配置文件。
- 配置文件使用的 PAM 模块。

每个具备 PAM 感知能力的应用程序配置文件是认证过程的核心,它调用特定的 PAM 模块来执行所需的认证。PAM 模块从系统授权数据(如使用轻量级目录访问协议(LDAP)的集中式用户账户)中对主体进行认证。

PAM 使用模块和配置文件确保应用程序正确认证的步骤如下:
1. 主体(用户或进程)请求访问应用程序。
2. 打开并读取应用程序的 PAM 配置文件,该文件包含访问策略,通过认证过程中要使用的所有 PAM 模块列表来设置访问策略,这个 PAM 模块列表称为栈。
3. 按列表顺序调用栈中的 PAM 模块。
4. 每个 PAM 模块返回成功或失败状态。
5. 栈继续按顺序读取,单个返回的失败状态不一定会停止认证过程。
6. 将所有 PAM 模块的状态结果组合成一个整体的认证成功或失败结果。

通常,如果单个 PAM 模块返回失败状态,则会拒绝访问应用程序,但这取决于配置文件的设置。大多数 PAM 配置文件位于 /etc/pam.d 目录,其一般格式为:

context   control flag   PAM module [module options]
3. PAM 上下文

PAM 模块具有提供不同认证服务的标准功能,这些功能可以分为不同的类型,称为上下文,也可以称为模块接口或类型。以下是不同 PAM 上下文及其提供的认证服务描述:
| 上下文 | 服务描述 |
| — | — |
| auth | 提供认证管理服务,如验证账户密码 |
| account | 提供账户验证服务,如时间访问限制 |
| password | 管理账户密码,如密码长度限制 |

4. PAM 控制标志

在 PAM 配置文件中,控制标志用于确定返回给应用程序的整体状态。控制标志分为以下两种:
- 简单关键字:只关注相应 PAM 模块返回的“失败”或“成功”响应。
- 一系列操作:通过文件中列出的一系列操作来处理返回的模块状态。

以下是各种关键字控制标志及其对返回模块状态的响应处理:
| 控制标志 | 响应处理 |
| — | — |
| required | 如果失败,在栈中的其他上下文运行完毕后,向应用程序返回失败状态。例如,当用户输入无效用户名时,可能导致登录失败,但用户可能在输入密码后才被告知失败,隐藏了是错误用户名导致失败的事实。 |
| requisite | 如果失败,立即向应用程序返回失败状态,而不运行栈中的其余部分。使用时需注意在栈中的位置。例如,需要基于密钥的认证,当未提供有效密钥时会立即失败,甚至可能在提示输入用户名/密码之前就失败。 |
| sufficient | 如果失败,忽略模块状态;如果成功,立即向应用程序返回成功状态,而不运行栈中的其余部分。使用时需注意在栈中的位置。 |
| optional | 仅对最终的整体返回状态(成功或失败)有重要作用,可视为决胜因素。当配置文件栈中的其他模块返回的状态既不是明确的失败也不是成功时,使用此可选模块的状态来确定最终状态或打破平局。当栈中的其他模块返回明确的失败或成功路径时,此状态将被忽略。 |
| include | 获取特定 PAM 配置文件栈中的所有返回状态,并将其包含在当前栈的整体返回状态中,就好像命名配置文件的整个栈现在都在当前配置文件中一样。 |
| substack | 与 include 控制标志类似,但某些错误和评估仅影响子栈,而不影响主栈。 |

需要注意的是,PAM 模块返回的状态结果代码不仅仅是“成功”或“失败”,例如,模块可能返回 PAM_ACCT_EXPIRED 状态代码,表示用户账户已过期,这将被视为“失败”。

5. PAM 模块

PAM 模块实际上是一组共享库模块(DLL 文件),存储在 /usr/lib64/security (64 位系统)中。可以使用以下命令查看系统上安装的各种 PAM 模块列表:

sudo find / -name pam*.so

Linux 系统通常已经安装了许多所需的 PAM 模块,如果需要未安装的模块,很可能已经有人编写好了,可以从以下来源查找:
- openwall.com/pam/
- puszcza.gnu.org.ua/software/pam-modules/download.html

6. PAM 系统事件配置文件

除了具备 PAM 感知能力的应用程序及其配置文件外,其他系统事件(如登录 Linux 系统)也使用 PAM,因此这些事件也有相应的配置文件。

以下是 /etc/pam.d 目录的部分文件列表:

# ls -l /etc/pam.d
total 136
-rw-r--r-- 1 root root  250 Feb 20  2018 atd
-rw-r--r-- 1 root root  384 Jan 25  2018 chfn
-rw-r--r-- 1 root root   92 Jan 25  2018 chpasswd
-rw-r--r-- 1 root root  581 Jan 25  2018 chsh
-rw-r--r-- 1 root root 1018 Mar 21  2018 cockpit
...

这些 PAM 系统事件配置文件的操作方式与具备 PAM 感知能力的应用程序配置文件相同,它们具有相同的格式、使用相同的语法并调用 PAM 模块。但是,许多这些文件是符号链接,因此在对其进行更改时需要额外的步骤。

注意 :不正确地修改或删除 PAM 系统事件配置文件可能会导致无法访问自己的系统,因此在修改生产 Linux 服务器之前,请确保在虚拟或测试环境中测试任何更改。

提示 :许多 PAM 配置文件都有相关的手册页,例如,要了解 pam_unix 模块的更多信息,可以在命令行中输入 man pam_unix

7. 管理 PAM

虽然 Linux 系统已经安装了许多具备 PAM 感知能力的应用程序、各种配置文件和 PAM 模块,但仍需要进行一些管理步骤。

7.1 管理具备 PAM 感知能力的应用程序配置文件

应该审查具备 PAM 感知能力的应用程序和实用工具的 PAM 配置文件,以确保其认证过程符合组织的期望。可以结合访问控制矩阵和对 PAM 的理解来审核这些配置文件。

每个具备 PAM 感知能力的应用程序都应该有自己的 PAM 配置文件,该文件定义了该应用程序使用的特定 PAM 模块。如果没有配置文件,可能会为该应用程序创建安全漏洞,此漏洞可能被恶意利用。作为安全预防措施,PAM 提供了“other”配置文件,如果具备 PAM 感知能力的应用程序没有 PAM 配置文件,则默认使用“other”配置文件。

可以使用以下命令验证系统是否存在 /etc/pam.d/other 配置文件:

$ ls /etc/pam.d/other
/etc/pam.d/other

/etc/pam.d/other 配置文件应拒绝所有访问,这在安全方面称为隐式拒绝。在计算机安全访问控制中,隐式拒绝意味着如果某些标准未明确满足,则必须拒绝访问。以下是 /etc/pam.d/other 文件的内容:

$ cat /etc/pam.d/other
# /etc/pam.d/other - specify the PAM fallback behavior
#
# 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

即使有“other”配置文件,如果具备 PAM 感知能力的应用程序没有 PAM 配置文件,也必须创建该文件。同时,应该审查系统上的 PAM “other”配置文件,以确保其强制执行隐式拒绝。

7.2 实施资源限制

管理资源不仅是系统管理任务,也是安全管理任务。设置资源限制有助于避免 Linux 系统上的许多问题,例如,可以通过限制单个用户可以创建的进程数量来避免分叉炸弹。分叉炸弹是指一个进程以递归方式不断生成新进程,直到耗尽系统资源,它可能是恶意的,也可能是由于程序代码开发不当而意外产生的。

PAM 模块 pam-limits 使用特殊的配置文件 /etc/security/limits.conf 来设置这些资源限制。默认情况下,该文件中没有设置资源限制,因此需要审查该文件并设置符合组织安全需求的资源限制。

以下是 /etc/security/limits.conf 文件的部分内容:

$ cat /etc/security/limits.conf
# /etc/security/limits.conf
#
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
#
#Also note that configuration files in /etc/security/limits.d directory,
#which are read in alphabetical order, override the settings in this
#file in case the domain is the same or more specific.
...
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
...
#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4
# End of file

配置文件中的 domain type 项需要进一步解释:
- domain :限制适用于列出的用户或组。如果 domain * ,则适用于所有用户。
- type :硬限制不能被超过,软限制可以暂时超过。

例如,以下设置限制了 faculty 组的用户最多可以启动 50 个进程:

#@faculty        hard    nproc           50

限制设置是针对每次登录的,并且仅在登录会话期间有效。恶意用户可能会多次登录以创建分叉炸弹,因此设置用户账户的最大登录次数也是一个好主意。例如,将用户 johndoe 的最大登录次数设置为 1:

johndoe        hard    maxlogins           1

要覆盖 limits.conf 文件中的任何设置,可以在 /etc/security/limits.d 目录中添加名为 *.conf 的文件,这是一种方便的添加和删除限制的方法,无需直接编辑 limits.conf 文件。

最后,需要确保使用 limits.conf 文件的 PAM 模块 pam_limits 包含在某个 PAM 系统事件配置文件中。可以使用以下命令验证:

$ grep -nr "pam_limits" /etc/pam.d/
/etc/pam.d/systemd-user:10:session     required pam_limits.so
/etc/pam.d/sshd:40:session             required pam_limits.so
/etc/pam.d/runuser:4:session           required pam_limits.so
/etc/pam.d/atd:9:session               required pam_limits.so
/etc/pam.d/cron:20:session             required pam_limits.so
/etc/pam.d/su:52:session               required pam_limits.so
/etc/pam.d/login:87:session            required pam_limits.so
7.3 实施时间限制

PAM 可以使整个 Linux 系统按照“PAM 时间”运行,例如,可以限制在一天中的特定时间访问特定应用程序,或者只允许在指定的工作日登录。

处理这些时间限制的 PAM 配置文件位于 /etc/security 目录,以下是 /etc/security/time.conf 文件的内容:

$ cat /etc/security/time.conf
# this is an example configuration file for the pam_time module. 
Its syntax
# was initially based heavily on that of the shadow package 
(shadow-960129).

#
# the syntax of the lines is as follows:
#
#       services;ttys;users;times
...

建议仔细阅读 time.conf 文件的内容。每个有效条目的格式为 services;ttys;users;times ,字段之间用分号分隔,有效字段值在 time.conf 配置文件中有详细说明。

例如,要允许普通用户仅在工作日(周一至周五)的 7:00 至 19:00 登录终端,可以在 time.conf 文件中添加以下条目:

login; * ; !root ; Wd0700-1900

最后,需要确保使用 time.conf 文件的 PAM 模块包含在某个 PAM 系统事件配置文件中。

通过以上对 PAM 的深入了解和管理,可以提高 Linux 系统的安全性和可靠性。

深入理解 Linux PAM 认证机制及管理

8. PAM 管理操作流程总结

为了更清晰地展示 PAM 管理的操作流程,下面用 mermaid 格式的流程图来呈现:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始]):::startend --> B{检查应用 PAM 配置文件}:::decision
    B -->|存在| C(审查配置文件):::process
    B -->|不存在| D(创建配置文件):::process
    C --> E{是否符合安全需求}:::decision
    D --> E
    E -->|是| F(继续后续管理):::process
    E -->|否| G(修改配置文件):::process
    G --> F
    F --> H{是否需要资源限制}:::decision
    H -->|是| I(设置 limits.conf 文件):::process
    H -->|否| J{是否需要时间限制}:::decision
    I --> K(验证 pam_limits 模块):::process
    K --> J
    J -->|是| L(设置 time.conf 文件):::process
    J -->|否| M([结束]):::startend
    L --> N(确保 PAM 模块包含在系统事件配置文件中):::process
    N --> M

该流程图展示了从检查应用的 PAM 配置文件开始,到根据安全需求进行配置文件的审查、创建或修改,再到考虑是否需要设置资源限制和时间限制,最后确保相应模块包含在系统事件配置文件中的完整操作流程。

9. PAM 常见问题及解决方法

在使用 PAM 过程中,可能会遇到一些常见问题,以下是一些问题及对应的解决方法:
| 问题描述 | 可能原因 | 解决方法 |
| — | — | — |
| 应用程序认证失败 | 配置文件错误、PAM 模块缺失或损坏 | 检查配置文件语法,使用 ls 命令查看 PAM 模块是否存在,若缺失可从相关源下载安装 |
| 资源限制未生效 | limits.conf 文件设置错误、 pam_limits 模块未包含在系统事件配置文件中 | 检查 limits.conf 文件的 domain type item value 设置是否正确,使用 grep 命令验证 pam_limits 模块是否包含在系统事件配置文件中 |
| 时间限制未生效 | time.conf 文件设置错误、使用 time.conf 的 PAM 模块未包含在系统事件配置文件中 | 检查 time.conf 文件中 services;ttys;users;times 字段的设置是否正确,确保使用 time.conf 的 PAM 模块包含在系统事件配置文件中 |

10. PAM 配置文件示例分析

下面对几个常见的 PAM 配置文件示例进行详细分析:
- /etc/pam.d/other 文件

$ cat /etc/pam.d/other
# /etc/pam.d/other - specify the PAM fallback behavior
#
# 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

该文件是 PAM 的备用配置文件,当某个 PAM 感知应用程序没有自己的配置文件时会使用它。通过 @include 指令包含了系统默认的认证、账户、密码和会话相关的配置文件,实现了隐式拒绝的安全策略。
- /etc/security/limits.conf 文件

$ cat /etc/security/limits.conf
# /etc/security/limits.conf
#
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
#
#Also note that configuration files in /etc/security/limits.d directory,
#which are read in alphabetical order, override the settings in this
#file in case the domain is the same or more specific.
...
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
...
#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4
# End of file

此文件用于设置通过 PAM 登录的用户的资源限制。每行定义了一个用户或组的限制,包括 domain (用户或组)、 type (硬限制或软限制)、 item (限制的资源项)和 value (限制的值)。例如, @faculty 组的用户软限制最多可以启动 20 个进程,硬限制最多可以启动 50 个进程。
- /etc/security/time.conf 文件

$ cat /etc/security/time.conf
# this is an example configuration file for the pam_time module. 
Its syntax
# was initially based heavily on that of the shadow package 
(shadow-960129).

#
# the syntax of the lines is as follows:
#
#       services;ttys;users;times
...

该文件用于设置 PAM 的时间限制。每行的格式为 services;ttys;users;times ,分别表示服务、终端、用户和允许访问的时间。例如, login; * ; !root ; Wd0700-1900 表示除了 root 用户外,其他用户只能在工作日的 7:00 至 19:00 登录。

11. 总结与建议

通过对 PAM 的全面了解,我们知道它在 Linux 系统安全中起着至关重要的作用。以下是一些总结和建议:
- 配置文件管理 :定期审查和更新 PAM 配置文件,确保其符合组织的安全策略。对于新安装的应用程序,及时为其创建或检查 PAM 配置文件。
- 资源限制设置 :根据组织的实际需求,合理设置资源限制,避免因资源过度使用导致系统性能下降或安全问题。同时,定期检查 limits.conf 文件和 pam_limits 模块的配置。
- 时间限制设置 :根据业务需求,设置合理的时间限制,如限制用户在非工作时间的登录,提高系统的安全性。
- 测试与备份 :在对 PAM 配置文件进行修改之前,一定要在虚拟或测试环境中进行测试,确保修改不会导致系统出现问题。同时,定期备份重要的 PAM 配置文件,以防意外丢失或损坏。

通过以上的管理和操作,能够充分发挥 PAM 的优势,提高 Linux 系统的安全性和可靠性,为组织的信息安全保驾护航。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值