Linux中通过PAM配置密码强度策略详解

17 次阅读

Linux系统作为服务器和企业级应用环境中广泛使用的操作系统,安全管理一直是运维工作中的重点。其中,用户密码强度策略是保障系统账户安全的重要环节。默认情况下,Linux虽然提供了基础的用户认证机制,但对于密码长度、复杂度、历史密码限制等方面的控制并不一定满足企业安全规范。

PAM(Pluggable Authentication Modules,可插拔认证模块)提供了一套灵活的认证框架,可以通过配置密码策略模块实现对用户密码强度的精细化管理。本文将详细介绍Linux中如何通过PAM配置密码强度策略,包括相关配置文件、常用参数以及实际应用中的注意事项。

一、什么是PAM认证机制

PAM是Linux系统中负责身份认证的重要组件,它将应用程序与具体认证方式分离,使系统管理员可以通过修改配置文件调整认证规则,而无需修改应用程序代码。

常见使用PAM进行认证的服务包括:

  • SSH远程登录

  • 用户登录管理

  • sudo权限验证

  • 用户密码修改

  • 图形化登录服务

PAM配置文件通常位于:

Bash
/etc/pam.d/

不同服务对应不同的PAM配置文件,例如:

Bash
/etc/pam.d/sshd

表示SSH服务的认证规则。

PAM配置文件通常由以下几个部分组成:

模块类型  控制标记  模块路径  模块参数

例如:

Bash
password requisite pam_pwquality.so retry=3

其中:

  • password:表示密码管理阶段

  • requisite:表示模块失败后立即返回失败

  • pam_pwquality.so:密码质量检查模块

  • retry=3:允许用户重新输入密码3次


二、Linux密码强度策略的核心模块

Linux系统中实现密码复杂度控制主要依赖以下PAM模块:

1. pam_pwquality模块

目前主流Linux发行版推荐使用:

Bash
pam_pwquality.so

它用于检查用户设置密码时是否符合安全要求。

主要功能包括:

  • 限制密码最小长度

  • 控制字符类型数量

  • 防止简单密码

  • 检查密码重复

  • 限制与用户名相关的密码

常见配置文件:

Bash
/etc/security/pwquality.conf

部分系统也可以直接在PAM配置中设置参数。


2. pam_cracklib模块

早期Linux系统常使用:

Bash
pam_cracklib.so

它同样用于密码复杂度检查。

例如:

Bash
password requisite pam_cracklib.so retry=3 minlen=8

不过在较新的发行版中,pam_pwquality已经逐渐替代pam_cracklib。


三、安装密码质量检查模块

部分精简安装的Linux系统可能没有默认安装密码质量模块。

CentOS、Rocky Linux、AlmaLinux

可以执行:

Bash
yum install libpwquality

或者:

Bash
dnf install libpwquality

安装完成后,可以查看模块文件:

Bash
ls /usr/lib64/security/ | grep pwquality

Ubuntu、Debian系统

执行:

Bash
apt install libpam-pwquality

安装后检查:

Bash
ls /lib/x86_64-linux-gnu/security/ | grep pwquality

四、通过pwquality.conf配置密码强度

推荐方式是修改:

Bash
/etc/security/pwquality.conf

该文件集中管理密码策略,更方便维护。

常见配置如下:

conf
minlen = 12
minclass = 4
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
retry = 3

下面介绍各参数含义。


五、常用密码复杂度参数详解

1. 设置密码最小长度

参数:

conf
minlen = 12

表示密码至少需要12个字符。

例如:

允许:

Linux@2026Admin

不允许:

123456

企业环境通常建议密码长度不少于10到12位。


2. 设置字符类型数量

参数:

conf
minclass = 4

表示密码必须包含4类字符:

  • 大写字母

  • 小写字母

  • 数字

  • 特殊符号

例如:

Linux@2026Safe

包含:

  • L、S(大写)

  • inuxafe(小写)

  • 2026(数字)

  • @(特殊字符)

符合要求。


3. 强制包含数字

参数:

conf
dcredit = -1

含义:

至少包含一个数字。

例如:

Server2026!

满足要求。


4. 强制包含大写字母

参数:

conf
ucredit = -1

要求密码至少包含一个大写字母。

例如:

Admin@123

符合。


5. 强制包含小写字母

参数:

conf
lcredit = -1

要求密码至少包含一个小写字母。


6. 强制包含特殊字符

参数:

conf
ocredit = -1

要求密码至少包含一个非字母数字字符。

例如:

Linux#2026

其中:

#

属于特殊字符。


六、配置PAM启用密码强度检查

仅修改:

Bash
/etc/security/pwquality.conf

