ARTICLE DETAIL

资讯详情

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

服务器root密码丢失怎么办?rd.break、单用户与救援盘全解析

服务器root密码丢失怎么办?rd.break、单用户与救援盘全解析 凌晨两点我盯着屏幕上Password incorrect的提示后背一阵发凉。那台刚接手不到一周的CentOS 7测试服务器root密码在原管理员离职交接时没有留档我试了十几组常见组合全部无效。说实在的root用户密码破解在运维圈里并不是什么见不得光的手段而是每个系统管理员迟早都会撞上的一次开门危机——机器是自己的、权限是自己的密码却丢了。这篇文章就把我这些年处理过的各类root密码恢复过程完整拆解一遍覆盖RHEL/CentOS 7的rd.break方案、老版本与Ubuntu的单用户模式、LiveCD救援盘以及连带的MariaDB/MySQL root登录失败error 1045处理。适合刚入行的运维、自建服务器的个人开发者以及正准备接手一台密码未知二手服务器的朋友参考。1. 先划清边界恢复自己的密码和攻击别人系统不是一回事很多人在搜索引擎里敲root密码破解时脑子里第一反应是电影里那种入侵场景。但实际运维工作里99%的需求是自己的设备密码不知道了怎么办。在动手之前我必须先把边界说清楚本文所有方法只适用于你有合法管理权限的机器也就是你自己购买、公司分配给你维护、或者明确授权给你接管的主机。未经任何授权去重置别人的服务器密码在法律上属于非法侵入计算机信息系统这是红线没有任何讨论余地。1.1 现实工作中最典型的几种被锁门外场景人员离职交接不全原管理员只留下一句密码在文档里结果文档早就过期失效堡垒机或密码管理软件故障密码库损坏条目丢失新采购或捡漏的二手设备前任主人忘了清密码后台登录不进去长期不登录的测试机某次安全整改强制改密后记在便利贴上便利贴不知道飞哪去了。这些场景有个共同特征设备所有权和管理责任都在你手里缺的只是那串字符。所以接下来的操作本质上是密码找回/重置而不是攻击破解。1.2 顺手提醒云服务器的特殊渠道如果你操作的是云主机先去云厂商控制台看一眼。阿里云、腾讯云、华为云这些主流平台控制台里基本都提供了重置密码或通过VNC登录后修改密码的入口有的还有救援模式步骤比本地机折腾GRUB快得多。而且云主机的GRUB菜单在某些虚拟化环境下按键时机非常难抓反而容易把系统搞坏。我的建议是能走控制台就走控制台控制台没有入口、或者像我自己那台物理机一样只有本地显示器再用下面的方法。2. root密码到底存在哪里从登录验证链路找突破口要重置root密码先得搞清楚密码是怎么存、怎么验的。Linux用户密码不是明文也不是简单加密而是经过单向散列hash后存放在/etc/shadow文件里的。所谓单向就是理论上无法从散列值反推出原始密码只能靠一个个试。所以破解这件事的正确思路不是去逆运算而是绕开验证环节直接把shadow文件里的散列值改掉。2.1 拆开 /etc/shadow 看看/etc/shadow每行对应一个用户冒号分隔字段依次是用户名、密码散列、最近修改日期、最小修改间隔、最大有效期、警告天数、宽限天数、失效日期、保留位。拿最常见的 root 行举例root:$6$kX8fJm2a$E3VzR9tLwQ7xYbN5cA2sDfGjHvKmPq...:19213:0:99999:7:::第二段的$6$是散列算法标识$1$是MD5$5$是SHA-256$6$是SHA-512较新的发行版可能用yescrypt。后面的$kX8fJm2a$是随机盐salt再往后那段长字符串就是散列结果。密码学的意义在于哪怕两个人设置了同一个密码因为盐不同散列值也完全不一样。2.2 登录验证的完整链路当你开机输入root密码系统里的实际流程大致是终端程序如getty拉起login进程login调用 PAM 框架PAM 的pam_unix.so模块从/etc/shadow读取散列值对你输入的密码做同样算法的散列计算比对两者是否相等。相等就放行不相等就提示incorrect password。2.3 三个可以插入的干预环节按照上面的链路可以动手的地方有三个改引导参数让系统跳过正常的密码验证流程直接进入单用户或维护 shell改启动介质用LiveCD、U盘救援系统把硬盘挂载起来直接编辑 shadow 文件拆硬盘挂到别的机器物理机常见操作方式和LiveCD本质上一样。三者中改引导参数最快也是下面重点讲的内容。3. CentOS 7/RHEL 7最顺手的一招rd.break 完整实操先说我个人用得最多、也最稳妥的方式针对的是 CentOS 7 / RHEL 7 及以上版本。它的核心是用rd.break参数让内核在切换到真正的根文件系统之前停下来进入一个维护 shell这时你可以把系统原环境的根目录挂载为可读写然后直接改密码。3.1 进入GRUB菜单并编辑启动项开机看到主板LOGO后留意屏幕底部有没有Press any key to enter the menu之类的提示如果有立刻按任意键没提示的话在BIOS跑完、系统即将引导时连续按Esc或方向键直到出现GRUB菜单。选中默认的内核条目通常第一项按e进入编辑模式。这一步不要点错GRUB菜单里按e是编辑按回车才是直接启动。3.2 在linux16行末尾追加 rd.break编辑界面里会看到一堆以set、load_video、linux16、initrd16开头的行。找到以linux16UEFI机器上可能是linux开头的那一行这行会很长包含root/dev/mapper/cl-root、ro、crashkernelauto等参数。把光标移到这一行末尾敲一个空格然后输入rd.break保存并启动。不同版本的GRUB确认方式不同BIOS环境下通常是CtrlXUEFI环境下可能是CtrlX或直接按F10看屏幕底部的快捷键提示。3.3 从只读根挂载到chroot环境改密码启动后会看到系统输出switch_root相关日志随后停在一个 shell 提示符下这就是initramfs里的临时环境。此时根文件系统挂在/sysroot下且是只读ro状态。按顺序执行下面这些命令mount -o remount,rw /sysroot chroot /sysroot passwd root第一步把/sysroot从只读重挂载为读写否则后面改密码会报Read-only file system。第二步chroot /sysroot的意思是换个根进入你真正的系统环境这时你看到的就是这台服务器的正常目录结构。第三步passwd root会提示你输入两次新密码这里输入的内容在终端里不会显示是正常现象。3.4 SELinux强制模式下必须做的autorelabelCentOS 7默认开启SELinux直接改/etc/shadow会导致文件的SELinux上下文安全标签可能不对重启后可能出现登录异常甚至直接被拒。所以在chroot环境里改完密码后还要执行touch /.autorelabel这个操作会在系统下次启动时触发一次全盘文件重新打标签relabel。它会遍历根文件系统比较耗时间机械硬盘上跑几分钟很正常固态硬盘会快很多。虽然慢但强烈建议做尤其是生产机器。3.5 重启验证与几个容易翻车的小点改完密码后执行两次exit。第一次退出 chroot 环境第二次退出 initramfs 的维护 shell。系统会自动继续引导流程并重启正常开机后用新密码登录即可。这里有几个我踩过的坑单独说一下执行exit后系统提示的是重启而不是继续引导这是正常的别慌如果chroot /sysroot之后提示找不到命令说明没有正确挂载/sysroot回头重新执行挂载命令键盘布局问题有些机器进到维护shell后键盘映射是默认布局输密码时大小写或特殊符号位置不对改密码时会莫名其妙失败先确认设置的数字小键盘没误开rd.break和init/bin/bash是两条路线后者的写法是在内核参数行添加init/bin/bash进入的系统是单用户shell但根目录默认还是只读所以第一个命令永远是mount -o remount,rw /。两者都能用我推荐rd.break因为它保留SELinux标签变更的触发机制更完整。4. 老版本与Ubuntu单用户模式这条经典路线在CentOS 7出现之前以及现在仍大量存在的Ubuntu桌面版/服务器版上还有一种经典做法单用户模式。它和rd.break的目的一样都是绕开正常的多用户登录流程直接给你一个root shell。4.1 CentOS 6/RHEL 6的single参数CentOS 6还使用SysVinit作为初始化系统操作比7更简单直接。开机进GRUB菜单按e编辑找到kernel /vmlinuz-2.6.32-xxx ... ro那一行在行尾加上一个单词single也可以写成数字1或字母s含义相同。保存后启动系统会直接进入单用户模式给你一个root shell执行passwd root改完密码直接重启完事。没有SELinux标签问题那么折腾这是老版本的爽点。4.2 Ubuntu的Recovery ModeUbuntu尤其桌面版操作略有不同。开机时按住Shift某些机器按Esc进入GRUB菜单选择Advanced options for Ubuntu里面会列出多个内核版本的恢复模式条目选中带有(recovery mode)的一项。系统启动后会显示一个恢复菜单其中有几个选项rootDrop to root shell prompt、network启用网络、dpkg修复损坏的包、fsck检查文件系统等。选择root进入root shell。Ubuntu的根目录此时也是只读所以先执行mount -o remount,rw /再改密码。需要留意的是Ubuntu默认不开放root账户登录平时都是用sudo提权。因此恢复模式下如果你直接passwd root改了root密码登录界面上可能依然没有root登录入口真正要改的往往是某个具体用户的密码比如passwd your_username这一点和CentOS默认放开root登录的预期差别很大我第一次在Ubuntu上操作时就被改完root密码还是登录不了困惑了半天。4.3 systemd化前后的差异CentOS 7正式转向systemd之后老的single参数虽然还在但现实中很多机器加了single后会遇到SELinux或systemd服务依赖问题不像以前那么干净利落。所以我的结论是CentOS 6及之前的SysVinit时代用single最顺手CentOS 7及之后用rd.break更可控Ubuntu服务器用Recovery Mode或直接在GRUB内核参数加init/bin/bash都行。5. LiveCD/救援盘连引导都坏了也能救如果机器GRUB也坏了、或者你根本不知道原来的系统分区怎么布局还有一种兜底方案用LiveCD/U盘救援系统启动把硬盘分区挂载起来以后直接改文件。这个方法适应面最广哪怕系统引导彻底损坏只要硬盘本身没有物理故障就能救回来。5.1 什么时候必须用救援盘GRUB菜单损坏进不了引导项编辑界面系统完全起不来内核panic你接手一台机器连是什么发行版、什么文件系统都不知道rd.break、单用户模式都由于不明原因失效例如硬件固件层面的怪异配置。准备一个CentOS安装盘、Ubuntu Live盘或GParted Live盘即可工作电脑上临时做个启动U盘也行。5.2 挂载、chroot、改密码的完整命令从Live环境启动后先确认磁盘布局lsblk fdisk -l假设根分区是/dev/sda2挂载后进入系统环境改密码mount /dev/sda2 /mnt chroot /mnt passwd root如果原来的系统开启了SELinux记得在chroot里执行touch /.autorelabel。改完后退出chroot、卸载分区、重启拔掉U盘。5.3 LVM与磁盘加密环境的额外操作我遇到过最麻烦的情况是LVM逻辑卷和LUKS加密盘。CentOS默认安装时如果使用了LVM根分区逻辑卷名字通常是/dev/mapper/cl-root。进入Live环境后需要先激活卷组vgchange -ay ls /dev/mapper/看到cl-root之类的逻辑卷名之后再执行挂载。如果硬盘做了LUKS全盘加密启动Live环境后要先用cryptsetup解锁cryptsetup luksOpen /dev/sda2 cryptroot解锁后cryptroot变成一个可挂载的设备节点后续操作逻辑一样。做这类操作时务必小心别选错设备尤其当机器上装了两三块硬盘、又有数据盘又有系统盘的时候我建议先用lsblk -f看文件系统类型和UUID在Live环境里把系统盘和相关数据盘全部识别清楚再动手避免把数据盘当成系统盘误改。6. 密码改完之后要做的善后安全扫描与防呆措施密码改完、系统能登录不代表事情结束了。很多人到这一步就松口气结果后面出了更大的事。我强烈建议按下面的顺序把善后做完整。6.1 先确认这不是被入侵改的密码如果这台机器是突然登不上去了而不是本来就不知道密码那必须先怀疑是不是被入侵者篡改了root密码改完密码进入系统后第一时间检查几个地方lastlog # 查看所有用户最近登录时间 last -f /var/log/wtmp # 查看登录历史 cat /var/log/secure | grep -i Accepted # 查看成功登录记录 cat /etc/passwd | awk -F: $30 {print} # 看看还有没有别的UID为0的账号另一步要检查authorized_keyscat /root/.ssh/authorized_keys如果发现里面有不认识的主机密钥说明攻击者可能已经植入后门单纯改密码是不够的得进一步排查系统文件完整性、计划任务crontab -l、/etc/cron.*和运行中的可疑进程。6.2 回到正常状态后的密码策略处理完安全排查后把密码策略整理一下。我个人的最低标准是root密码不少于16位混合大小写、数字和特殊符号通过chage -M 90 root设置90天有效期到期强制修改日常操作不要用root登录创建普通用户并加入wheel组用sudo提权保留一位备用管理员账号密码与root完全不同。对于云服务器还要注意密钥对登录。很多云主机默认关闭密码登录、只用SSH密钥这种情况下root密码破解的入口本身就是密钥重置root密码后也要检查sshd_config里的配置别把唯一登录途径弄丢了。6.3 给自己留一条后路我现在的习惯是每台服务器初始化完成后立刻做三件事建立可用的普通sudo账号密码写进密码管理工具而不是贴在文档里有云控制台的测试一次VNC和重置密码流程是否可用。这套习惯看起来简单但能让你在下次遇到密码丢失时从通宵恢复变成五分钟解决。7. 延伸MySQL/MariaDB 的 root 访问失败恢复系统root密码的问题解决了很多人紧接着会遇到另一类root密码问题数据库登录时报ERROR 1045 (28000): Access denied for user rootlocalhost。注意这是完全独立的一层密码——MySQL/MariaDB里维护着用户表和权限表和操作系统/etc/shadow没有半点关系。改系统的root密码改不到数据库的root密码。7.1 error 1045 报错的真实含义ERROR 1045 (28000): Access denied for user rootlocalhost翻译过来就是来自本机的root用户访问被拒绝。括号里的using password: YES表示你用密码登录了但密码错误using password: NO表示你没输密码。这种情况最常见的原因就是数据库root密码改了之后没记录或者上次初始化的随机密码不知去向。7.2 --skip-grant-tables 恢复流程MariaDB/MySQL提供一种跳过授权表验证的临时启动方式思路和系统root恢复一致绕过验证进入环境后重新设置凭证。标准流程如下先停止数据库服务systemctl stop mariadb用跳过授权表、且完全禁用网络参数方式启动mysqld_safe --skip-grant-tables --skip-networking 然后用root身份免密进入mysql -uroot在SQL环境里执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;FLUSH PRIVILEGES这一步必须做因为跳过授权表启动时权限插件没有正常加载直接ALTER USER会报错。执行成功后退出把临时启动的mysqld进程关掉再用正常方式启动服务systemctl start mariadb7.3 为什么这个操作必须断网且尽快复位--skip-grant-tables会关闭所有用户认证任何能连上数据库端口的人都能以root身份直入。所以两个底线必须守住一是启动参数里坚决要写--skip-networking确保数据库不监听网络端口二是在本机操作改完密码后立刻停机恢复正常模式。我见过有同事图省事加了--skip-grant-tables忘了加--skip-networking结果数据库裸奔在网络上虽然只有几分钟但已经足够让人惊出一身冷汗。另外老版本MySQL 5.x里习惯用UPDATE mysql.user SET PasswordPASSWORD(新密码) WHERE Userroot;在MySQL 5.7及以上和现代MariaDB里Password字段已被移除或变化建议直接用ALTER USER通用性更好。如果是云数据库云RDS发生1045本地这招通常无效需要走云厂商控制台的密码重置通道。我在实际处理中最大的体会是所有密码恢复手段都只是应急出口真正能让你从源头少受罪的是平时把登录方式、密码托管和设备清点做在前面。至少在我自己的机器上现在root密码已经全部换成了随机长串日常操作走sudo账号密码库完整备份上次那种凌晨对着一台锁死的服务器发呆的体验再也不想有了。
返回列表