1.3.3 账户与密码策略(passwd、chage、登录限制)
账户与密码策略用于限制口令强度、控制账户有效期、避免暴力破解与未授权登录。本节以 passwd、chage 与登录限制为核心,配合 PAM 与 SSH 配置,给出可执行示例、排错与练习。
原理草图:账号认证与策略执行路径
1. passwd:密码设置与锁定(含示例与解释)
- 基本用法
- passwd 用户名:为指定用户设置或修改密码
- passwd:当前用户修改自身密码
- 账户锁定与解锁
- passwd -l 用户名:锁定账户(/etc/shadow 密码字段前加“!”)
- passwd -u 用户名:解锁账户
- 密码状态查看
- passwd -S 用户名:查看密码状态与最近修改时间
完整操作示例(包含解释与预期效果)
# 1) 创建测试用户
useradd -m opsdemo
# 2) 设置密码(交互式)
passwd opsdemo
# 预期:提示输入新密码并确认
# 3) 查看密码状态
passwd -S opsdemo
# 预期输出示例:opsdemo PS 2024-01-01 0 99999 7 -1
# 4) 锁定账户并验证
passwd -l opsdemo
passwd -S opsdemo
# 预期:状态变为 LK,/etc/shadow 对应字段前有 "!"
# 5) 解锁账户
passwd -u opsdemo
passwd -S opsdemo
# 预期:状态恢复为 PS
排错提示
- 锁定后仍可登录:可能是使用了密钥或 sudo 缓存,需清理 sudo 会话并检查 SSH 认证方式。
- passwd: Authentication token manipulation error:多因 /etc/shadow 权限异常,确保权限为 000 或 600,属主为 root。
2. chage:口令过期与账号生命周期(含示例与解释)
- 查看账号过期策略
- chage -l 用户名:显示密码最后修改、最小/最大有效期、警告与禁用时间
- 设置密码与账号策略
- chage -m 7 用户名:最小间隔 7 天
- chage -M 90 用户名:最大有效期 90 天
- chage -W 7 用户名:过期前 7 天警告
- chage -I 14 用户名:密码过期后 14 天禁用
- chage -E 2025-12-31 用户名:账号到期日
完整操作示例(包含解释与预期效果)
# 对已有用户设置生命周期策略
chage -m 7 -M 90 -W 7 -I 14 -E 2025-12-31 opsdemo
# 查看策略是否生效
chage -l opsdemo
# 预期:Minimum/Maximum Days, Warning Days, Inactive Days 显示为设置值
批量检查脚本示例(输出过期或即将过期用户)
#!/usr/bin/env bash
# file: check_expire_users.sh
# 作用:列出 14 天内将过期的账号
awk -F: '{print $1}' /etc/passwd | while read u; do
exp=$(chage -l "$u" | awk -F: '/Account expires/{print $2}' | xargs)
if [[ "$exp" != "never" ]]; then
exp_ts=$(date -d "$exp" +%s 2>/dev/null)
now_ts=$(date +%s)
if [[ -n "$exp_ts" && $(( (exp_ts - now_ts) / 86400 )) -le 14 ]]; then
echo "$u will expire on $exp"
fi
fi
done
排错提示
- chage: Permission denied:需要 root 权限。
- 日期格式错误:确保使用 YYYY-MM-DD。
3. 登录限制与口令策略(PAM/SSH,含配置与安装)
- PAM 口令复杂度
- 配置文件:/etc/pam.d/system-auth 或 /etc/pam.d/common-password
- 模块:pam_pwquality 或 pam_cracklib
- 失败登录限制
- 模块:pam_faillock 或 pam_tally2
- 远程登录限制
- 配置文件:/etc/ssh/sshd_config
安装依赖(不同发行版示例)
# RHEL/CentOS
yum install -y libpwquality
# Debian/Ubuntu
apt-get update
apt-get install -y libpam-pwquality
PAM 复杂度配置示例(RHEL 系)
# file: /etc/pam.d/system-auth
# 作用:最小长度 12,必须包含大小写/数字/特殊字符
password requisite pam_pwquality.so retry=3 minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok remember=5
retry=3:允许重试 3 次minlen=12:最小长度 12ucredit/lcredit/dcredit/ocredit=-1:至少包含 1 个大写/小写/数字/特殊字符remember=5:历史密码不可重复 5 次
失败登录锁定(pam_faillock 示例)
# file: /etc/pam.d/system-auth
auth required pam_faillock.so preauth silent deny=5 unlock_time=600
auth [default=die] pam_faillock.so authfail deny=5 unlock_time=600
account required pam_faillock.so
deny=5:失败 5 次锁定unlock_time=600:锁定 10 分钟
SSH 登录限制示例
# file: /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
AllowUsers opsadmin opsdemo
变更后生效与验证
# 重载服务
systemctl reload sshd
# 测试登录与改密
su - opsdemo
passwd
排错提示
- 修改 PAM 后无法登录:先保留一个已登录 root 会话,必要时回滚配置。
- SSH 禁用密码后无法登录:确认已部署密钥并测试 ssh -i key user@host。
4. 运维最佳实践与检查清单
- 密码与账号策略基线
- 最小长度 ≥ 12;定期修改(90 天)
- 历史密码不得重复(至少 5 次)
- 过期前 7 天提醒,过期后 14 天游离期
- 账户审计与清理
- 定期检查过期与锁定账号:chage -l、passwd -S
- 清理长期未使用账号,必要时锁定而非直接删除
- 变更验证
- 修改策略后使用测试用户验证登录、改密与锁定行为
- 修改 PAM 与 SSH 配置后重载服务并备份配置文件
检查命令清单(可直接执行)
# 查看所有用户状态
for u in $(awk -F: '{print $1}' /etc/passwd); do passwd -S "$u"; done
# 查看即将过期账号
./check_expire_users.sh
5. 练习
1. 创建用户 secuser,设置最小 7 天可改密、最大 60 天有效,并验证 chage -l 输出。
2. 配置 pam_faillock:失败 3 次锁定 5 分钟;尝试输入错误密码验证锁定效果。
3. 禁止 root 通过 SSH 登录,使用普通用户 + sudo 方式登录验证。
4. 写脚本统计 30 天内过期的账号并导出到 expire_users.txt。