ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux密码恢复与重置全攻略:root密码丢失、单用户模式、SELinux避坑

Linux密码恢复与重置全攻略:root密码丢失、单用户模式、SELinux避坑 干了几年Linux运维谁还没个“密码忘了”的时刻。尤其是手头这台机器是几年前的旧服务器交接文档早就丢了或者刚捡了台二手设备开机卡在登录界面root密码和普通用户密码全都没了。这时候你需要的不是重装系统而是把密码“找回来”。这个主题看着有点敏感说破了其实就是Linux系统管理的常规操作——密码恢复与重置。前提就一条你得有这台设备的合法操作权限自己的机器、公司的服务器、或者拿到授权的设备。这篇文章我把root密码和普通用户密码的恢复手段一次性讲透从原理到实操再到踩坑记录全部覆盖。1. 密码到底存在哪先搞懂Linux的密码存储机制1.1 /etc/passwd和/etc/shadow的分工很多新手一开始就搞混一个概念Linux的用户信息到底存在哪里答案是两个文件协同工作。/etc/passwd存的是用户的基础信息包括用户名、UID、GID、家目录、登录Shell等。注意看这个文件的权限它是全局可读的因为很多程序需要根据用户名来查询UID。早期Unix系统确实把密码哈希直接存在这个文件里但后来发现所有人都能读等于把密码哈希公开了所以现代Linux系统把密码部分挪走了。真正存密码的是/etc/shadow这个文件只有root用户能读。里面每行对应一个用户用冒号分隔成九个字段。最核心的字段是第二个也就是密码哈希串。举个例子root:$6$J2s9x...:18000:0:99999:7:::这里$6$表示哈希算法是SHA-512J2s9x...是盐值和哈希结果。后面几个数字分别是上次修改密码时间、最小修改间隔、有效期、警告期等。普通用户登录时系统会把输入的密码做同样的哈希运算比对结果是否一致。1.2 哈希算法与为什么密码不能“直接看到”搞明白了存储位置接下来要理解“破解”这个词的真实含义。Linux不存明文密码存的是哈希值。哈希算法是单向的——从明文算出哈希很容易但从哈希反推明文几乎不可能。所以所谓的“密码破解”本质上只有两条路一条是重置——既然不知道旧密码那就干脆绕过它直接写一个新的哈希进去把旧密码覆盖掉。这是我们日常运维中最常用的思路。另一条是暴力猜测——拿到哈希之后把字典里的候选密码逐个做哈希计算比对是否匹配。这条路的可行性取决于密码强度、哈希算法速度和字典质量后面我会详细展开。2. root密码重置单用户模式这条经典路线2.1 修改grub引导参数进入单用户模式root密码忘了最经典的做法就是进入单用户模式。单用户模式是Linux的一种特殊运行级别只有root一个用户不需要密码就能进入。思路很直接重启机器在grub引导界面拦截启动过程修改内核启动参数让系统以单用户模式启动然后直接改密码。以CentOS 7为例具体操作分四步重启机器在grub菜单出现时快速按键盘上的e键进入grub编辑界面。找到以linux16或linux开头的那一行这一行定义了内核的启动参数。在这一行的末尾追加single或者数字1然后按Ctrlx或F10启动。系统会进入单用户模式直接落到root shell。这时候执行passwd root输入两遍新密码然后执行exec /sbin/init或者直接reboot重启。重启之后用新密码登录搞定。这里有个细节有些系统默认不显示grub菜单重启时按住Shift键BIOS启动或在grub启动的瞬间连按EscUEFI启动就能让菜单露出来。2.2 CentOS 7/8的systemd方案rd.break和rescue.target老派的单用户模式在CentOS 7之后依然能用但systemd时代有更正规的操作手法。其中一个非常实用的技巧是在内核参数中加入rd.break。具体操作grub编辑界面里在linux16开头的那一行末尾追加rd.break然后启动。系统会进入一个特殊的initramfs环境提示符变成switch_root:/#。这时候根文件系统是以只读方式挂载的需要手动重新挂载mount -o remount,rw /sysroot chroot /sysroot passwd root注意这里有个容易踩的坑如果系统启用了SELinux直接改完密码重启可能会遇到SELinux上下文问题导致系统异常。稳妥的做法是改完密码后执行touch /.autorelabel让系统下次启动时自动重建SELinux标签。或者进入rescue模式时顺手把SELinux设为permissive处理完再改回来。另一个systemd方案是直接在内核参数加systemd.unitrescue.target效果类似单用户模式。但实测中rd.break比rescue.target更不容易被SELinux的问题卡住因为它是真正在用户空间完全加载之前就介入的。2.3 重置密码之后的SELinux与启动问题重置root密码后有没有遇到过系统启动异常我遇到过两次排查下来都是SELinux的锅。具体原因/etc/shadow文件在单用户环境里被直接修改文件的SELinux安全上下文可能被错误标记导致系统启动时某些服务被拒绝访问。解决方案有两个方向。方向一是前面提到的touch /.autorelabel下次启动时系统会重新检查并修正所有文件的SELinux标签代价是启动时间明显变长。方向二是干脆把SELinux关掉修改/etc/selinux/config把SELINUXenforcing改成SELINUXpermissive。我的个人习惯是正规生产环境优先用autorelabel临时测试机直接permissive省事。另外提醒一点改了密码之后确认下/etc/shadow的权限还是-rw-------如果变成普通文件权限所有用户都能看到哈希串这等于把密码拱手送人。3. 普通用户密码重置的多种路径3.1 有sudo权限时的最简单办法普通用户的密码忘记如果这台机器上还有别的管理员账号问题就特别简单。只要这个管理员属于wheel组CentOS/RHEL系或sudo组Ubuntu/Debian系一条命令搞定sudo passwd 用户名系统会要求输入新密码两次不需要知道旧密码。这个操作的本质是管理员替用户重置密码属于权限之内的常规操作。同理如果你是root直接passwd 用户名即可。这里稍微展开说下passwd命令的几个实用参数-l锁定账号、-u解锁账号、-d删除密码使账号无需密码即可登录但极度不建议这么干、-e强制用户下次登录时修改密码。最后这个参数很实用给临时工或新同事开了账号后强制他们首次登录改密码安全习惯直接养成。3.2 没有sudo权限时的救援模式操作如果整台机器只有这个普通用户知道密码管理员又没有权限那就得回到单用户模式或者救援模式。操作逻辑和重置root密码完全一致进入单用户模式后你本来就是root身份直接passwd 用户名或者用chpasswd批量修改多个用户密码echo 用户名:新密码 | chpasswd这种做法的前提是你能物理接触到这台机器或者通过带外管理卡如iDRAC、IPMI能控制机器重启和进入引导界面。云服务器一般不适用这种方法需要走云厂商的控制台VNC配合重置操作或者用厂商提供的“重置密码”功能。云服务器这块额外说一句阿里云、腾讯云的Linux实例控制台通常都有“重置实例密码”的功能但有些版本要求实例处于“已停止”状态才能操作。我自己就在这上面翻过车——看着“重置成功”的提示实际上因为实例没关机操作根本没生效。3.3 借助Live CD/救援盘的通用方案如果grub引导本身出了问题进不了单用户模式或者根本不知道root密码但也想进系统Live CD是最后的通用方案。做法用CentOS/Ubuntu的安装光盘或U盘引导选择“Troubleshooting”然后进入“Rescue a CentOS system”系统会扫描已安装的Linux并挂载到/mnt/sysimage。然后执行chroot /mnt/sysimage passwd 用户名操作入口和单用户模式完全一样区别只是根目录位置。有Live CD在手理论上任何一台物理机的密码都能重置。当然如果磁盘做了LUKS加密这里就会多一道坎——需要先解密。4. 另一个高频场景MySQL的root密码和Ubuntu的密码管理4.1 MySQL的error 1045 (28000)怎么处理热搜词里有error 1045 (28000): access denied for user rootlocalhost (using password: YES)这个错误信息做后端开发的基本都见过。它的含义是MySQL的root用户拒绝了登录要么密码确实不对要么密码策略限制。这跟Linux系统层面的root密码不是一回事但经常被人搞混。遇到这个错误常规的恢复流程是这样的停掉MySQL服务然后用安全模式启动跳过授权表验证systemctl stop mysqld mysqld_safe --skip-grant-tables 注意CentOS 7之后mysqld_safe可能不在了可以用mysqld --usermysql --skip-grant-tables --skip-networking 跳过授权表启动后不需要密码就能以root身份进入MySQLmysql -uroot然后执行刷新权限和重置密码FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 新密码;操作完成后再正常重启MySQL服务。注意--skip-networking这个参数很关键它让MySQL只听本地socket不开放TCP端口避免“免密入口”被外部连接利用。安全第一别图省事把这个参数省了。4.2 Ubuntu下root与普通用户密码的日常管理热搜词里还有ubantu 切换root和切换root。Ubuntu对root的处理跟CentOS不同默认root没有密码或者说root账号被锁定了平时操作都用sudo提权。所谓“切换root”通常指sudo -i sudo su -这两条命令的区别sudo -i会以root身份启动一个登录Shell环境变量和用户环境都切换到rootsudo su -是先用sudo拿到root权限再执行su效果类似但逻辑绕了一圈。日常用sudo -i就够。如果确实想给root设置密码默认就没有不需要“改”执行sudo passwd root这一个操作顺手就把root解锁了。但是Ubuntu默认不让你直接用root登录图形界面这属于安全设计不是bug。另一个相关问题是sudo密码忘了——如果你的用户不在sudo组里别人也没法帮你提权那就回到第3章的单用户模式方案一样能解决。5. 暴力破解与密码字典原理、防御和边界5.1 暴力破解到底在干什么热搜词里有python密码破解字典下载需要说清楚暴力破解的原理更要讲清楚合法边界。暴力破解的本质是拿到密码哈希之后把可能的密码挨个哈希一遍比对碰撞。它能不能成功取决于三个因素候选密码空间的覆盖范围、哈希计算的速度、目标密码本身的复杂程度。举个例子一个纯六位数字密码空间是10的6次方也就是100万个组合。用现代CPU每秒跑几万次SHA-512计算分分钟就能穷举完。但如果密码是Tr0ub4dor3这种大小写字母加数字加符号的12位组合空间大到天文数字靠暴力算一辈子也算不出来。密码字典就是预先整理好的“高频密码集合”里面装了各种常见弱密码、姓名加生日、键盘模式等组合。字典攻击比纯暴力聪明的地方在于它优先尝试“人最可能设的密码”用较少的计算次数覆盖较高的命中率。我见过做渗透测试的朋友一个几千万条的字典配合GPU加速跑一个中等强度的密码也就几个小时。5.2 怎样加固才能防住暴力破解从防御者的角度抵抗暴力破解的核心策略不是“加密算法多先进”而是“让破解者的计算成本高到不值得”。第一道防线是密码本身。长度比复杂度更关键一个20位的纯小写字母密码强度远高于8位带着特殊符号的密码。业界共识是推荐用长密码短语passphrase比如my-favorite-book-is-crime-and-punishment。这类密码好记又难破。第二道防线是破解速度限制。对/etc/shadow里的哈希来说攻击者可以离线无限次计算所以限制不了。但对在线登录这种场景可以配置fail2ban、pam_faillock等工具连续输错几次密码就锁定IP或账号一段时间。实际部署pam的时候有个注意点别把root账号也锁了否则你连登录入口都没了。第三道防线是启用公钥认证。对于SSH远程登录干脆禁用密码认证只允许密钥登录。服务器上根本没有密码可破暴力破解自然无从谈起。5.3 一句话明确边界写这一段是必须的。密码恢复技术是一把双刃剑——用在合法授权的设备上是运维基本功用在别人没授权的系统上就是违法行为。本文所有操作步骤请务必只在自己的设备、公司授权的运维环境、或你明确获得许可的测试环境中使用。这些技术本身没有善恶但使用者要为自己的行为负责。6. 实战中的常见问题与避坑经验6.1 常见错误提示速查表实际操作中总会碰到各种意外我把高频问题整理成一个速查表都是亲测踩过或者帮别人擦过屁股的问题现象可能原因解决思路grub菜单不显示超时时间设成0或菜单被隐藏重启时长按ShiftBIOS/连按EscUEFI追加single后进入图形登录内核参数没生效或grub版本差异改用rd.break或systemd.unitrescue.targetchroot后提示bash: passwd: command not foundsysroot挂载不完整先确认mount -o remount,rw /sysroot成功再检查/usr分区是否已挂载重置密码后SELinux阻止登录SELinux上下文错乱执行touch /.autorelabel后重启passwd提示Authentication token manipulation errorshadow文件损坏或不可写检查磁盘空间df -h检查shadow权限必要时用chattr -i去掉不可变属性改完密码重启又变回旧密码有快照回滚或tmpfs挂载确认系统没有启用了overlayfs之类的临时层检查启动日志6.2 操作前必须做的几件事最后分享四条每次做密码恢复前我都会检查的东西。第一确认这台机器有没有配置LUKS全盘加密。如果有单用户模式在引导阶段就会要求输入解密密码你连initramfs都进不去。这里的“顶层密码”和系统登录密码不是一回事唯一解法是找到当初设置的磁盘加密密码或者接受数据无法恢复的现实。第二操作前一定要有备份或者明确的“损失可接受”判断。单用户模式下误操作了/etc/shadow可能导致所有账号都登录不了。稳妥的做法是先备份shadow文件cp /etc/shadow /etc/shadow.bak第三重置密码后别急着重启先手工验证一遍/etc/shadow的格式是否正确。最简单的方法是把新旧shadow对比一下确保被修改的那一行用户字段个数没变。我有一次手滑删掉了冒号结果系统重启后登录直接报incorrect password排查了半天才发现是文件格式被破坏了。第四生产环境的密码重置建议走正式的变更流程。哪怕是云服务器控制台重置也一定要在变更窗口执行并通知相关同事。这不是技术问题是职业习惯——你永远不想因为一次“随手重置密码”把正在运行的业务搞挂然后被叫去复盘。说到底密码恢复这个技能最好的使用方式就是——大多数时候用不上但用上的时候能救命。尤其是接手老项目、临时救火的时候一套顺手可靠的密码恢复流程比满屏的监控图表实在得多。我的建议是找个测试虚拟机把单用户模式、rd.break、Live CD三条路线都亲手走一遍虽然不常用但真遇到事的时候顺手就是一处安全感。
返回列表