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 权限异常,确保权限为 000600,属主为 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_pwqualitypam_cracklib
- 失败登录限制
- 模块:pam_faillockpam_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:最小长度 12
  • ucredit/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 -lpasswd -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