当前位置:首页 > Linux > 正文

如何linux的shadow

在 Linux 中, /etc/shadow 存储加密密码,仅 root 可读写;用 passwd 命令修改用户密码,勿直接编辑该

/etc/shadowLinux 系统中至关重要的安全机制核心组件,其设计目标是隔离敏感的用户密码数据,并将其与存储基础账户信息的 /etc/passwd 文件分离,这种分离显著提升了系统的安全性,因为传统上所有用户都可读的 /etc/passwd 包含未加密的密码(早期版本),攻破者一旦获取该文件即可尝试免费密码,而 /etc/shadow 仅允许超级用户 (root) 和极少数特权进程读取,从而有效保护了密码哈希值及其他关键安全参数,以下是对其功能、结构、管理及安全实践的深度解析:


核心作用与安全价值

  1. 密码存储中枢

    存储经加密算法处理后的用户密码哈希值(而非明文),支持多种现代哈希算法(如 SHA-256, SHA-512)。

  2. 账户状态控制

    定义账户是否被锁定 (L)、密码过期状态 (NP/P)、最后一次密码变更时间等元数据。

  3. 密码策略强制执行

    通过字段约束实现最小/最大密码年龄、提前警告期等策略,强制用户定期更新密码。

  4. 防暴力免费增强

    结合 PAM(可插拔认证模块)限制登录尝试次数,延迟响应时间,进一步降低字典攻破风险。


文件结构详解(以标准行为例)

字段序号 内容示例 含义
root 用户名,必须与 /etc/passwd 完全匹配
$6$rounds=656000$... 加密密码哈希值

格式:$ID$SALT$HASH

ID标识算法类型(如6=SHA-512)

18576 上次密码修改天数(距1970年1月1日的天数)
0 最小密码有效期(天)

设为0表示立即可更改

99999 最大密码有效期(天)

设为99999≈无限期

7 密码过期前警告天数

用户将在7天后收到变更提示

-1 密码过期后宽限期(天)

-1表示禁止过期后仍能登录

-1 账户禁用天数(自过期日起)

-1表示不自动启用

0 保留字段,暂未使用
/bin/bash 登录Shell路径(实际由 /etc/passwd 决定)

关键状态标记解析

标记位置 取值 含义
前置符 本地无有效密码(仅用于外部认证如LDAP)
前置符 账户被锁定
第⑦字段 -1 密码永不过期
第⑧字段 0 密码过期后立即禁用账户


核心管理命令与操作示例

修改密码 & 更新 shadow

# 交互式修改密码(自动同步至 shadow) passwd alice # 批量非交互式修改(适用于脚本) echo "alice:NEW_SECURE_PASSWORD" | chpasswd

原理:passwd 命令会重新计算新密码的哈希值,并更新 /etc/shadow 对应行的第二个字段。

账户锁定/解锁

# 锁定账户(在哈希前加感叹号) passwd -l bob # → /etc/shadow: bob:!$6$... # 解锁账户(移除感叹号) passwd -u bob # → /etc/shadow: bob:$6$...

注意:直接编辑 /etc/shadow 需使用 vipw 命令(安全编辑器),手动修改可能导致语法错误!

如何linux的shadow 第1张

查看指定用户影子条目

sudo grep ^username /etc/shadow # 输出示例:alice:$6$randomSaltValueHere...:18576:0:99999:7:::

替代方案:getent shadow username(更规范且跨平台)

重置密码为空(慎用!)

# 生成空密码哈希(仅用于特殊场景) openssl passwd -1 '' | cut -d: -f2 | sudo tee /etc/shadow.d/temp && sudo visudo -f && sudo su user # 此操作极高危!

警告:空密码会使账户极易被攻破,生产环境严禁使用!

如何linux的shadow 第2张

安全配置最佳实践

策略维度 推荐配置 实现命令
密码复杂度 启用强复杂度策略 编辑 /etc/security/pwquality.conf

设置 minlen=14, ucredit=-1, dcredit=-1

历史记录清理 禁止重用最近10次密码 pwhistory remember=10
默认策略 新用户创建时强制复杂密码 useradd -p $(openssl passwd -6 mysecurepass) newuser
日志审计 记录密码变更事件 确保 auditd 服务运行且规则包含 key=password-change
访问控制 限制物理访问 + SSH密钥认证 禁用密码登录:visudoers 注释掉 PasswordAuthentication yes


常见故障排查

场景1:密码正确但无法登录

可能原因

  • 账户被锁定(检查 /etc/shadow 是否有 前缀)
  • 密码过期且未及时更改(查看第③字段是否小于当前时间戳)
  • SELinux/AppArmor 阻止了认证进程
  • PAM 配置冲突(检查 /etc/pam.d/system-auth)

解决方案

# 检查账户状态 getent shadow userA # 如果显示 !开头,执行解锁: passwd -u userA # 若密码过期,强制用户下次登录时更改: chage -E -1 userA # 设置为永不过期(临时补救)

场景2:passwd: Authentication token manipulation error

根本原因:/etc/shadow 文件损坏或权限错误。

修复步骤

如何linux的shadow 第3张

# 检查文件完整性 cksum /etc/shadow > /tmp/shadow.checksum # 对比原始安装包中的校验值(RPM/Debian包提供) # 若校验失败,从备份恢复: sudo cp /backup/etc/shadow /etc/shadow # 修复权限: sudo chown root:root /etc/shadow && chmod 600 /etc/shadow


相关问答FAQs

Q1: 如何在不显示明文的情况下查看用户的密码策略?

:使用 chage -l [用户名] 命令,该命令会显示密码有效期、最后修改时间、过期警告天数等信息,但不会泄露密码哈希值。

$ chage -l alice Last password change : Aug 15, 2023 Password expires : never 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

Q2: 如果误删了 /etc/shadow 文件该怎么办?

:立即采取以下紧急措施:

  1. 停止所有登录会话:systemctl stop getty@tty[1-6].service(物理机)或封禁SSH端口。
  2. 从备份恢复:若有近期备份,直接复制回原位置:sudo cp /backup/etc/shadow /etc/shadow。
  3. 重建基础条目:若无备份,需为每个用户重新设置密码:passwd username,系统会自动生成新条目。
  4. 验证权限:确保文件属主为 root:root,权限为 600:sudo chown root:root /etc/shadow && chmod 600 /etc/shadow。
  5. 重启必要服务:systemctl start getty@tty[1-6].service(物理机)或重新开放SSH。

重要提示:此操作会导致所有用户密码失效,必须在救援模式下执行!建议日常定期备份 /etc/shadow 文件

0