密码是守护Linux系统的第一道,也是至关重要的防线。一套严谨、合理的密码策略能够有效抵御暴力破解、字典攻击等常见安全威胁。在Linux世界中,这套策略的核心实现机制是 PAM(Pluggable Authentication Modules,可插拔认证模块) 框架。
一、核心配置文件路径与作用域
Linux将不同场景下的认证策略分散在 /etc/pam.d/目录下的多个配置文件中,每个文件都有其特定的管理范围。
| | | |
|---|
/etc/pam.d/passwd | passwd | | |
/etc/pam.d/sshd | | | |
/etc/pam.d/login | | | |
/etc/pam.d/su | su | | |
/etc/pam.d/kde | | | |
/etc/pam.d/gnome | | | |
/etc/pam.d/system-auth | | | |
配置文件间的依赖关系与优先级
/etc/pam.d/system-auth通常作为公共策略模板,其他服务的配置文件通过 include或 substack指令来引用它。
示例:/etc/pam.d/sshd的常见引用方式
auth include system-authaccount include system-authpassword include system-auth
执行优先级原则:
如果某个服务配置文件(如 sshd)在 include system-auth之前定义了自己的PAM模块,则优先执行自定义模块;如果在 之后 定义,则后执行。这种设计允许服务在通用策略基础上进行特定覆盖或追加。
二、密码复杂度参数深度解读
基础配置结构
一条典型的密码策略配置行如下所示:
password requisite pam_cracklib.so retry=3 minlen=8 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 reject_username enforce_for_root
参数详解
1. 控制标志:requisite
- 常见控制标志:
required:失败必须返回错误,但继续执行栈中后续模块。 requisite:失败立即返回错误,终止后续模块执行。 sufficient:成功则可跳过后续模块(除非被标记为required)。 optional:成功或失败通常不影响整体认证结果。
2. 核心模块:pam_cracklib.so(或较新系统的 pam_pwquality.so)
这是检查密码强度的核心模块。
3. 关键参数解析
retry=3含义:允许用户最多尝试 3 次 输入符合规则的密码。 流程:若连续3次输入都不符合要求,则操作终止。 用户表现:收到类似“重试次数过多”的提示。minlen=8基础要求:密码最少8个字符。 计算方式:此长度计算包含由credit规则所强制要求的字符。 示例:若设置 ucredit=-1,则密码 A1234567(8位,含1大写)符合要求。difok=3核心逻辑:新密码必须与旧密码有至少3个字符的不同。 技术原理:使用 Levenshtein距离 算法计算两字符串的差异。 示例: 旧密码:Houqinbei2023! 新密码:Houqinbei2024!(仅1个字符不同) → 拒绝 新密码:QingheAdmin2024!(多个字符不同) → 接受- 字符类型要求 (
credit系列参数) 参数要求示例字符正负值含义ucredit=-1至少1个大写字母A-Z负数:至少需要 N 个lcredit=-1至少1个小写字母a-z正数:最多允许 N 个dcredit=-1至少1个数字0-9例如 -2:至少需要2个ocredit=-1至少1个特殊字符!@#$%等例如 1:最多允许1个说明:若设置为 ocredit=0,表示既不要求也不限制特殊字符的数量。 reject_username安全考量:防止用户使用用户名作为密码的一部分。 检查规则:密码中是否包含当前用户名(不区分大小写)。 示例: 用户名:hou 密码:hou1234!→ 拒绝 (包含用户名) 密码:admin123!→ 通过enforce_for_root默认行为:若不设置此参数,root超级用户可设置任意简单密码。 作用:确保 root用户同样遵守上述所有密码策略。 安全意义:防止最高权限账户成为整个系统安全体系中最薄弱的环节。
三、密码有效期管理:/etc/login.defs
位置与作用
/etc/login.defs并非PAM配置文件,但它是一个系统级的配置文件,用于定义用户账户的默认属性,其中包含密码的生命周期管理策略。
关键参数:PASS_MAX_DAYS
# 设置密码最大有效期为 90 天PASS_MAX_DAYS 90
生效范围说明
- 仅对新用户生效:修改
/etc/login.defs中的 PASS_MAX_DAYS参数,只会影响之后新创建的用户。 - 对现有用户:不会自动生效。需要手动修改
/etc/shadow文件中相应用户的记录,或使用 chage命令进行修改。
/etc/shadow文件结构解析
/etc/shadow文件存储用户的实际密码哈希和策略信息,其格式为冒号分隔的字段:
用户名:加密后的密码:最后一次修改时间:最小修改间隔:密码有效期:警告天数:不活动期:过期日期:保留字段
- 密码有效期字段:即第5个字段,决定了密码多少天后必须更改。
- 示例:
test:!!:19010:0:90:8:::90代表密码有效期为 90天。 qh:S1$rt0s1N5J$w...:18736:0:99999:7:::99999代表密码无需定期更换(近乎永久有效)。
修改现有用户密码有效期命令:
# 将用户 `testuser` 的密码有效期设置为 90 天sudo chage -M 90 testuser
结语:从理解到实践
深入理解这些配置文件路径、PAM参数及shadow文件字段的含义,是有效实施和运维Linux系统密码安全策略的基石。无论您是安全测评人员、系统管理员还是运维工程师,掌握这些核心配置都能使您更有力地加固系统防线,构建更加稳固的安全体系。