☰
RHEL 9 root密码重置与GRUB密码设置完整指南
2026/10/26 2:53:48 网站建设 项目流程

1. 为什么要在RHEL 9上同时搞定root密码重置和GRUB密码

1.1 一个真实运维场景引出的需求

接手一台RHEL 9.0服务器,前任管理员离职,root密码没人知道,系统里还跑着关键业务不能重装——这种局面在中小团队里出现的频率远比想象中高。更麻烦的是,这台机器的物理控制台就摆在机房里,任何能接触到键盘的人都可以通过引导菜单进入单用户模式改掉root密码。所以真正完整的操作不是"把密码改回来"就完事,而是重置root密码的同时把GRUB引导菜单也锁上,堵住这个物理接触即提权的口子。

RHEL 9.0在这件事上和RHEL 7/8有明显差异:引导加载器换成了GRUB 2的较新版本,默认启用了boot loader specification,SELinux策略更严格,rd.break方式进入紧急shell后根文件系统是只读挂载的,重新挂载和打标签的步骤一个都不能少。很多人照着RHEL 7的老教程操作,最后卡在passwd: Authentication token manipulation error或者改完密码重启后SELinux报错进不了系统,根子都在这些版本差异上。

这篇内容适合三类人看:一是刚接手RHEL 9环境、需要应急恢复访问权限的运维;二是想搞清楚GRUB密码到底怎么设才真正有效的安全加固人员;三是准备RHCSA/RHCE考试、需要把这块流程吃透的学员。下面我会把整个流程拆成"进紧急shell—改密码—修SELinux上下文—设GRUB密码—验证"这条完整链路,每一步都讲清楚为什么这么做,以及我实际踩过的坑。

1.2 两个操作的内在关联:物理安全边界

单独看,重置root密码是"恢复访问",设置GRUB密码是"限制访问",方向相反。但放在一起看,它们共同定义了一台服务器的物理安全边界。GRUB密码的作用是:没有密码就不能编辑引导参数、不能进入单用户/紧急模式、不能加载自定义内核参数。换句话说,它把"能碰到键盘就能改root密码"这条路堵死了。

这里有个关键认知需要先建立:GRUB密码保护的是引导过程,不是数据本身。攻击者如果把硬盘拆下来挂到另一台机器上,GRUB密码一点用没有。所以它防的是"顺手操作"和"低成本的物理接触提权",配合BIOS密码、机箱锁、磁盘加密才构成完整防线。理解这个边界,你就不会误以为设了GRUB密码就万事大吉,也不会觉得这步是多余的形式主义。

注意:设置GRUB密码前务必确认自己记得住,或者有安全的保管方式。GRUB密码遗忘后的恢复比root密码遗忘更麻烦,某些情况下需要重装引导或使用救援介质。

2. 重置root密码:rd.break方式的完整拆解

2.1 进入GRUB编辑界面并修改引导参数

重启服务器,在GRUB菜单出现的瞬间(通常有5秒倒计时)按下键盘上的e键,进入当前启动项的编辑界面。RHEL 9.0默认菜单可能只显示一个条目,如果有多内核,用方向键选中默认启动的那个再按e。

进入编辑界面后,找到以linux开头的那一行(注意RHEL 9上是linux而不是老版本的linux16),这一行末尾通常有ro字样,表示根文件系统只读挂载。操作要点:

  • 把行尾的ro改成rw,让根文件系统以读写方式挂载,省去后面重新挂载的麻烦;
  • 在行尾追加rd.break,这是告诉initramfs在挂载真实根文件系统之前停下来,给你一个紧急shell;
  • 如果你还想顺便关掉SELinux的强制模式(不推荐,但应急时有人这么干),可以追加selinux=0,不过我更建议按正规流程修上下文,后面会讲原因。

改完之后按Ctrl+X启动。系统会进入一个极简的switch_root:/#提示符,这就是initramfs的紧急shell。此时真实的根文件系统还没有被挂载为/,而是挂载在/sysroot下,且是只读的。

2.2 重新挂载sysroot并切换根环境

进入紧急shell后,第一件事是确认/sysroot的挂载状态:

mount | grep sysroot

你会看到类似/dev/mapper/rhel-root on /sysroot type xfs (ro,relatime...)的输出,注意那个ro。接下来重新挂载为读写:

mount -o remount,rw /sysroot

