Linux命令-pwconv(从 /etc/passwd 创建 /etc/shadow 影子密码)

发布时间:2026/6/26 2:19:26
Linux命令-pwconv(从 /etc/passwd 创建 /etc/shadow 影子密码) Linux命令-pwconv从 /etc/passwd 创建 /etc/shadow 影子密码快速参考命令语法背景知识传统密码存储不安全影子密码安全工作原理实战示例1. 基础转换2. 转换前后的安全审计3. 应急恢复场景4. passwd - shadow 转换脚本5. 相关安全配置发行版差异shadow 文件格式详解powconv vs pwunconv总结快速参考pwconv是一个系统安全工具用于将传统/etc/passwd文件中的加密密码迁移到/etc/shadow文件中实现影子密码Shadow Password机制。影子密码是现代 Linux 系统的标准安全实践——将密码哈希与用户公开信息分离存储防止普通用户读取加密后的密码。在影子密码普及之前所有用户的加密密码都存放在/etc/passwd中任何用户可读。pwconv完成了 Linux 安全史上最重要的一次迁移——把密码从公开陈列移到专人保管。命令语法pwconv [选项]背景知识传统密码存储不安全/etc/passwd所有用户可读 root:xY7zK9pQ3sN2w:0:0:root:/root:/bin/bash alice:aL8bC3dE5fG7h:1000:1000:Alice:/home/alice:/bin/bash bob:bN9dF1gH3iJ5k:1001:1001:Bob:/home/bob:/bin/bash # ^^^^^^^^^^^^^^^^ 任何人都能读取加密密码影子密码安全/etc/passwd所有用户可读 root:x:0:0:root:/root:/bin/bash alice:x:1000:1000:Alice:/home/alice:/bin/bash bob:x:1001:1001:Bob:/home/bob:/bin/bash # ^ 密码字段被替换为 x /etc/shadow仅 root 可读 root:$6$rounds656000$salt$hash...:19000:0:99999:7::: alice:$6$rounds656000$salt$hash...:19100:7:90:5:10:19200: bob:$6$rounds656000$salt$hash...:19200:0:99999:7::: # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 加密密码在此工作原理pwconv 的处理流程 1. 读取 /etc/passwd找到密码字段第二个冒号分隔字段 2. 如果不是 x已经是影子密码 - 从 passwd 中提取密码哈希 - 写入 /etc/shadow 对应行 - 将 /etc/passwd 的密码字段替换为 x 3. 如果 /etc/shadow 已存在对应条目 - 不覆盖 /etc/shadow 中的密码 4. 清理移除 /etc/shadow 中没有对应 passwd 用户的条目实战示例1. 基础转换# 检查当前密码存储模式$head-3/etc/passwd root:x:0:0:root:/root:/bin/bash# ^ 密码字段是 x说明已使用影子密码# 如果发现密码字段不是 x少见但可能出现在旧系统迁移中$sudogrep^[^:]*:[^x!*]/etc/passwd# 有输出表示还有用户使用传统密码存储# 执行转换$sudopwconv# 验证转换结果$sudols-l/etc/shadow -rw-r-----1root shadow1234Jun1410:00 /etc/shadow# 权限必须root 可读写shadow 组可读# 确认 passwd 中密码字段都变成了 x$grep-v^[^:]*:x:/etc/passwd# 不应该有输出或者只有系统账户如 nobody 用 !/*2. 转换前后的安全审计# 转换前检查 auth.log$sudogrepauthentication failure/var/log/auth.log# 查看 /etc/shadow 内容只有 root 可以$sudocat/etc/shadow|head-3root:$6$kVdNEZBT$HVSZpR...:19000:0:99999:7::: daemon:*:18485:0:99999:7::: bin:*:18485:0:99999:7:::# 解读 shadow 文件格式# 用户名:加密密码:上次修改日期:最小天数:最大天数:警告天数:不活动天数:过期日期:保留# 验证 shadow 文件权限$stat/etc/shadow File: /etc/shadow Size:1234Blocks:8IO Block:4096regularfileDevice:259,2Inode:123456Links:1Access:(0640/-rw-r-----)Uid:(0/ root)Gid:(42/ shadow)# 如果权限不对修复$sudochownroot:shadow /etc/shadow $sudochmod640/etc/shadow3. 应急恢复场景# ⚠️ 场景/etc/shadow 文件损坏或误删# pwconv 可以从 /etc/passwd 重新生成 shadow前提是 passwd 中有密码哈希# 备份当前状态$sudocp/etc/passwd /etc/passwd.bak $sudocp/etc/shadow /etc/shadow.bak2/dev/null# 模拟查看当前 shadow 文件的密码$sudogrepalice /etc/shadow# 如果 /etc/shadow 丢失$sudorm/etc/shadow# 模拟丢失$sudopwconv# 从 passwd 重建 shadow$ls-l/etc/shadow# shadow 文件已重新创建# ⚠️ 注意如果 passwd 中密码字段已经是 x# pwconv 无法恢复密码哈希因为密码仅在 shadow 中# 真正的恢复方式从备份恢复$sudocp/etc/shadow.bak /etc/shadow $sudochownroot:shadow /etc/shadow $sudochmod640/etc/shadow4. passwd - shadow 转换脚本# 检查哪些用户可能有问题$catcheck_password_storage.shSCRIPT #!/bin/bash echo 密码存储在 passwd 中的用户不安全 awk -F: length($2) 1 $2 ! x {print $1 : $2} /etc/passwd echo echo /etc/shadow 统计 echo Total users in shadow: $(wc -l /etc/shadow) echo Users with password: $(grep -c ^\w\:\$ /etc/shadow) echo Locked accounts (! or *): $(grep -c ^\w\:[!*] /etc/shadow) echo Empty password: $(grep -c ^\w\:: /etc/shadow) echo echo shadow 权限检查 stat -c %a %U:%G %n /etc/shadow if [ $(stat -c %a /etc/shadow) ! 640 ]; then echo WARNING: /etc/shadow permissions should be 640 fi SCRIPT$bashcheck_password_storage.sh5. 相关安全配置# PAM 配置确保使用 shadowDebian/Ubuntu$greppam_unix /etc/pam.d/common-password password[success1defaultignore]pam_unix.so obscure sha512 shadow# shadow 参数表示使用影子密码# PAM 配置RHEL/CentOS$greppam_unix /etc/pam.d/system-auth password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok# 验证 PAM 使用 sha512 加密$grepENCRYPT_METHOD /etc/login.defs ENCRYPT_METHOD SHA512# 现代系统推荐使用 YESCRYPT比 SHA512 更安全$grepENCRYPT_METHOD /etc/login.defs ENCRYPT_METHOD YESCRYPT# 查看当前密码的加密方法$sudogrep^\$/etc/shadow|head-1|cut-d$-f26# $6$ SHA-512, $y$ YESCRYPT, $5$ SHA-256发行版差异发行版默认/etc/shadow 权限Debian/Ubuntu影子密码默认640 root:shadowRHEL/CentOS/Fedora影子密码默认000 root:root (!)Arch Linux影子密码默认600 root:rootAlpine Linux影子密码默认600 root:shadowRHEL 的差异RHEL 默认将/etc/shadow权限设为000只有 root 可以通过特权访问这比640更严格。理论上更安全但可能会影响某些监控工具。shadow 文件格式详解alice:$6$salt$hash:19000:7:90:5:10:19200: │ │ │ │ │ │ │ │ └─ 保留字段 │ │ │ │ │ │ │ └─ 账户过期日期epoch 天数 │ │ │ │ │ │ └─ 过期后宽限天数-1 表示禁用 │ │ │ │ │ └─ 过期前警告天数 │ │ │ │ └─ 最大密码有效期99999 永不 │ │ │ └─ 最小密码使用天数 │ │ └─ 上次修改日期自 1970-01-01 的天数 │ └─ 加密密码! 或 * 表示锁定空表示无密码 └─ 用户名powconv vs pwunconv命令功能风险pwconv密码迁移到/etc/shadow低提升安全性pwunconv密码迁移回/etc/passwd高降低安全性# ⚠️ pwunconv不推荐降低安全性$sudopwunconv# 这会将 /etc/shadow 中的密码哈希移回 /etc/passwd# 密码字段变为可被所有用户读取 → 增加了暴力破解风险# 回滚立即重新转换为影子密码$sudopwconv总结pwconv在现代 Linux 系统中通常只在安装时运行一次但理解它的作用很重要将密码从/etc/passwd所有人可读迁移到/etc/shadow仅 root 可读现代系统默认使用影子密码/etc/passwd中密码字段为x相关安全文件/etc/shadow权限应为640或000取决于发行版永远不要手动运行pwunconv将密码移回/etc/passwd