Linux shadow 文件详解:恢复 root 密码的完整指南
一. shadow 文件简介在 Linux 系统中/etc/shadow文件用于存储用户密码的加密信息以及密码相关的策略属性。它与/etc/passwd文件配合使用passwd 文件保存用户基本信息且对所有用户可读而 shadow 文件中存放的加密密码仅对 root 用户可读从而提升了系统安全性。shadow 文件的每一行对应一个用户格式为用户名:加密密码:上次修改密码的日期:密码最小使用天数:密码最大使用天数:密码过期前的警告天数:密码过期后的宽限天数:账号失效日期:保留字段各个字段的含义如下用户名与 /etc/passwd 中的用户名一致。加密密码如果为空表示该用户没有密码如果是 ! 或 *表示账号被锁定无法通过密码登录。Ubantu就是在这里动了手脚让root用户没有办法登录。正常情况下这边应该是一个SHA256的值也就是用户加密的密码。上次修改密码的日期从 1970-01-01 开始的天数。密码最小使用天数两次修改密码之间最少间隔的天数防止频繁改回原密码。密码最大使用天数密码的有效期到期后强制用户修改密码。密码过期前的警告天数在密码过期前多少天开始向用户发送警告。密码过期后的宽限天数密码过期后用户仍可登录的天数超限后将锁定账号。账号失效日期从 1970-01-01 开始的天数超过此日期账号将被禁用。保留字段目前通常为空。管理员可以通过chage命令修改密码过期策略也可以使用passwd命令修改用户密码。对 shadow 文件的直接编辑通常使用vipw -s进行以确保文件锁定的安全性。可是Ubantu系统为了确保用户的安全默认禁用了管理员账号root他的Root密码是*占位符所以我们就没有办法使用管理员账号登录更没有办法修改root密码也就没有办法使用大部分的Root功能。虽然说Ubantu支持使用SUDO来暂时性的切换超级用户权限但被禁用了许多功能。二. 具体操作当 Ubuntu 系统的 root 账号密码被设置为*占位符而无法登录时有以下几种方案可以恢复或绕过此限制使用 sudo 临时提权如果当前用户拥有 sudo 权限可以直接使用sudo -i或sudo su -切换到 root 环境然后执行passwd root为 root 设置新密码。# 切换到 root 用户环境 sudo -i # 为 root 设置新密码交互式输入两次新密码 passwd root从 Live CD/USB 启动并清空 root 密码使用 Ubuntu 安装盘或其他 Linux 发行版的 Live CD/USB 启动电脑挂载原系统的根分区找到并编辑/etc/shadow文件将 root 行第二个字段加密密码的*删除留空使 root 无需密码即可登录。# 查看分区布局找到原系统的根分区如 /dev/sda2 sudo fdisk -l # 挂载原系统根分区到 /mnt sudo mount /dev/sda2 /mnt # 使用 vipw -s 安全编辑 shadow 文件注意路径是 /mnt/etc/shadow sudo vipw -s /mnt/etc/shadow # 找到 root 行将第二个字段的 * 删除留空后保存退出复制其他用户的密码哈希如果系统中存在另一个已知密码的用户例如你自己的普通用户可以将其在/etc/shadow中的加密密码字符串复制到 root 的密码字段。这样 root 就与该用户使用相同的密码。# 查看已知用户如 username在 shadow 中的加密密码哈希 sudo grep ^username: /mnt/etc/shadow | cut -d: -f2 # 将上述命令输出的哈希字符串复制到 root 行的第二个字段替换原来的 * sudo sed -i s/^root:[^:]*:/root:复制的哈希值:/ /mnt/etc/shadow生成自定义密码的加密值在可以运行命令的环境中例如通过 sudo 或 Live 环境使用openssl或mkpasswd工具生成指定密码的 SHA-512 加密哈希然后手动替换 root 在/etc/shadow中的密码字段。# 使用 mkpasswd 生成 SHA-256 加密哈希需先安装 whois 包 mkpasswd -m sha-256 你的新密码 # 或者使用 openssl 生成带随机盐的 SHA-512 哈希推荐 openssl passwd -6 你的新密码 # 得到哈希值后用 vipw -s 编辑 /mnt/etc/shadow手动替换 root 的第二个字段以下是恢复 root 密码的完整决策路径可根据自身情况按图索骥选择最合适的方案决策起点Ubuntu root 密码为 *无法登录 │ ├─ 有 sudo 权限 ── 是 ──→ 方案一sudo -i → passwd root → 完成 │ └─ 无 sudo 权限 ──→ 可物理接触机器 ── 是 ──→ 方案二Live CD/USB → 挂载根分区 │ │ │ ├─ 需自定义密码 ── 否 ──→ 删除/替换 * → 完成 │ │ │ └─ 需自定义密码 ── 是 ──→ 有已知密码用户 ── 是 ──→ 方案三复制哈希 → 完成 │ │ │ └─ 否 ──→ 方案四生成加密值openssl/mkpasswd → 完成 │ └─ 无 sudo 权限 且 不可物理接触机器 → 无法解决以上方法中方法 1最为简便但前提是当前用户已在 sudoers 列表中。方法 2是通用性强、无需已知凭证的终极方案。方法 3 和 4则适用于需要对密码哈希进行精细控制的场景。三. 注意事项与常见问题1. 直接编辑 shadow 文件的风险直接使用普通文本编辑器如 vi、nano修改/etc/shadow文件存在以下风险文件锁竞争系统进程如passwd、chage可能正在同时修改该文件导致数据损坏或丢失。格式错误shadow 文件中每个字段都有严格的顺序和分隔要求手工编辑容易遗漏或错位冒号错误的格式会导致该用户甚至所有用户无法登录。权限问题保存时如果权限设置不当可能使 shadow 文件权限变为可读造成密码哈希泄露。SELinux如果使用其他系统修改系统检测到重要文件的哈被修改了可能会主动阻止任何用户登录。因此强烈推荐使用vipw -s命令编辑 shadow 文件。它会自动对文件加锁防止并发写入并在编辑完成后检查格式最大限度降低安全风险。2. Live CD 方案中的分区挂载与可写性当使用 Ubuntu Live CD/USB 启动时原系统的根分区通常处于未挂载或只读状态。为确保能够写入 shadow 文件需要识别根分区使用sudo fdisk -l或lsblk查看分区布局确定原系统的根分区设备如/dev/sda2。挂载为可写执行sudo mount /dev/sda2 /mnt将其挂载到/mnt后不要忘记添加-o remount,rw或在挂载时直接以读写方式挂载默认通常是只读。如果文件系统错误导致只读可以先运行fsck修复。使用 chroot可选但推荐挂载后可通过sudo chroot /mnt切换到原系统的根环境此时执行passwd root更为安全和标准它会自动处理 shadow 文件的加密和格式。确认写入路径如果直接编辑文件路径应为/mnt/etc/shadow而非/etc/shadow否则修改的是 Live 环境自身的文件。3. 密码策略chage 设置与 shadow 字段的关联在恢复 root 密码之后有时可能需要调整密码过期策略以符合系统加固要求。使用chage命令与 shadow 文件字段的直接对应关系如下-m 最小使用天数对应第 4 个字段密码最小使用天数。-M 最大使用天数对应第 5 个字段密码最大使用天数。-W 警告天数对应第 6 个字段密码过期前的警告天数。-I 过期后宽限天数对应第 7 个字段密码过期后的宽限天数。-E 账户过期日期对应第 8 个字段账号失效日期格式为YYYY-MM-DD。如果需要让密码立即过期以强制用户在下次登录时修改可执行chage -d 0 root。建议在恢复 root 密码后结合安全策略设定合理的密码有效期限防止长期使用同一个密码。