这一步是很多人翻车的地方。如果前面GRUB里已经改成rw了,这里可能显示已经是rw,但保险起见还是执行一次remount。然后切换根环境:

chroot /sysroot

执行后提示符会变成sh-5.1#之类,此时你操作的已经是真实的根文件系统了。这里有个细节:RHEL 9的紧急shell是bash还是sh取决于initramfs配置,不影响操作,但如果你发现某些命令找不到,可能是PATH问题,用绝对路径/usr/bin/passwd即可。

2.3 修改root密码与SELinux上下文修复

在chroot环境里直接执行:

passwd root

按提示输入两次新密码。RHEL 9默认的密码策略比较严格(通过/etc/security/pwquality.conf控制),如果提示密码太简单被拒绝,要么换复杂点的,要么临时改策略——但应急场景下我建议直接输一个符合复杂度要求的密码,别去动策略文件,免得留下隐患。

密码改完后,最关键的一步来了:因为/etc/shadow文件在紧急shell里被修改,它的SELinux安全上下文可能丢失或错误,导致重启后SELinux拒绝访问,表现为无法登录或服务异常。修复方法是:

touch /.autorelabel

这个空文件是一个标记,系统下次启动时检测到它会自动对整个文件系统重新打SELinux标签。这一步耗时取决于磁盘大小和文件数量,大磁盘可能要等几分钟到十几分钟,属正常现象。如果你确定自己只改了shadow且想省时间,也可以手动修复:

restorecon -Rv /etc/shadow

但手动修复要求你对SELinux策略足够熟悉,新手还是老老实实用.autorelabel。

完成后退出chroot并重启:

exit exit

第一个exit退出chroot,第二个exit让initramfs继续启动流程。系统会重启,如果打了.autorelabel,启动过程会多一个relabel阶段。

2.4 这一步的常见误区与参数解释

关于rd.break和rw的组合,有个流传很广的误区:有人认为GRUB里改rw后就不需要mount -o remount,rw /sysroot了。实测在RHEL 9.0上,GRUB的rw影响的是内核挂载真实根文件系统时的行为,而rd.break在挂载之前就中断了,所以/sysroot的挂载属性由initramfs决定,默认仍是ro。两个rw是不同层面的东西,别混淆。

另一个误区是init=/bin/bash方式。老教程常教人把ro改成rw init=/bin/bash,这在RHEL 9上也能用,但它跳过了更多初始化流程,SELinux和某些服务状态更不完整,且改完密码后同样要处理上下文。相比之下rd.break更"干净",是Red Hat官方文档推荐的方式,我优先用它。

还有一点:如果你在GRUB里加了selinux=0,重启后SELinux是关闭的,/.autorelabel不会生效(因为SELinux没运行),你得手动把/etc/selinux/config改回enforcing再重启一次让它relabel。这就是我不推荐selinux=0的原因——多绕一圈,还容易忘。

3. 设置GRUB密码:grub2-setpassword的正确用法

3.1 RHEL 9上的GRUB密码机制

RHEL 9使用GRUB 2,设置密码的标准命令是grub2-setpassword。执行后它会交互式提示输入两次密码,然后把密码的PBKDF2哈希写入/boot/grub2/user.cfg(注意不是直接写进grub.cfg)。这个设计的好处是密码哈希和引导配置分离,重新生成grub.cfg不会丢密码。

执行:

grub2-setpassword

输入密码两次,看到user.cfg生成的提示即可。生成的user.cfg内容大致是:

GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.xxxx...

这里有个重要细节:grub2-setpassword默认创建的用户名是root。也就是说,GRUB菜单提示输入用户名时,你要输root,密码是你刚设的那个。很多人只记密码不记用户名,结果卡在验证环节。如果你想用别的用户名,需要手动编辑user.cfg并配合grub.cfg里的set superusers配置,标准流程下没必要折腾。

3.2 让密码生效:重新生成grub.cfg

grub2-setpassword写完user.cfg后,还需要重新生成主配置文件才能让密码保护真正生效:

grub2-mkconfig -o /boot/grub2/grub.cfg

在UEFI系统上路径是/boot/efi/EFI/redhat/grub.cfg,用grub2-mkconfig -o指定对应路径即可。执行完检查一下grub.cfg里是否出现了set superusers="root"和password_pbkdf2 root grub.pbkdf2...相关行,有就说明配置正确注入了。

