如何熟悉Linux的PAM模块

Linux基础

1 PAM的简介

1.1 PAM的概念

– PAM即Pluggable Authentication Modules的英文缩写
– PAM为灵活且可扩展的认证框架
– PAM允许系统管理员更改用户身份验证的方式,而无需更改与身份验证相关的应用程序
– PAM支持更改认证机制,例如从传统UNIX密码文件 (/etc/passwd和/etc/shadow)认证更改为使用LDAP、Kerberos或其他

1.2 PAM的配置文件

vim /etc/pam.d/sshd 

可见如下配置,

#%PAM-1.0
auth       substack     password-auth
auth       include      postlogin
account    required     pam_sepermit.so
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    optional     pam_motd.so
session    include      password-auth
session    include      postlogin

每行的列参数解析,
– 第1列声明服务(如“login”、“su”、“other”为保留关键字)或模块(即“auth”、“account”、“password”和“session”)
– 第2列声明控制标记(包含“required”、“requisite”、“sufficient”和“optional”)
– 第3列声明插件标记,即需要调用的认证插件(即完成第一列的功能调用的实际程序文件)
– 第4列声明选项标记,即插件使用需要传递的参数
需要注意的是,
– 当PAM授权应用程序启动时,会与PAM-API建立连接并执行一系列任务,其中重点是读取配置文件“/etc/pam.conf”
– 如果读取到“/etc/pam.d/”目录下与授权应用程序一致的配置,则会忽略“/etc/pam.conf”
– 配置文件一行(使用转移字符`<LF>’结束)代表单独的策略
– 每行通过标记(前3个标记不区分大小写)声明策略,标记间通过空格分隔,如需注解请使用“#”
– 配置文件的名称会对应进程名称(即sshd的进程会自动在“/etc/pam.d/”目录寻找与进程名称的配置文件)

1.3 模块的介绍

1.3.1 auth(认证)模块接口

– 接口功能,用于验证用户身份,它请求并验证用户的凭证,如密码的有效性
– 接口示例,当用户尝试登录系统时,模块会要求用户输入用户名和密码并验证凭证是否与存储在数据库或其他安全存储中的信息匹配
– 接口额外功能,除了基本的身份验证,模块还可以设置用户凭证,如将用户添加到特定的组或角色中

1.3.2 account(账户)模块接口

– 接口功能,接口用于验证用户是否有权访问系统或执行特定操作。它检查账户状态,如是否过期或用户是否可在特定时间登录
– 接口示例,如账户已过期或被禁用,模块将拒绝用户登录。此外可检查用户是否满足特定的访问条件,如是否在允许的登录时间段
– 接口额外功能,模块支持管理用户账户信息,如更新用户详细信息或更改密码策略

1.3.3 password(密码)模块接口

– 接口功能,接口用于更改用户的密码。它允许用户更改其密码,或者管理员为用户重置密码。
– 接口示例,当用户忘记密码或需更时,支持通过password模块进行操作。模块会验证用户身份,然后允许他们设置或更改密码
– 接口安全性,模块通常会有严格的安全措施,如密码复杂度要求、密码历史记录和账户锁定策略等,以确保密码的安全性

1.3.4 session(会话)模块接口

– 接口功能,接口用于配置和管理用户会话。当用户成功验证身份并登录后模块会相应会话跟踪用户活动并保持用户的登录状态
– 接口示例,当开始会话时,模块会分配唯一会话标识并存储在用户浏览器或客户端。然后模块会跟踪用户活动直到会话结束或超时
– 接口额外任务,除了基本会话管理,模块还支持其他任务,如挂载用户家目录、使用户邮箱可用或执行其他与访问权限相关的任务

1.3.5 模块之间的执行顺序

auth -> account -> password -> Session

需要注意的是,
– 以SSH为范例,会话如配置4个模块,则模块的执行顺序是从左到右依次执行
– 另外,不是每个模块都是必须的
– 如果是相同类型的模块,例如多个“auth”则按模块的排列顺序从上到下执行

1.4 模块的控制标记

1.4.1 required(必要条件)

– 只需一票即可否决,即模块必须成功才能通过认证
– 如果这个模块失败,整个认证流程也会失败,但是失败结果不会立即通知用户。
– 模块需要等待同类型(type)的模块都执行完毕再将失败结果返回给应用

1.4.2 requisite(必要条件)

– 同样是一票否决,该模块必须成功才能通过认证
– 但如果该模块失败,那么同类型(type)的其他模块将不继续执行
– 控制权会立即返回给应用程序,并通知认证失败

1.4.3 sufficient(充分条件)

– 只需一票即可通过,意味着只要该模块成功,整个认证流程即通过。
– 如果该模块成功,那么同一类型(type)内的其他模块将不会再执行。
– 如果这个模块失败,那么可以忽略它的失败,继续执行其他模块。

1.4.4 optional(可选条件)

– 表示这个模块是可选的,它的成功或失败对整体认证流程没有决定性影响。
– 通常,这个模块的返回值会被忽略,因为它不是认证流程中的关键部分。

1.4.5 include

– 用于调用其他配置文件中定义的配置信息。
– 这允许将复杂的配置分解为多个更小的、更易于管理的配置文件,并通过include指令将它们组合起来。
– 这有助于保持配置的模块化和可重用性。

2 模块范例

2.1 模块“pam_unix.so”

2.1.1 模块的简介

– 模块“pam_unix.so”提供基于传统的UNIX密码文件“/etc/shadow”认证
– 当你尝试登录系统时,模块会检查用户提供的用户名和密码是否与“/etc/shadow”文件的条目匹配

2.1.2 模块配置范例

auth    required     pam_unix.so nullok_secure

配置解析,
– 第1列,模块标记“auth”声明执行身份认证模块
– 第2列,控制标记“required”声明模块必须成功才能通过认证,如果失败会等待同类模块执行完成才返回失败结果
– 第3列,插件标记声明调用“pam_unix.so”插件
– 第4列,选项标记声明“nullok_secure”,即某些情况下(例如使用 SSH 密钥进行身份验证时),用户可以不提供密码

2.1.3 模块配置范例

cat /etc/pam.d/common-auth 

可见如下配置,

auth    [success=1 default=ignore]     pam_unix.so

配置解析,
– 第1列,模块标记“auth”声明执行身份认证模块
– 第2列,控制标记“[success=1 default=ignore]”声明如果模块成功认证,则返回成功“1”,如果失败,则PAM忽略该返回值
– 第3列,插件标记声明调用“pam_unix.so”插件

2.2 模块“pam_deny.so”

2.2.1 模块的简介

– 模块“pam_deny.so”主要作用是拒绝用户的认证请求,无论用户提供什么凭据
– 模块通常不会被单独使用,而是作为更复杂的认证策略的一部分

2.2.2 模块配置范例

auth    [success=1 default=ignore]      pam_unix.so
auth	requisite			pam_deny.so

配置解析,
– 第1列,模块标记“auth”声明执行身份认证模块
– 第2列,控制标记“requisite”声明模块必须成功才能通过认证,如果失败即时返回结果
– 第3列,插件标记声明调用“pam_deny.so”插件
注:模块防止在其他热证模块之后,即之前的模块如果都没有认证成功则即时拒绝

2.3 模块“pam_permit.so”

2.3.1 模块的简介

– 模块“pam_permit.so”与模块“pam_deny.so”相反,主要作用是允许用户的认证请求,无论用户提供什么凭据
– 模块通常不会被单独使用,而是作为更复杂的认证策略的一部分

2.3.2 模块配置范例

auth	requisite			pam_deny.so
auth	required			pam_permit.so

配置解析,
– 第1列,模块标记“auth”声明执行身份认证模块
– 第2列,控制标记“required”声明模块必须成功才能通过认证,如果失败会等待同类模块执行完成才返回失败结果
– 第3列,插件标记声明调用“pam_permit.so”插件
注:由于“pam_deny.so”已经执行拒绝,因此该配置没有任何意义

2.4 模块“pam_cap.so”

2.4.1 模块的简介

– 模块“pam_cap.so”用于管理用户的POSIX能(capabilities)
– 模块“pam_cap.so”用于限制或增强用户进程的能力,这可以提高系统的安全性
– 模块“pam_cap.so”是Linux中的一个安全特性,允许你限制或增强进程可以执行的操作
– 模块“pam_cap.so”支持限制某个服务只能使用有限的系统能力,从而减少潜在的安全风险
– 模块“pam_cap.so”通常不会单独使用,而是作为更广泛的 PAM 配置策略的一部分

2.4.2 模块配置范例

auth	optional			pam_cap.so

配置解析,
– 第1列,模块标记“auth”声明执行身份认证模块
– 第2列,控制标记“optional”声明模块的成功或失败不会影响整个PAM认证
– 第3列,插件标记声明调用“pam_cap.so”插件

参阅文档
====================
https://github.com/privacyidea/privacyidea-pam/blob/main/samples/privacyidea-2nd-auth

没有评论

发表回复

Linux基础
如何配置RHEL 8.x OpenSSH客户端登录自动过期?

1 前言 一个问题,一篇文章,一出故事。 基于服务器安全,笔者需要让OpenSSH客户端在10分钟内 …

Linux基础
如何安装部署SentinelOne EDR?

1 基础知识 1.1 软件公司介绍 SentinelOne,Inc.是一家在纽约证券交易所上市的美国 …

Linux基础
如何配置Ext4的磁盘配额?

1 基础知识 1.1 Disk Quota的概念 Disk Quota用于合理分配有限的磁盘使用空间 …