chage 命令 #
chage
命令用于更改用户密码过期信息。它允许系统管理员设置密码的有效期限、强制用户定期更改密码,以及控制账户的过期时间,从而增强系统安全性。
语法 #
chage [选项] 用户名
常用选项 #
选项 | 描述 |
---|---|
-d, --lastday 日期 |
设置上次更改密码的日期(YYYY-MM-DD 或天数) |
-E, --expiredate 日期 |
设置账户过期日期(YYYY-MM-DD 或天数) |
-I, --inactive 天数 |
设置密码过期后账户被禁用前的天数 |
-l, --list |
显示账户的密码过期信息 |
-m, --mindays 天数 |
设置两次密码更改之间的最小天数 |
-M, --maxdays 天数 |
设置密码的最大有效天数 |
-W, --warndays 天数 |
设置密码过期前的警告天数 |
-h, --help |
显示帮助信息 |
日期格式 #
chage
命令中的日期可以使用以下格式:
- YYYY-MM-DD:例如 2023-12-31
- 天数:从 1970 年 1 月 1 日起的天数
- 特殊值:
-1
:永不过期0
:立即过期(用于-E
选项)或立即强制更改密码(用于-d
选项)
常见用法 #
1. 显示用户的密码过期信息 #
chage -l username
输出示例:
最近一次密码修改时间 :1月 15, 2023
密码过期时间 :从不
密码失效时间 :从不
账户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期前警告的天数 :7
2. 设置密码的最大有效期 #
chage -M 90 username
这将要求用户每 90 天更改一次密码。
3. 设置密码更改的最小间隔 #
chage -m 7 username
这将要求用户在更改密码后至少等待 7 天才能再次更改。
4. 设置密码过期前的警告期 #
chage -W 14 username
这将在密码过期前 14 天开始警告用户。
5. 设置密码过期后的宽限期 #
chage -I 7 username
这将允许用户在密码过期后 7 天内仍然可以登录并更改密码,之后账户将被锁定。
6. 设置账户过期日期 #
chage -E 2023-12-31 username
这将设置账户在 2023 年 12 月 31 日过期。
7. 设置账户永不过期 #
chage -E -1 username
8. 强制用户在下次登录时更改密码 #
chage -d 0 username
9. 设置上次密码更改日期 #
chage -d 2023-01-15 username
10. 一次性设置多个密码策略 #
chage -m 7 -M 90 -W 14 -I 3 username
这将设置密码最小年龄为 7 天,最大年龄为 90 天,警告期为 14 天,宽限期为 3 天。
交互式使用 #
不带选项运行chage
命令将进入交互式模式:
chage username
系统会提示输入各种密码过期设置。
密码过期计算 #
密码过期日期的计算方式:
- 上次更改密码的日期 + 最大密码有效天数 = 密码过期日期
- 密码过期日期 - 警告天数 = 开始警告的日期
- 密码过期日期 + 宽限期 = 账户锁定日期
相关文件 #
/etc/shadow
:存储用户密码和过期信息/etc/login.defs
:定义默认的密码过期策略
相关命令 #
passwd
:设置或更改用户密码usermod
:修改用户账户useradd
:创建新用户userdel
:删除用户shadow
:密码和账户过期时间文件格式
实用示例 #
1. 设置符合安全策略的密码过期 #
# 设置90天密码过期,提前14天警告,7天宽限期
chage -M 90 -W 14 -I 7 username
2. 为临时用户设置账户过期 #
# 创建一个30天后过期的临时用户
useradd -m tempuser
passwd tempuser
chage -E $(date -d "+30 days" +%Y-%m-%d) tempuser
3. 批量设置密码过期策略 #
#!/bin/bash
# 为所有普通用户设置密码过期策略
for user in $(awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd); do
echo "Setting password policy for user: $user"
chage -M 90 -m 1 -W 7 -I 14 $user
done
4. 检查即将过期的密码 #
#!/bin/bash
# 查找30天内密码将过期的用户
echo "Users with passwords expiring in the next 30 days:"
echo "------------------------------------------------"
for user in $(cut -d: -f1 /etc/passwd); do
# 获取密码过期日期
expiry=$(chage -l $user | grep "Password expires" | cut -d: -f2)
# 跳过永不过期的密码
if [[ "$expiry" == *"never"* ]]; then
continue
fi
# 转换日期格式
expiry_date=$(date -d "$expiry" +%s 2>/dev/null)
today=$(date +%s)
days_left=$(( (expiry_date - today) / 86400 ))
# 检查是否在30天内过期
if [[ $days_left -ge 0 ]] && [[ $days_left -le 30 ]]; then
echo "$user: Password will expire in $days_left days"
fi
done
5. 设置新用户的初始密码策略 #
#!/bin/bash
# 创建新用户并设置密码策略
username=$1
if [ -z "$username" ]; then
echo "Usage: $0 username"
exit 1
fi
# 创建用户
useradd -m $username
echo "Created user: $username"
# 生成随机密码
password=$(openssl rand -base64 12)
echo "$username:$password" | chpasswd
echo "Initial password: $password"
# 设置密码策略
chage -d 0 -m 1 -M 90 -W 7 -I 14 $username
echo "Password policy set: Force change on first login, 90-day expiry"
# 显示结果
chage -l $username
故障排除 #
1. 日期格式错误 #
错误消息:chage: invalid date 'invalid-date'
解决方法:
- 使用正确的日期格式:YYYY-MM-DD
- 或使用天数(从 1970 年 1 月 1 日起)
- 或使用特殊值(如-1 表示永不过期)
2. 权限问题 #
错误消息:chage: Permission denied
解决方法:
# 使用sudo运行命令
sudo chage -l username
3. 用户不存在 #
错误消息:chage: user 'username' does not exist
解决方法:
- 检查用户名是否正确
- 确认用户是否存在于系统中
提示 #
- 使用
-l
选项查看当前设置,然后再进行更改 - 设置合理的密码过期时间,太短会导致用户频繁更改密码,可能导致使用简单密码
- 设置适当的警告期,让用户有足够的时间更改密码
- 对于系统账户,通常应设置为永不过期(
-M -1
) - 对于临时账户,设置明确的账户过期日期
- 使用
-d 0
选项强制用户在首次登录时更改默认密码 - 在生产环境中,考虑使用集中式认证系统(如 LDAP)管理密码策略
- 定期审核用户的密码过期设置,确保符合组织的安全策略
- 结合
passwd
和chage
命令可以全面管理用户的密码安全