并不会自动生效,还需要在PAM配置中启用模块。

CentOS/RHEL系统

编辑:

Bash
/etc/pam.d/system-auth

找到:

Bash
password requisite pam_pwquality.so

如果不存在,可以添加:

Bash
password requisite pam_pwquality.so retry=3

同时建议检查:

Bash
/etc/pam.d/password-auth

确保存在:

Bash
password requisite pam_pwquality.so retry=3

Ubuntu系统

编辑:

Bash
/etc/pam.d/common-password

找到:

Bash
password requisite pam_pwquality.so retry=3

如果不存在,添加:

Bash
password requisite pam_pwquality.so retry=3

保存后即可生效。


七、限制用户不能使用旧密码

除了复杂度要求,密码历史管理也是重要安全措施。

Linux可以通过:

Bash
pam_pwhistory.so

实现。

例如:

Bash
password required pam_pwhistory.so remember=5

表示:

用户最近使用过的5个密码不能重复使用。

这样可以避免:

Password1
Password2
Password1

这种循环修改密码方式。


八、防止密码包含用户名信息

为了避免用户设置:

用户名:admin
密码:admin123

可以启用:

conf
usercheck = 1

配置:

conf
/etc/security/pwquality.conf

添加:

conf
usercheck=1

系统会检查密码是否包含用户名。


九、设置密码最大有效期

密码安全不仅依赖复杂度,还需要定期更新。

可以通过:

Bash
/etc/login.defs

配置:

conf
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14

含义:

参数说明
PASS_MAX_DAYS密码最大使用天数
PASS_MIN_DAYS两次修改密码间隔
PASS_WARN_AGE到期提醒时间

例如:

conf
PASS_MAX_DAYS 90

表示密码90天后必须修改。


十、使用chage管理单个用户密码策略

对于特殊账户,可以单独设置。

查看用户密码状态:

Bash
chage -l username

设置密码90天过期:

Bash
chage -M 90 username

设置密码提前14天提醒:

Bash
chage -W 14 username

立即要求修改密码:

Bash
chage -d 0 username

十一、测试PAM密码策略是否生效

配置完成后,可以创建测试用户:

Bash
useradd testuser

设置密码:

Bash
passwd testuser

测试弱密码:

123456

如果配置正确,会提示:

BAD PASSWORD

例如:

密码太短
密码缺少数字
密码缺少特殊字符

然后测试符合要求的密码:

Linux@2026Secure

应该可以正常设置。


十二、修改PAM配置时的注意事项

PAM配置错误可能导致用户无法登录,因此修改前需要做好备份。

备份:

Bash
cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak

修改时注意:

1. 不要删除系统默认认证模块

例如:

Bash
pam_unix.so

这是Linux本地账户认证的重要模块。


2. 避免直接锁死root账户

配置错误可能导致:

  • SSH无法登录

  • sudo失效

  • 无法修改密码

建议:

  • 保留一个已登录管理员终端

  • 修改后立即测试

  • 配置前做好恢复方案


3. 使用系统工具管理PAM

部分发行版提供:

Bash
authselect

用于管理认证配置。

例如:

Bash
authselect current

查看当前认证方案。


十三、企业环境推荐密码策略示例

一个较为安全的服务器密码策略:

conf
minlen = 12
minclass = 4
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
retry = 3
difok = 5
usercheck = 1

同时结合:

conf
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14

实现:

  • 密码长度控制

  • 字符复杂度控制

  • 历史密码限制

  • 定期修改要求

  • 用户关联检查


十四、常见问题排查

问题一:配置后密码仍然可以设置简单密码

检查:

Bash
cat /etc/pam.d/system-auth

确认是否加载:

Bash
pam_pwquality.so

同时确认:

Bash
cat /etc/security/pwquality.conf

配置是否正确。


问题二:SSH登录突然失败

可能原因:

  • PAM配置语法错误

  • 模块加载失败

  • 认证链顺序错误

查看日志:

CentOS:

Bash
tail -f /var/log/secure

Ubuntu:

Bash
tail -f /var/log/auth.log

问题三:root修改密码失败

检查root密码是否符合:

  • 最小长度

  • 字符类型

  • 历史限制

如果需要临时调整策略,可以修改配置后重新执行密码修改操作。


总结

Linux通过PAM实现密码强度策略是一种灵活、安全且标准化的管理方式。通过pam_pwquality模块,可以对密码长度、字符组成、用户名关联、历史密码等多个维度进行控制。

在实际服务器环境中,密码策略通常需要结合PAM配置、密码生命周期管理以及账户权限控制共同实施。合理配置PAM密码规则,不仅能够降低弱密码带来的安全风险,也能满足企业安全规范和等保要求。