kaixin
Published on 2023-08-15 / 15 Visits
0

PAM模块简介

PAM模块

是什么:

  • 它是用于认证和账户灌流状态的动态链接库,它提供了一个灵活的框架,允许不同的认证机制(密码,指纹,令牌等)集成到系统中,主要实现的就是用户认证的方面,允许系统以统一和一致的进行用户认证,无需关心后端认证机制的具体实现。

特点:

  1. 模块化,可以根据不同的配置认证模块,无需修改程序的本身。
  2. 新的认证模块可以添加到系统中,不会影响程序的认证流程。
  3. 支持多种认证方式,可以使用PAM,进行集中管理安全策略,密码复杂性要求,用户锁定策略。
  4. 所有支持PAM的应用都会遵守相同的认证流程,这使得不同的与应用程序间切换体验一致。

原因:

  1. 方便,只需要在配置文件管理所有的认证规则,而不是每个程序都需要设置。
  2. 安全,可以实现更为安全的认证策略,用户输入密码,或者使用更高级别身份验证的方式,指纹,面部识别。
  3. 灵活,如果由更好的认证策略,只需要更新pam模块,不需要动程序本身,程序自动支持认证方式。
  4. 一致,不同的程序可以使用相同的认证方式,这样用户在不同程序切换,体验相同。

模块分类:

  1. 用户管理模块:用于检查账户是否存在,账户是否锁定。
  2. 认证模块:用户的凭证认证,密码认证。
  3. 会话模块:用户会话周期,登录和退出。
  4. 密码管理:密码的更改和维护。
目录 作用
/etc/pam.d/* 每个应用程序或服务都有一个对应的PAM配置文件,定义了认证过程中使用的模块和它们的顺序。
每一个文件对应的都是一个程序软件,程序软件使用PAM认证的模块和它的顺序。
/lib64/security/* 或者/lib/security/ PAM模块文件实际存放的目录
/etc/security/* PAM配置文件。这些配置文件用于定义和控制 PAM 模块的行为。
/use/share/doc/pam-*/ 详细的PAM使用说明
/var/log/secure PAM的日志文件

image-20241218230747777

相关文档:

1.PAM说明

PAM可以说是一个应用程序的编程接口,它提供了一系列的认证机制,只要用户将验证阶段的需求告知PAM,PAM就可以返回响应的验证结果(成功or失败)。如此以来可以让开发人员方便的处理验证问题。

它是通过模块化进行设计,方便使用者可插拔。

# 简单理解
    PAM就是一个帮助计算机程序验证用户身份的工具,它让管理认证变得更简单、安全和灵活。PAM就像是一个门卫系统,它帮助计算机程序(比如登录系统)来检查用户的身份。

image-20241218231301741


2.PAM模块语法说明

2-1.passwd调用过程

1.执行 /usr/bin/passwd。
2.passwd 调用PAM进行验证。
3.PAM会到 /etc/pam.d/ 目录下找到 passwd程序同名的配置文件。
4.依据/etc/pam.d/passwd 内设置,引用相关的PAM模块进行验证。
5.将最终的结果返回给passwd程序。
6.passwd会根据PAM返回的结果决定是否进行下一步操作。

语法:
    type  control  module-path  module-arguments

注意:
    module-arguments 模块的参数是根据不同的模块来定的,pam_deny.so 与 pam_nologin.so 肯定是不同,需要查阅相关文档才能决定。

2-2./etc/pam.d/passwd的配置

[root@template pam.d]# cat /etc/pam.d/passwd 
#%PAM-1.0  版本说明
auth       include	system-auth   # 每一行都是一个验证过程,一步一步的向下执行
account    include	system-auth
password   substack	system-auth
-password   optional	pam_gnome_keyring.so use_authtok # 类型前加上"-"(减号)前缀,则表示即使模块不存在,也不会影响认证结果,更不会将此事件记录到日志中
password   substack	postlogin

# auth       include	system-auth 这一行代表什么意思?
    1.auth 验证类型 # type
    2.include 控制标志 # control-flag
    3.system-auth PAM的模块 # module-path
    4.在模块后面跟着的参数就是参数,用于控制模块的行为  # module-arguments

