PAM认证简介
参考: https://sites.google.com/site/linuxxuexi/shi-zhan-gong-cheng-shi-xi-lie/shi-yi-pam-ren-zheng-mo-kuai
参考: https://documentation.suse.com/zh-cn/sles/15-SP2/html/SLES-all/cha-pam.html
PAM(Pluggable Authentication Modules )是由Sun公司提出的一种认证机制。通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开。
使得系统管理员可以灵活地根据需求,给不同的服务配置不同的认证方式,而无需更改服务程序,同时也便于向系统中添加新的认证手段。
PAM模块新闻pam_faillock
由于 Linux-PAM 1.4.0(2020 年 6 月 8 日)pam_tally 和 pam_tally2 已弃用并引入了 pam_faillock,版本 1.5.0(2020 年 11 月 10 日)删除了 pam_tally 和 pam_tally2, 如果你的发行版提供 pam_faillock,请使用该版本,如果没有,请使用 pam_tally2
来源: https://github.com/linux-pam/linux-pam/tags
安装pam模块
# rhel
dnf install -y yam
# debian
apt install -y pam
pam模块目录
# 列出pam模块
ls /lib64/security/

PAM认证的配置文件
Redhat强烈建议您使用 authconfig 工具配置 PAM,而不是手动编辑 PAM 配置文件。
| 文件名称 | 作用解释 |
|---|---|
| /etc/pam.d/system-auth | 系统级别的认证的核心配置, 包含了所有用户的基本认证和账户管理设置。 |
| /etc/pam.d/password-auth | 修改密码相关的配置,定义了密码验证和密码策略的具体实现。 |
| /etc/login.defs | 定义新用户账号和密码的默认配置,例如:是否创建home目录,使用哪种shell,密码默认有效期等 |
| /etc/pam.d/login | 定义登录认证的模块和策略 |
| /etc/pam.d/passwd | 配置passwd命令的行为 |
| /etc/pam.d/common-password | /etc/pam.d/passwd的子配置 |
/etc/pam.d/system-auth配置样本

模块类型(module-type)
模块作用阶段
参考:https://docs.oracle.com/cd/E19253-01/819-7061/pam-29/index.html
红帽官方翻译为:module_interface 模块用途(接口)
| 模块类型 | 解释 | 用途 |
|---|---|---|
| auth | 验证用户的身份,确保用户是合法用户 | 例如,它请求并验证密码的有效性。带有此接口的模块也可以设置凭据,如组成员资格。 |
| account | 管理账户有效性及非认证类功能;检查用户的账号是否有效,防止过期或被锁定的账号登录。 | 它会检查用户帐户是否已过期,或者是否允许用户在特定时刻登录。 |
| password | 密码复杂度检查机制及修改规则。 | 用于加强密码安全性,防止弱密码被破解 |
| session | 管理用户会话,提供用户登录后的环境,用户会话期资源控制 | (如最大文件数、进程数限制)。使用此界面的模块还可以执行允许访问所需的其他任务,例如挂载用户的主目录和使用户的邮箱可用。 |
| -<模块类型> | 缺失时不会加载的模块,且不记录日志,适用于非必装模块。 |
控制条件(Control)
常用的PAM模块控制标志
| 控制条件 | 参数优先级 | 行为逻辑 |
|---|---|---|
| required | 必要条件 | 模块需返回成功才能通过认证。若失败,继续执行同类型其他模块。 |
| requisite | 一票否决 | 模块失败则立即终止后续同类型模块执行。 |
| sufficient | 一票通过 | 模块成功则直接通过认证;失败则忽略,优先级高于required/requisite。 |
| optional | 可选 | 成功与否不影响认证结果。 |
| include | 调用其他配置文件中定义的配置信息。 |
pam配置工具authselect
RHEL8引入了authselect 工具来统一管理 PAM 和 NSS 配置,不要直接编辑 system-auth 或 password-auth!这两个文件是 authselect 的输出结果,会被工具覆盖。
# 查看当前 profile
authselect current
# 使用 profile + 自定义 feature(如启用 faillock、with-sudo 等)
authselect select sssd with-faillock --force
# 自定义策略应放在 /etc/authselect/custom/ 下
pam配置案例
| 模块类型 | 控制标志 | 模块路径名称 | 模块参数 |
|---|---|---|---|
| auth | substack | system-auth | |
| account | required | pam_nologin.so |

