Linux服务器用户密码策略设置教程:从零开始强制密码复杂度
写在前面
刚接手一台Linux服务器,默认密码策略通常很宽松:密码可以设得很短、永不过期、甚至允许连续相同的字符。
这给服务器安全埋下了隐患。
本文将从零开始,教你通过修改系统配置文件,自定义密码长度、有效期、复杂度规则,并验证修改是否生效。
准备条件
- 一台Linux服务器(本文以CentOS 7/8和Ubuntu 20.04为例)。
- 拥有root权限或能通过sudo执行管理员命令。
- 已通过SSH连接到服务器(本地操作也行)。
分步配置密码策略
1. 设置密码有效期与最小长度(/etc/login.defs)
这个文件控制shadow工具的行为,包括密码最大天数、最小长度等。
sudo vim /etc/login.defs
找到或添加以下几行(数值可按需调整):
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_MIN_LEN 8
PASS_WARN_AGE 7
PASS_MAX_DAYS 90:密码最长使用90天(即每90天强制换一次)。PASS_MIN_DAYS 7:两次修改密码之间至少间隔7天,防止用户反复改回原密码。PASS_MIN_LEN 8:密码最小长度8位。PASS_WARN_AGE 7:密码过期前7天开始提醒用户更换。
注意:PASS_MIN_LEN只对通过passwd命令设置密码生效,对root用户设置密码无强制。若要真正限制长度和复杂度,需配合PAM。
2. 启用密码复杂度(PAM模块)
Linux系统通过PAM(可插拔认证模块)实现更精细的密码规则。
编辑对应文件。
CentOS/RHEL 7+ 使用 pam_pwquality.so:
sudo vim /etc/pam.d/system-auth
找到包含 pam_pwquality.so 的行,如果没有则在新行添加(注意顺序在 password requisite 区域):
password requisite pam_pwquality.so try_first_pass retry=3 minlen=10 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
参数解释:
retry=3:允许用户尝试3次。minlen=10:密码最小长度10(实际效果会更严格,因为复杂度要求也会算长度)。ucredit=-1:至少1个大写字母。lcredit=-1:至少1个小写字母。dcredit=-1:至少1个数字。ocredit=-1:至少1个特殊字符(如@#$)。
不同系统可能文件路径不同:Debian/Ubuntu 在 /etc/pam.d/common-password,相应配置类似。
对于Ubuntu/Debian:
sudo vim /etc/pam.d/common-password
找到类似行前面的 pam_unix.so 行,在其后面添加 pam_pwquality.so 参数,或直接使用下面的行替换(请先备份):
password requisite pam_pwquality.so retry=3 minlen=10 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
3. 限制历史密码(防止重复使用)
在同一个PAM配置文件中,找到 pam_unix.so 所在行,添加 remember=5 表示记录最近5次密码,禁止重复使用。
示例(CentOS):
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
示例(Ubuntu):
password [success=1 default=ignore] pam_unix.so obscure sha512 remember=5
修改后保存文件。
避坑指南
- 修改前备份原文件:养成好习惯,出错时可恢复。
sudo cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak
- 不要直接编辑
system-auth时使用authconfig工具:如果系统用了authconfig或authselect,直接编辑文件会被覆盖。建议先使用authselect启用对应配置文件,再手动调整。 - root账户不受PAM限制:pwquality对root不生效,但普通用户会受控。
- 测试新密码前不要断开当前SSH:如果配置错误导致无法登录,可以保留当前连接排查。
- 不同发行版PAM文件名差异:CentOS 8+ 改用
password-auth和system-auth共存,Ubuntu 则是common-password。请确认当前系统的文件。
效果验证
验证长度与有效期
# 查看当前用户的密码过期信息
sudo chage -l 用户名
如果刚配置的政策没有立即生效到已有用户,需要手动强制:
sudo chage -M 90 用户名 # 设置最大天数
sudo chage -m 7 用户名 # 设置最小天数
验证复杂度规则
切换到一个普通用户(或新建测试用户):
sudo passwd 测试用户
输入简单密码(如 123456),系统应报错并拒绝。
再输入一个符合复杂规则的密码(如 Abc@12345),应当能成功修改。
验证历史密码限制
连续修改密码,尝试使用前几次用过的密码,系统会提示“密码已经被使用过”。
高频问题
- Q:修改
login.defs后,已有用户的密码有效期不变怎么办? A:login.defs仅影响新创建的用户。对现有用户需手动执行chage -M 90 用户名或等待下次密码修改。 - Q:
pam_pwquality没生效? A:确认该模块已安装(yum install pam_pwquality或apt install libpam-pwquality)。 - Q:密码规则太严,用户无法设置合规密码? A:适当放宽参数,比如将
minlen=8,减少特殊字符要求(ocredit=0)。
结尾
本文的 Linux服务器用户密码策略 配置步骤已经在多台测试机上验证,只要按顺序操作,基本不会出现意外。
建议每季度重新检查一次策略是否符合当前安全要求。
如果遇到特殊的报错,优先检查 PAM 日志(/var/log/secure 或 /var/log/auth.log)来定位问题。