24·用户与权限进阶

密码管理与 /etc/shadow

passwdshadow

第 24 课:密码管理与 /etc/shadow

学习目标

通过本课学习,你将能够:

  1. 理解 /etc/shadow 文件的格式、每个字段的含义及其在系统安全中的核心作用。
  2. 熟练使用 passwdchage 命令来管理用户密码及密码策略。
  3. 识别并解读用户账户的密码状态(如锁定、过期)。
  4. 掌握基本的密码安全最佳实践。

核心概念

在 Linux 系统中,用户密码并非以明文形式存储。系统通过一个称为“哈希”的单向加密过程,将你的密码转换成一长串乱码。而 /etc/shadow 文件就是存储这些密码哈希以及相关账户安全策略的“保险箱”。与存储用户基础信息的 /etc/passwd 文件(所有人都可读)不同,/etc/shadow 仅对 root 用户和特定的系统组(如 shadow)可读,这是保护密码安全的第一道防线。

让我们逐行拆解一个 /etc/shadow 文件条目:

username:$6$salt$hashed_password:last_changed:min:max:warn:inactive:expire:reserved
  • username: 用户名。
  • $6$salt$hashed_password: 加密后的密码哈希。$6$ 表示使用 SHA-512 算法(目前常用)。
  • last_changed: 密码最后一次更改的日期(自1970年1月1日起的天数)。
  • min: 密码更改的最短间隔天数(防止用户频繁更改密码)。
  • max: 密码有效的最长天数(超过此天数,用户下次登录时必须更改密码)。
  • warn: 在密码到期前多少天开始警告用户。
  • inactive: 密码过期后,账户仍可登录的“宽限”天数。
  • expire: 账户的绝对过期日期(自1970年1月1日起的天数)。
  • reserved: 保留字段。

理解这个结构,你就能像侦探一样解读一个账户的“健康状况”。

代码示例

1. 查看并解析 /etc/shadow(需 root 权限)

# 1. 查看普通用户的 shadow 信息
sudo grep "^your_username:" /etc/shadow
# 示例输出(各字段已用 : 分隔):
# testuser:$6$...:19544:0:99999:7:::

# 2. 使用 `chage` 命令更直观地查看密码策略(无需手动计算日期)
sudo chage -l your_username
# 示例输出:
# Last password change				: Jul 01, 2023
# Password expires				: Sep 29, 2023
# Password inactive				: never
# Account expires				: never
# Minimum number of days between password change	: 0
# Maximum number of days between password change	: 99999
# Number of days of warning before password expires	: 7

2. 使用 passwdchage 管理密码与策略

# 1. 管理员为用户 `alice` 设置一个初始密码
sudo passwd alice
# 系统会提示你输入并确认新密码。

# 2. 管理员强制用户 `alice` 在下次登录时修改密码
sudo passwd --expire alice

# 3. 设置密码策略:要求每90天修改一次,到期前14天警告,密码更改后至少1天才能再次修改。
sudo chage -M 90 -W 14 -m 1 alice

# 4. 设置账户的绝对过期日期(例如,2024年12月31日)
sudo chage -E 2024-12-31 alice

# 5. 锁定/解锁一个用户账户(等效于在密码哈希前加 `!` 或 `!!`)
sudo passwd --lock bob
sudo passwd --unlock bob

3. 一个简单的脚本:批量检查即将过期的密码

#!/bin/bash
# check_password_expiry.sh - 检查14天内即将过期的用户密码
EXPIRY_DAYS=14

# 获取当前日期的秒数(自1970-01-01起)
current_date_seconds=$(date +%s)

# 遍历 /etc/shadow 中有密码的普通用户(排除系统账户)
while IFS=: read -r user _ last_change _ max_days _ _ _ _; do
    # 计算密码过期日期的秒数
    expire_date_seconds=$((last_change * 86400 + max_days * 86400))
    # 计算距离过期的剩余天数
    days_remaining=$(( (expire_date_seconds - current_date_seconds) / 86400 ))
    
    # 如果剩余天数小于等于警告天数且大于0,则发出提醒
    if [[ $days_remaining -le $EXPIRY_DAYS && $days_remaining -gt 0 ]]; then
        echo "警告: 用户 '$user' 的密码将在 $days_remaining 天后过期。"
    fi
done < /etc/shadow

运行方法: sudo bash check_password_expiry.sh

实践练习

  1. 基础分析:使用 sudo chage -l <你的用户名> 命令,查看并解释你个人账户的每一项密码策略输出。
  2. 策略实施:为一个测试用户 student1 设置以下策略:密码最长有效期为 60 天,到期前 10 天警告,过期后宽限 5 天。完成后,用 chage -l 验证你的设置。
  3. 场景处理:用户 tempuser 因项目结束,其账户需要在下周五(请计算具体日期)自动失效。请使用一条命令完成此设置。

常见错误

  1. 直接编辑 /etc/shadow 文件:这非常危险!手动编辑可能导致格式错误,从而使所有用户无法登录。应始终使用 passwdchage 等专用工具。
  2. 忽略 /etc/login.defs 的默认策略:当使用 useradd 创建新用户时,默认的密码策略(如 PASS_MAX_DAYS)是在 /etc/login.defs 文件中定义的。chage 的设置会覆盖此默认值。
  3. 误用 chage-d 0passwd -e:两者都强制用户下次登录时改密码,但 -d 设置的是“上一次修改的日期”。-d 0 表示设置为1970年1月1日,-d today-d $(date +%Y-%m-%d) 更直观。
  4. 混淆账户锁定与密码锁定passwd --lock 是在密码哈希前加 !,而 usermod -L 也是类似操作。但 userdel 是删除用户,usermod -L 是锁定,请勿混淆命令。

小结

  • /etc/shadow 是存储密码哈希和安全策略的核心文件,权限严格,是系统安全的关键。
  • 主要的管理工具是 passwd(用于设置密码)和 chage(用于设置和查看密码及账户过期策略)。
  • 密码策略包括最短/最长修改周期、警告期限、宽限期和账户绝对过期日,应根据安全要求合理配置。
  • 永远使用专用命令管理密码和策略,切勿直接编辑系统关键文件。

掌握了 /etc/shadow 的秘密,你就掌控了用户访问系统的“钥匙”生命周期。下一课,我们将学习如何安全地授予部分用户管理权限,即 sudo 提权配置。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「sudo 提权与配置」 以巩固所学知识。