chage命令

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命令中的日期可以使用以下格式:

  1. YYYY-MM-DD:例如 2023-12-31
  2. 天数:从 1970 年 1 月 1 日起的天数
  3. 特殊值
    • -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

系统会提示输入各种密码过期设置。

密码过期计算 #

密码过期日期的计算方式:

  1. 上次更改密码的日期 + 最大密码有效天数 = 密码过期日期
  2. 密码过期日期 - 警告天数 = 开始警告的日期
  3. 密码过期日期 + 宽限期 = 账户锁定日期

相关文件 #

  • /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)管理密码策略
  • 定期审核用户的密码过期设置,确保符合组织的安全策略
  • 结合passwdchage命令可以全面管理用户的密码安全