PAM模块
是什么:
- 它是用于认证和账户灌流状态的动态链接库,它提供了一个灵活的框架,允许不同的认证机制(密码,指纹,令牌等)集成到系统中,主要实现的就是用户认证的方面,允许系统以统一和一致的进行用户认证,无需关心后端认证机制的具体实现。
特点:
- 模块化,可以根据不同的配置认证模块,无需修改程序的本身。
- 新的认证模块可以添加到系统中,不会影响程序的认证流程。
- 支持多种认证方式,可以使用PAM,进行集中管理安全策略,密码复杂性要求,用户锁定策略。
- 所有支持PAM的应用都会遵守相同的认证流程,这使得不同的与应用程序间切换体验一致。
原因:
- 方便,只需要在配置文件管理所有的认证规则,而不是每个程序都需要设置。
- 安全,可以实现更为安全的认证策略,用户输入密码,或者使用更高级别身份验证的方式,指纹,面部识别。
- 灵活,如果由更好的认证策略,只需要更新pam模块,不需要动程序本身,程序自动支持认证方式。
- 一致,不同的程序可以使用相同的认证方式,这样用户在不同程序切换,体验相同。
模块分类:
- 用户管理模块:用于检查账户是否存在,账户是否锁定。
- 认证模块:用户的凭证认证,密码认证。
- 会话模块:用户会话周期,登录和退出。
- 密码管理:密码的更改和维护。
目录 作用 /etc/pam.d/* 每个应用程序或服务都有一个对应的PAM配置文件,定义了认证过程中使用的模块和它们的顺序。
每一个文件对应的都是一个程序软件,程序软件使用PAM认证的模块和它的顺序。/lib64/security/* 或者/lib/security/ PAM模块文件实际存放的目录 /etc/security/* PAM配置文件。这些配置文件用于定义和控制 PAM 模块的行为。 /use/share/doc/pam-*/ 详细的PAM使用说明 /var/log/secure PAM的日志文件 相关文档:
1.PAM说明
PAM可以说是一个应用程序的编程接口,它提供了一系列的认证机制,只要用户将验证阶段的需求告知PAM,PAM就可以返回响应的验证结果(成功or失败)。如此以来可以让开发人员方便的处理验证问题。
它是通过模块化进行设计,方便使用者可插拔。
# 简单理解
PAM就是一个帮助计算机程序验证用户身份的工具,它让管理认证变得更简单、安全和灵活。PAM就像是一个门卫系统,它帮助计算机程序(比如登录系统)来检查用户的身份。
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 的功能。