第 24 课:密码管理与 /etc/shadow
学习目标
通过本课学习,你将能够:
- 理解
/etc/shadow文件的格式、每个字段的含义及其在系统安全中的核心作用。 - 熟练使用
passwd和chage命令来管理用户密码及密码策略。 - 识别并解读用户账户的密码状态(如锁定、过期)。
- 掌握基本的密码安全最佳实践。
核心概念
在 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. 使用 passwd 和 chage 管理密码与策略
# 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
实践练习
- 基础分析:使用
sudo chage -l <你的用户名>命令,查看并解释你个人账户的每一项密码策略输出。 - 策略实施:为一个测试用户
student1设置以下策略:密码最长有效期为 60 天,到期前 10 天警告,过期后宽限 5 天。完成后,用chage -l验证你的设置。 - 场景处理:用户
tempuser因项目结束,其账户需要在下周五(请计算具体日期)自动失效。请使用一条命令完成此设置。
常见错误
- 直接编辑
/etc/shadow文件:这非常危险!手动编辑可能导致格式错误,从而使所有用户无法登录。应始终使用passwd和chage等专用工具。 - 忽略
/etc/login.defs的默认策略:当使用useradd创建新用户时,默认的密码策略(如PASS_MAX_DAYS)是在/etc/login.defs文件中定义的。chage的设置会覆盖此默认值。 - 误用
chage的-d 0与passwd -e:两者都强制用户下次登录时改密码,但-d设置的是“上一次修改的日期”。-d 0表示设置为1970年1月1日,-d today或-d $(date +%Y-%m-%d)更直观。 - 混淆账户锁定与密码锁定:
passwd --lock是在密码哈希前加!,而usermod -L也是类似操作。但userdel是删除用户,usermod -L是锁定,请勿混淆命令。
小结
/etc/shadow是存储密码哈希和安全策略的核心文件,权限严格,是系统安全的关键。- 主要的管理工具是
passwd(用于设置密码)和chage(用于设置和查看密码及账户过期策略)。 - 密码策略包括最短/最长修改周期、警告期限、宽限期和账户绝对过期日,应根据安全要求合理配置。
- 永远使用专用命令管理密码和策略,切勿直接编辑系统关键文件。
掌握了 /etc/shadow 的秘密,你就掌控了用户访问系统的“钥匙”生命周期。下一课,我们将学习如何安全地授予部分用户管理权限,即 sudo 提权配置。
练习编辑器
rust
Loading...