2-3.配置中的验证类型(type)

1.auth
    主要用来验证用户的身份,这类型通常需要密码验证的,所以后续的模块是用来验证身份的。

2.account
    大部分进行授权设置,主要用来验证用户是否有正确的权限。

3.session
    会话,用户在这次登录期间PAM给与的环境设置。用于记录用户登录与注销的信息。

4.password
    用于提供严重的修订工作

这四种类型的顺序正常情况下:
    auth -> account -> session -> password # 也有特殊情况。

通过位于 /lib/security/ 或 /lib64/security/ 中的各个 PAM 模块来实现,模块文件名一般都符合 pam_*.so 格式。

2-3.配置中的控制标志(control)

1.required
    必须验证成,如果验证失败,也会进行后续的模块,但是最终结果还是失败。
    一开始 required 验证就失败了,那么后续的模块验证就算成功,也会返回失败,它决定了最终结果。

2.requisite
    如果验证'失败'就会终止此次验证。不会像required一样向后模块验证。

3.sufficient
    如果验证成功,认证过程就会立即成功,不会执行更多的验证步骤。不会向下在执行模块验证(auth类型)。但是其他的类型(如 account、password、session)依然会按照配置执行。

4.optional
    允许系统在不影响主要认证流程的情况下,执行一些额外的、非关键的检查或操作。即使这些模块失败,用户仍然可以成功通过认证。
    提供一些额外的功能。

5.include
    引用其他的模块。类似于编程语言中导包的概念。

6.substack
    类似于函数调用的概念,调用另一个配置文件的一系列的PAM模块进行验证,调用的结果也会直接影响PAM的验证流程。

3.PAM内置模块(module-path)

类型 简介
pam_access.so auth,account,password,session 基于来源(主机/网络/终端/$DISPLAY/服务名)的访问控制
pam_debug.so auth,account,password,session 调试PAM栈
pam_deny.so auth,account,password,session 无条件的拒绝访问,作为一种安全措施来阻止访问。
pam_echo.so auth,account,password,session 显示文本消息
pam_env.so auth,session 设置用户环境变量,可以在用户登录时设置额外的环境变量。
pam_exec.so auth,account,password,session 调用外部命令
pam_faildelay.so auth 设置认证失败时的阻塞延迟
pam_faillock.so auth,account 锁定连续认证失败的账户
pam_filter.so auth,account,password,session 在用户与应用程序之间建立输入输出(STDIN/STDOUT)过滤器
pam_ftp.so auth 可插拔的匿名FTP访问模式(不安全)
pam_group.so auth 将用户额外添加到特定组中
pam_issue.so auth 更改用户的提示文件(issue)
pam_keyinit.so session 在默认内核会话密钥环之外额外创建新的内核会话密钥环
pam_lastlog.so auth,account,session 显示账户的上次登录时间、锁定长期不登录的帐户
pam_limits.so session 定义用户可以使用的系统资源上限,如内存、进程数量等。
pam_listfile.so auth,account,password,session 基于各种属性(tty|user|rhost|ruser|group|shell)执行访问控制,提供访问控制,可以根据用户、组或主机列表来允许或拒绝访问。
pam_localuser.so auth,account,password,session 仅允许本地用户(/etc/passwd)访问
pam_loginuid.so session 规范验证用户的uid是否是需要的值。
pam_mail.so auth,session 提示用户有新邮件
pam_mkhomedir.so session 在开始会话前创建用户的家目录
pam_motd.so session 显示"今日消息"(motd)
pam_namespace.so session 为会话设置私有名字空间
pam_nologin.so auth,account 限制一般用户登录,当/etc/nologin文件存在时普通用户无法登录。不会影响 root 与已经登录的用户。
pam_permit.so auth,account,password,session pam_deny.so相反,此模块允许所有认证请求通过,任何时候都返回成功。
pam_pwhistory.so password 防止重复使用旧密码
pam_rhosts.so auth 使用 rlogin/rsh 网络访问认证(/etc/hosts.equiv 与 ~/.rhosts)
pam_rootok.so auth,account,password 仅在 UID=0 时验证成功
pam_securetty.so auth 限制root用户只能在指定的终端登录,增强安全性。
pam_selinux.so session 设置默认的 SELinux 安全上下文
pam_sepermit.so auth,account 根据 SELinux 的开关状态决定是否通过认证
pam_setquota.so session 在开始会话时设置或修改磁盘限额
pam_shells.so auth,account 检查登录shell的有效性(是否列于 /etc/shells 之中)
pam_stress.so auth,account,password,session 模拟失败表现
pam_succeed_if.so auth,account,password,session 测试账号自身的属性以实现条件分支逻辑
pam_time.so account 限制用户在特定时间内登录系统。
pam_timestamp.so auth,session 缓存成功的认证以避免频繁的反复认证
pam_tty_audit.so session 开启或关闭TTY审计(内核默认不审计TTY上的输入)
pam_umask.so session 设置本次会话中的 umask 值
pam_unix.so auth,account,password,session 传统UNIX密码验证(/etc/passwd 与 /etc/shadow),包括密码验证和账户管理
pam_userdb.so auth,account 使用 Berkeley DB 数据库验证用户名/密码
pam_usertype.so auth,account,password,session 根据 /etc/login.defs 中的设置检查已认证用户的类型(系统账户/普通账户)
pam_warn.so auth,account,password,session 向系统日志中记录详细的PAM信息(服务名,终端,用户,远程用户,远程主机)
pam_wheel.so auth,account 仅允许 wheel 组成员获得 root 权限
pam_xauth.so session 在用户之间转发 xauth 密钥(cookies)
pam_cracklib.so和pam_pwquality.so password 检查密码的复杂性,如长度、包含的字符类型等,以提高密码强度。