/etc/pam.d/system-auth密码复杂度配置
/etc/pam.d/system-auth是负责密码复杂度和密码锁定策略的配置文件.
# 查看配置文件
cat /etc/pam.d/system-auth

密码策略分为:
● 密码复杂度、
● 口令锁定策略、
● 口令重复次数限制、
● 口令生存期配置,
## 编辑密码复杂度配置文件
vim /etc/pam.d/system-auth
将如下内容添加到配置文件的指定位置。
注:可根据现场实际情况,在ucredit=-1,lcredit=-1,dcredit=-1,ocredit=-1中任选三种参数对密码复杂度进行配置。
● ucredit:大写字母个数。
● lcredit:小写字母个数。
● dcredit:数字个数。
● ocredit:特殊字符个数。
# ucredit:大写字母个数
# lcredit:小写字母个数
# dcredit:数字个数
# ocredit:特殊字符个数
# 大写 && 小写 && 数字 && 特殊字符 至少各有一个
password requisite pam_cracklib.so ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
| 作用阶段 | 模块是否必须 | 模块名 | 模块参数 | |
|---|---|---|---|---|
| 字段: | password | requisite | pam_cracklib.so | ucredit=-1 lcredit=-1 dcredit=-1 |
| 解释: | 模块作用阶段: 密码更改时。 | 一票否决 | PAM 的一个模块,专门用于检查密码的复杂度。 | + ucredit=-1 密码中至少1个大写字母。 + lcredit=-1 密码中至少1个小写字母 + dcredit=-1 密码中至少1个数字。 + ocredit=-1 密码中至少一个特殊字符 |
将代码框中的内容添加到下图中箭头指向的位置,然后保存并退出。

/etc/pam.d/system-auth配置账号锁定时间
# 配置账号锁定时间为300秒
auth required pam_tally2.so deny=5 onerr=fail no_magic_root unlock_time=300
| 模块类型 | 控制标志 | 模块路径名称 | 模块参数 |
|---|---|---|---|
| account | required | pam_tally2.so | deny=5 onerr=fail no_magic_root unlock_time=300 |
| 作用阶段 | 必要条件 | + deny=5 # 最大连续失败次数 + onerr=fail # 模块异常时拒绝访问 + no_magic_root # root 用户同样受锁定限制 + unlock_time=300 # 锁定 5 分钟后自动解锁 |
注:其中unlock_time的单位为秒,具体参数数值请根据现场实际情况进行设置。

/etc/pam.d/system-auth配置口令重复次数限制
# 配置口令重复次数为5次
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok remember=5
| 模块类型 | 控制标志 | 模块路径名称 | 模块参数 |
|---|---|---|---|
| password | sufficient | pam_unix.so | md5 shadow nullok try_first_pass use_authtok remember=5 |
| 一票通过 | + md5 使用 MD5 # 加密算法(推荐sha512) + shadow \ # 启用影子密码(安全必须) + nullok \ # 允许空密码(高风险,建议禁用) + try_first_pass \ # 复用认证阶段密码(优化体验) + use_authtok \ # 强制使用认证阶段密码(安全必须) + remember=5 # 记录最近 5 次密码防复用 |
注:remember参数为口令重复次数,请根据现场实际情况进行设置。

/etc/login.defs新用户的口令安全默认策略配置文件
/etc/login.defs文件定义了系统新用户及口令安全默认策略的配置.
密码有效期配置
vim /etc/login.defs
PASS_MAX_DAYS 90 #// 口令最大有效天数
PASS_MIN_DAYS 0 #// 口令最小有效天数
PASS_MIN_LEN 8 #// 口令最少字符数
PASS_WARN_AGE 7 #// 口令过期提前警告天数

