news 2026/6/26 2:19:23

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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$rounds=656000$salt$hash...:19000:0:99999:7::: alice:$6$rounds=656000$salt$hash...:19100:7:90:5:10:19200: bob:$6$rounds=656000$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$sudogrep"authentication 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/shadow

3. 应急恢复场景

# ⚠️ 场景:/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/shadow

4. passwd <-> shadow 转换脚本

# 检查哪些用户可能有问题$cat>check_password_storage.sh<<'SCRIPT' #!/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.sh

5. 相关安全配置

# PAM 配置确保使用 shadow(Debian/Ubuntu)$greppam_unix /etc/pam.d/common-password password[success=1default=ignore]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:shadow
RHEL/CentOS/Fedora影子密码(默认)000 root:root (!)
Arch Linux影子密码(默认)600 root:root
Alpine Linux影子密码(默认)600 root:shadow

RHEL 的差异: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权限应为640000(取决于发行版)
  • 永远不要手动运行pwunconv将密码移回/etc/passwd
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 2:18:14

中小企业建站困境:为什么“便宜“反而最贵?

一、一个被反复验证的悖论2026年&#xff0c;中国中小企业建站市场呈现出一种奇特的分化&#xff1a;一方面&#xff0c;AI建站工具的普及让"10分钟上线"成为标配&#xff0c;建站成本从数万元降至数千元甚至免费&#xff1b;另一方面&#xff0c;超过70%的企业网站在…

作者头像 李华
网站建设 2026/6/26 2:14:21

职场部门汇报PPT制作工具怎么选?我的长期实测心得

一、前言&#xff1a;职场汇报PPT的制作核心要点&#xff08;一&#xff09;职场汇报PPT的核心定位不管是企业员工还是团队管理者&#xff0c;定期制作部门汇报PPT是职场基础工作。这类PPT区别于创意宣传类作品&#xff0c;无需复杂花哨的设计&#xff0c;核心以版式整洁、逻辑…

作者头像 李华
网站建设 2026/6/26 2:13:52

PySpark + Delta Lake 实现生产级 Type 2 SCD 最佳实践

1. 项目概述&#xff1a;为什么在 Azure Synapse 上用 PySpark 实现 Type 2 SCD 不是“炫技”&#xff0c;而是刚需我在金融数据平台团队干了七年&#xff0c;经手过二十多个数仓迁移和实时主数据治理项目。每次一提到“维度表历史追踪”&#xff0c;客户第一反应往往是&#x…

作者头像 李华
网站建设 2026/6/26 2:13:41

Spaceship Titanic机器学习入门:二分类实战与特征工程精要

1. 项目概述&#xff1a;这不是一场太空灾难&#xff0c;而是一次扎实的机器学习入门实战“Spaceship Titanic”这个名字一出来&#xff0c;很多人第一反应是&#xff1a;又一个Kaggle经典赛题&#xff1f;没错&#xff0c;但它远不止是“Titanic生存预测”的太空翻版。我带过几…

作者头像 李华
网站建设 2026/6/26 2:12:45

TscanPlus:一站式内网安全扫描工具实战配置与优化指南

1. 项目概述&#xff1a;为什么我们需要一个“一站式”的内网安全工具&#xff1f;如果你也像我一样&#xff0c;长期负责企业或组织的内部网络安全运维&#xff0c;那你一定对下面这个场景深恶痛绝&#xff1a;为了摸清内网里到底有哪些“活”着的设备&#xff0c;你得先掏出N…

作者头像 李华
网站建设 2026/6/26 2:12:26

PySpark入门实战:从单机Pandas到TB级分布式数据处理

1. 为什么一个有十年数据工程实战经验的人&#xff0c;会坚持用 PySpark 教新人而不是直接上 Pandas 或 Dask&#xff1f;我带过三十多个从零起步的数据分析转行学员&#xff0c;也给二十多家中小企业的数据团队做过技术选型咨询。每次聊到“该学什么”&#xff0c;总有人脱口而…

作者头像 李华