这里解释一下原理:GRUB 2的密码保护通过superusers定义超级用户,password_pbkdf2定义其密码哈希。grub2-mkconfig读取/etc/grub.d/下的脚本和user.cfg,把这些配置合成到最终的grub.cfg。所以顺序不能反——先setpassword再mkconfig,反过来密码不会进配置。

3.3 验证GRUB密码是否真正生效

配置完别急着走,重启验证一次。重启到GRUB菜单,按e尝试编辑启动项,此时应该弹出用户名和密码输入提示。输入root和你设的密码,能进入编辑界面说明密码生效;如果直接让你编辑,说明配置没生效,回去检查grub.cfg。

还有一个验证角度:尝试在菜单里选择进入单用户模式或紧急模式,同样应该被密码拦住。这一步验证的是"物理接触提权路径是否被堵死",比单纯验证编辑功能更贴近安全目标。

注意:GRUB密码只保护引导菜单的编辑和特殊启动项,不影响正常启动。也就是说,普通重启不需要输GRUB密码,只有想改引导参数时才需要。这个设计避免了每次重启都要人工干预。

3.4 密码策略与保管的实操建议

GRUB密码和root密码建议不要设成一样。原因很直接:如果root密码泄露,攻击者又知道GRUB密码相同,物理接触时就能直接改引导参数绕过一切。两个密码分离,等于多一道独立防线。

密码复杂度上,GRUB密码没有PAM那套策略约束,grub2-setpassword对弱密码也不拦。但别因此图省事设个123456,这等于没设。我的习惯是用一个12位以上、包含大小写和符号的独立密码,记在团队的密码管理工具里,并注明"GRUB引导密码,用户名root"。

另外,如果你后续要升级内核或修改引导配置,grub2-mkconfig会重新生成grub.cfg,但user.cfg里的密码哈希不受影响,密码依然有效。这点可以放心,不需要每次改配置都重设密码。

4. 完整实操流程与关键环节记录

4.1 从重启到验证的端到端步骤清单

把前面拆开的步骤串成一条可照做的流水线,适合应急时直接对着操作:

  1. 重启服务器,GRUB菜单出现时按e;
  2. 找到linux开头行,行尾ro改rw,追加rd.break;
  3. Ctrl+X启动,进入switch_root:/#;
  4. mount -o remount,rw /sysroot;
  5. chroot /sysroot;
  6. passwd root,输入新密码两次;
  7. touch /.autorelabel;
  8. exit两次,等待重启和relabel完成;
  9. 用新root密码登录验证;
  10. 登录后执行grub2-setpassword,设GRUB密码(用户名root);
  11. grub2-mkconfig -o /boot/grub2/grub.cfg(UEFI路径相应调整);
  12. 重启,按e验证需要密码。

这套流程我在多台RHEL 9.0上跑过,正常情况15分钟内完成,relabel时间另算。第9步的登录验证很重要,别跳过直接做GRUB密码——万一root密码没改成功,你又设了GRUB密码,后面排查会更麻烦。

4.2 参数选择背后的计算与判断

有人问rd.break和rd.break=pre-mount、rd.break=cmdline这些变体怎么选。默认的rd.break停在switch_root之前,此时/sysroot已挂载但未切换,是最适合改密码的时机。pre-mount停得更早,/sysroot还没挂载,你得自己挂,多此一举。所以用默认rd.break就行,不用加参数。

关于relabel的耗时估算:SELinux relabel大致与文件数量成正比,经验值是每10万个文件约30秒到1分钟(取决于磁盘IO)。一台普通业务服务器几十万到上百万文件,预留5到15分钟比较稳妥。如果服务器有独立的大数据盘且挂载在/etc/fstab里,relabel会一并处理,时间更长。应急场景下如果实在等不及,可以在relabel启动后观察进度,但不要中途强制断电,否则上下文可能处于半修复状态,更麻烦。

grub2-mkconfig的路径判断:ls /boot/efi/EFI/redhat/grub.cfg存在就是UEFI,否则是BIOS用/boot/grub2/grub.cfg。RHEL 9.0两者都支持,别写错路径导致配置没更新。

4.3 实操现场的两个细节记录

第一个细节:在紧急shell里执行passwd时,如果提示passwd: Authentication token manipulation error,八成是/sysroot还是只读挂载,或者/etc/shadow的权限/属性有问题。先mount | grep sysroot确认rw,再lsattr /etc/shadow看有没有i(immutable)属性,有的话chattr -i /etc/shadow去掉再改。