/etc/pam.d/login登录失败策略配置文件
# deny=3(登录失败次数3次)
# lock_time=300(锁定300秒)
# even_deny_root root_unlock_time=300(root用户锁定300秒);
auth required pam_tally2.so deny=3 lock_time=300 even_deny_root root_unlock_time=300
| 模块类型 | 控制标志 | 模块路径名称 | 模块参数 |
|---|---|---|---|
| password | sufficient | pam_unix.so | md5 shadow nullok try_first_pass use_authtok remember=5 |
| 一票通过 | + deny=3(登录失败次数3次) + lock_time=300(锁定300秒) + even_deny_root root_unlock_time=300(root用户锁定300秒); |
生产案例:pam安全整改
确认密码重用是否受限制
禁止使用最近用过的x个密码(己使用过的密码会被保存在 /etc/security/opasswd 下面
# 查看密码重用次数是否限制
grep remember /etc/pam.d/system-auth

vim /etc/pam.d/system-auth
变更为
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
| 模块类型 | 控制标志 | 模块路径名称 | 模块参数 |
|---|---|---|---|
| password | sufficient | pam_unix.so | sha512 shadow nullok try_first_pass use_authtok remember=5 |
| 作用阶段: 修改密码时 | 一票通过 | Unix密码验证模块 | + sha512 指定密码的哈希算法为SHA-512 + shadow 使用shadow密码文件(通常位于/eetc/shadow)来获取加密的密码哈希。 + nullok 允许用户没有密码(空密码)进行身份验证 + try_first_pass PAM首先尝试使用用户上次提供的密码进行身份验证,而不是提示用户输入新密码 + use_authtok PAM使用之前在身份验证过程中输入的密码作为认证令牌(authtok)。 + remember=5 禁止使用最近用过的5个密码(己使用过的密码会被保存在 /etc/security/opasswd 下面 |
确认root计算机用户默认组的GID是否为0
# 确认root计算机用户默认组的GID是否为0
id root | grep uid=0 && echo true || echo failes

确认SSH的MaxAuthTries(ssh最大尝试次数)是否配置为小于等于4
# 查看SSH服务器允许的最大认证尝试次数
cat /etc/ssh/sshd_config | grep MaxAuthTries
#MaxAuthTries 6 修改为MaxAuthTries 3
解除Linux进程数和线程数及文件打开数
允许开启的线程数量
# 加大允许开启的线程数量
vm.max_map_count=262144
系统中可同时打开的文件数
# 系统中可同时打开的最大文件数目
fs.file-max=52706963
# 单个进程可分配的最大文件数
fs.nr_open=52706963
# 查看系统中可同时打开的最大文件数
sysctl fs.file-max
# 查看单进程可打开的最大文件数
sysctl fs.nr_open


限制用户最大进程数和最大文件打开数限制
软限制是用户可以临时提高的,而硬限制是管理员设置的上限,不能被用户或进程改变
| 针对用户(*表示所有用户) | 限制方法 | 限制类型 | 限制的值 |
|---|---|---|---|
* 代表针对所有用户 | soft: 软限制 | noproc是最大进程数 | 11000 |
| * | hard: 硬限制 | nofile 是最大文件打开数 | 4100 |
| * | -为soft和hard全部限制 | noproc(最大进程数) | 1100 |
| * | - | nofile(最大文件打开数) | 4100 |
os的openfile值,建议加大。
配置文件在/etc/security/limits.conf
# 所有用户最大内存锁定的软限制为未限制
* soft memlock unlimited
# 所有用户最大内存锁定的硬限制为未限制
* hard memlock unlimited
# 针对所有用户软限制最大进程数
* soft noproc 11000
# 针对所有用户硬限制最大进程数
* hard noproc 11000
# 针对所有用户软限制最大文件打开数
* soft nofile 65535
# 针对所有用户硬限制最大文件打开数
* hard nofile 65535
# 最大核心转储文件的大小为未限制
* soft core unlimited
* hard core unlimited
软硬一起限制—生产示例
# 最大核心转储文件的大小
* - core unlimited
# *代表针对所有用户,-表示软硬都限制,noproc是最大进程数
* - noproc 1000000
# *代表针对所有用户,-表示软硬都限制,nofile是最大文件打开数
* - nofile 1000000
# *代表针对所有用户,-表示软硬都限制,memlock是最大内存锁定
* - memlock 32000
# 所有用户的消息队列内存上限为 8MB
* - msgqueue 8192000
使配置生效
重启系统或者重新登录用户才会让/etc/security/limits.conf 配置生效;
也可以通过重新加载PAM配置的方法让limits.conf配置热生效。
重新加载 PAM 配置可能会导致当前用户的会话中断或其他不可预测的结果。
# 重新加载 PAM(Pluggable Authentication Modules)配置,让limits.conf配置热生效
sudo systemctl restart systemd-logind
# 注销用户
logout
# 登录
ssh xxx

查看配置生效后的限制数量
# 查看所有值
ulimit -n
# 查看用户进程能够打开的最大文件数
ulimit -n
# 查看用户最大进程数
ulimit -u
# 查看虚拟内存大小
ulimit -v
# 查看CPU时间限制
ulimit -t
# 查看最大核心转储文件的大小
ulimit -c
566

被折叠的 条评论
为什么被折叠?



