在Linux系统中,/etc/shadow
文件是存储用户密码加密信息的核心安全文件,它与/etc/passwd
文件配合工作:/etc/passwd
存储用户的基本信息(如用户名、UID、家目录等),而密码等敏感数据则迁移至/etc/shadow
,以避免普通用户通过读取/etc/passwd
获取密码哈希值,从而提升系统安全性,正确使用和管理/etc/shadow
文件是Linux系统安全运维的重要环节,本文将详细介绍其结构、查看方法、密码管理命令、安全配置及最佳实践。
/etc/shadow
文件的结构与字段说明
/etc/shadow
文件中的每一行对应一个用户,行内由9个字段组成,字段间用冒号()分隔,各字段的含义如下表所示:
字段序号 | 字段名称 | 含义说明 | 示例值 |
---|---|---|---|
1 | 用户名 | 与/etc/passwd 文件中的用户名对应,标识用户身份 |
root |
2 | 加密密码 | 存储用户密码的哈希值,若为空字符串()表示用户无密码(不安全);若为表示账户被锁定(无法登录) | $6$abc123$... (SHA-512哈希) |
3 | 上次修改密码时间 | 自1970年1月1日以来,距离上次修改密码的天数 | 18500 |
4 | 最小密码有效期 | 密码修改后,最少需要等待多少天才能再次修改(0表示可随时修改) | 0 |
5 | 最大密码有效期 | 密码在多少天后必须强制修改(99999表示永不过期) | 90 |
6 | 密码过期警告期 | 密码过期前多少天开始提醒用户(0表示不提醒) | 7 |
7 | 密码非活跃期 | 密码过期后,账户最多可多少天未登录(0表示过期立即禁用) | 30 |
8 | 账户过期时间 | 账户在多少天后被禁用(自1970年1月1日起计算,空字符串表示永不过期) | 19430 |
9 | 保留字段 | 系统保留字段,暂无特殊用途 | (空) |
查看/etc/shadow
由于/etc/shadow
文件包含敏感信息,其默认权限为000
(仅root用户可读写执行),普通用户无法直接访问,root用户可通过以下命令查看文件内容:
使用cat
或less
命令直接查看
# 直接查看文件全部内容(适合行数较少时) cat /etc/shadow # 分页查看(适合行数较多,支持上下翻页) less /etc/shadow
执行后,每行显示一个用户的密码信息,按q
键退出less
界面。
使用getent
命令查询指定用户
若仅需查看特定用户的密码策略信息,可通过getent
命令结合shadow
数据库查询:
getent shadow username
查看root
用户的信息:
getent shadow root # 输出示例:root:$6$abc123$...:18500:0:90:7:30:19430::
密码管理核心命令
passwd
命令:修改用户密码
passwd
是Linux中最常用的密码管理工具,普通用户可修改自己的密码,root用户可修改任意用户的密码,并支持锁定/解锁账户。
-
普通用户修改自身密码:
passwd
执行后需输入当前密码验证,再输入两次新密码(密码不会显示在终端)。
-
root用户修改其他用户密码:
passwd username
无需原密码验证,直接输入两次新密码即可。
-
锁定/解锁用户账户:
# 锁定账户(密码字段改为"*") passwd -l username # 解锁账户(恢复密码字段为哈希值) passwd -u username
锁定后,用户即使输入正确密码也无法登录(如
passwd -l root
可临时禁止root远程登录)。
chage
命令:管理密码策略
chage
(change age)命令用于修改用户密码的过期策略,包括有效期、警告期、非活跃期等,适合批量管理或精细化控制。
-
查看用户密码策略:
chage -l username
例如查看
testuser
的策略:chage -l testuser # 输出示例: # Last password change : Dec 31, 2023 # Password expires : Mar 30, 2024 # Password inactive : May 29, 2024 # Account expires : never # Minimum number of days between password change : 0 # Maximum number of days between password change : 90 # Number of days of warning before password expires : 7
-
修改密码有效期:
# 设置密码90天后过期(-M:Maximum) chage -M 90 username # 设置密码至少7天后才能修改(-m:Minimum) chage -m 7 username
-
设置密码过期警告期:
# 密码过期前7天开始提醒(-W:Warning) chage -W 7 username
-
设置密码非活跃期:
# 密码过期后30天未登录则禁用账户(-I:Inactive) chage -I 30 username
-
设置账户过期时间:
# 账户在2024年12月31日后禁用(-E:Expire) chage -E 2024-12-31 username
密码加密算法配置
/etc/shadow
中的密码哈希值采用不同加密算法生成,算法类型通过哈希值前缀标识(如$1$
表示MD5,$5$
表示SHA-256,$6$
表示SHA-512),当前主流系统默认使用SHA-512(安全性更高),可通过/etc/login.defs
文件或passwd
命令配置。
查看当前加密算法
grep "ENCRYPT_METHOD" /etc/login.defs
若未配置,可通过以下命令查看用户密码的哈希算法:
getent shadow username | cut -d: -f2 | cut -d$ -f2
输出6
表示SHA-512,5
表示SHA-256,1
表示MD5。
修改默认加密算法
编辑/etc/login.defs
文件,修改ENCRYPT_METHOD
参数:
vim /etc/login.defs # 添加或修改为: ENCRYPT_METHOD SHA512
修改后,新创建的用户或通过passwd
修改密码时,将自动使用SHA-512算法。
安全最佳实践
禁用空密码账户
检查/etc/shadow
中是否存在密码字段为空的用户(第二列为空字符串),若有则立即设置密码或锁定账户:
# 查找空密码用户 awk -F: '($2 == "") {print $1}' /etc/shadow
对找到的用户执行passwd username
设置密码,或passwd -l username
锁定。
定期修改密码策略
通过chage
命令为所有用户设置合理的密码有效期(如普通用户90天,管理员60天),避免长期使用同一密码:
# 批量设置所有用户密码90天后过期 for user in $(cut -d: -f1 /etc/passwd); do chage -M 90 $user done
备份与恢复/etc/shadow
定期备份/etc/shadow
文件,避免误操作导致系统无法登录:
# 备份到/home/backup/ cp /etc/shadow /home/backup/shadow.bak_$(date +%Y%m%d) # 恢复(需root权限) cp /home/backup/shadow.bak_20240101 /etc/shadow
限制root登录
直接锁定root密码(passwd -l root
),并通过sudo
机制授权普通用户执行管理员命令,减少root密码泄露风险。
相关问答FAQs
Q1: 如何查看用户的密码过期时间?
A: 使用chage
命令的-l
选项可查看用户的详细密码策略,包括过期时间。
chage -l username
输出中的“Password expires”字段即为密码过期日期(若为“never”则永不过期)。
Q2: 如何锁定或解锁用户账户?
A: 使用passwd
命令结合-l
(锁定)或-u
(解锁)选项。
# 锁定用户testuser passwd -l testuser # 解锁用户testuser passwd -u testuser
锁定后,用户即使输入正确密码也无法登录;解锁后恢复正常登录权限。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/25913.html