第二个细节:relabel完成后首次登录,如果/var/log/secure里出现大量avc: denied,说明relabel没覆盖到某些自定义目录(比如手工创建在非标准路径下的文件)。这种情况用semanage fcontext加restorecon针对性修复,别急着关SELinux。标准系统目录一般不会出这问题。

5. 常见问题排查与避坑速查

5.1 重置密码环节的典型故障

现象可能原因排查与解决
进不了紧急shell,直接正常启动GRUB参数没改对或没保存重新按e,确认rd.break在linux行末尾,Ctrl+X而非Enter
mount -o remount,rw /sysroot报错设备名或挂载点不对mount查看实际挂载点,LVM环境确认/dev/mapper/下的卷名
passwd提示token manipulation errorsysroot只读或shadow有immutable属性确认rw挂载,chattr -i /etc/shadow
改完密码重启无法登录SELinux上下文错误确认执行了touch /.autorelabel,等待relabel完成
relabel卡住很久文件数量大或磁盘慢耐心等待,观察磁盘IO,勿强制断电

这张表覆盖了我遇到过的绝大多数情况。其中"改完密码无法登录"最容易被误判为密码没改成功,实际是SELinux在拦,看/var/log/audit/audit.log里的AVC记录就能确认。

5.2 GRUB密码环节的典型故障

现象可能原因排查与解决
按e仍可直接编辑grub.cfg没重新生成执行grub2-mkconfig -o正确路径,检查grub.cfg有无superusers
提示用户名密码但输对也不进用户名不是root或密码记错默认用户名root,确认user.cfg存在且内容完整
正常启动也要输密码配置了全局密码保护检查grub.cfg的set superusers作用范围,标准配置只保护编辑
升级内核后密码失效极少数情况下配置被覆盖重新grub2-mkconfig,user.cfg通常不受影响

GRUB密码这块的坑相对少,因为机制简单。最容易出问题的是"忘了重新生成grub.cfg",导致user.cfg写了但没生效,按e照样能编辑,给人一种"设了密码没用"的错觉。

5.3 几条独家避坑心得

心得一:先验证root密码再设GRUB密码。顺序反了的话,一旦root密码没改成功,你被GRUB密码挡在外面,连重试的机会都没有,只能上救援介质。这个顺序是硬性的。

心得二:.autorelabel不是可选项。我见过有人嫌relabel慢,改完密码不打标记直接重启,结果SELinux把登录流程拦了,又得重来一遍。省那几分钟换来半小时排查,不划算。

心得三:GRUB密码和root密码分开管。前面说过,这里再强调一次,因为这是安全设计问题不是操作问题。两个密码独立,泄露一个不至于全线失守。

心得四:操作前确认有没有带外管理。如果服务器有IPMI、iDRAC之类的带外管理,整个流程可以远程完成,不用跑机房。但带外管理本身也是物理接触入口,它的密码同样要管好,否则GRUB密码的意义会被削弱。

心得五:记录操作日志。应急改密码这种事,事后要留记录:什么时候改的、为什么改、新密码保管在哪、GRUB密码设了没有。团队协作环境下,这些记录能避免下一个人重复踩坑,也方便审计。

6. 安全边界再审视:这套操作到底防住了什么

把流程走完,回头再看这套操作的实际防护效果,心里要有数。root密码重置解决的是"当前访问中断"的问题,GRUB密码解决的是"未来物理接触提权"的问题。两者叠加,把"能碰键盘就能拿root"这个最廉价的口子堵上了。

但它防不住的情况也得清楚:硬盘被拆走挂到别的机器、带外管理密码泄露、BIOS允许从外部介质启动且没设密码、机箱没锁。这些属于物理安全和硬件层防线,不是GRUB密码能覆盖的。所以完整的加固应该是:GRUB密码 + BIOS密码 + 带外管理密码 + 机箱锁 + 必要时磁盘加密,层层叠加。

我在实际环境里的做法是,把这套流程写成一份内部应急手册,包含步骤清单、故障速查表和密码保管规范,新同事入职时过一遍。手册里特别标注了RHEL 9和RHEL 7的差异点(linux行名、rd.break的sysroot只读、relabel必要性),避免有人拿老经验套新系统。这套东西跑顺了之后,再遇到密码丢失的工单,基本就是照着清单执行,十几分钟收工,比临时翻教程靠谱得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询