4./etc/security/下配置文件作用

文件名 作用
limits.conf 定义用户资源限制,如最大内存使用量、进程数量、打开文件的数量等
pam_env.conf 设置用户环境变量,这些变量在用户登录时被设置
console.perms和console.apps 控制控制台访问权限,定义哪些用户可以访问系统的控制台
access.conf 用于配置 pam_access 模块,控制用户从特定主机或网络地址的访问 配置文件:/etc/security/access.conf
time.conf pam_time 模块一起使用,限制用户在特定时间内访问系统
namespace.conf 和 namespace.init 定义用户命名空间,控制用户可以访问的系统资源
opasswd 存储旧密码信息,用于密码更改时的密码历史检查
sepermit.conf 与 SELinux 集成,控制 SELinux 的权限和策略
pam_winbind.conf 配置与 Windows 域集成的 PAM 模块,如 pam_winbind
group.conf 定义与用户组相关的 PAM 策略,如组的密码策略

5.当login的PAM发生的过程

[root@template pam.d]# cat login 
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so



1.验证阶段(auth)
    通过 pam_securetty.so 判断当前用户是不是root(根据/etc/securetty的配置),经过pam_env.so设置额外的环境变量,在通过pam_UNIX.so验证密码,通过就回报login程序,如果不通过就会向下执行pam_succeed_if.so,判断是否uid大于500,小于500回报失败,向下执行pam_deny.so拒绝链接。
   
2.授权(account)
     pam_nologin.so会判断/etc/nologin文件是否存在,存在不允许一般用户进行登录。接下来pam_UNIX.so进行账户管理,pam_succeed_if.so判断uid是否小于500,小于不记录登录信息,最后以pam_permit.so允许该账户登录。
    
3.密码阶段(password)
    以pam_cracklib.so设置密码仅尝试3次错误登录,以pam_UNIX.so通过md5,shadow等功能进行密码校验,通过回报login程序,不通过pam_deny.so拒绝登录。

4.会话阶段(session)
    以pam_selinux.so 关闭暂时关闭selinux,使用pam_limits.so设置好用户能够操作的系统资源,登录后开始记录相关信息到登录文件中,以 pam_loginuid.so设置不同的uid权限,在进行打开pam_selinux.so 的功能。