1. 前言:当RHEL系统密码成为拦路虎
作为一名Linux系统管理员,最尴尬的瞬间莫过于站在登录界面却怎么也想不起密码。上周我就遇到了这个情况——一台闲置三个月的RHEL 8.5测试虚拟机,当我准备用它做Kubernetes实验时,突然发现root密码和普通用户密码全都记不清了。这种场景在企业运维中其实相当常见,特别是那些不常登录的测试环境或备份服务器。
不同于Windows系统可以通过PE工具重置密码,RHEL这类企业级Linux系统有着更严格的安全机制。但幸运的是,通过GRUB引导加载器的特殊模式,我们仍然可以在不破坏系统完整性的前提下重置密码。本文将详细演示两种典型场景的密码重置方案:
- root账户密码重置(系统最高权限账户)
- 普通用户账户密码重置(包括忘记root密码时的应急方案)
重要提示:该方法适用于RHEL 7/8/9及CentOS等衍生系统,但仅限本地物理机或虚拟机环境。云服务器因通常无法直接访问GRUB,需通过云平台控制台操作。
2. root账户密码重置全流程
2.1 进入GRUB编辑模式
首先重启系统,在BIOS自检完成后立即连续按ESC键(部分机型可能需要按Shift)。成功后会看到GRUB菜单界面,通常包含多个内核版本选项:
code复制Red Hat Enterprise Linux (3.10.0-1160.el7.x86_64) 7.9 (Maipo)
Red Hat Enterprise Linux (0-rescue-xxxx) 7.9 (Maipo)
使用方向键选择非救援模式的内核项(通常是第一个),然后按e键进入编辑模式。这个操作不会立即执行修改,只是临时调整启动参数。
2.2 修改内核启动参数
在编辑界面中找到以linux16或linuxefi开头的行(大约在中间位置),将光标移动到该行末尾。先添加一个空格,然后追加以下参数:
code复制rd.break enforcing=0
关键参数说明:
rd.break:在内核加载初期中断启动流程,进入紧急救援shellenforcing=0:临时关闭SELinux强制模式,避免权限问题
修改完成后按Ctrl+X或F10启动系统。大约10秒后会看到switch_root:/#提示符,表示已进入临时救援环境。
2.3 挂载并修改系统分区
在救援shell中依次执行以下命令:
bash复制mount -o remount,rw /sysroot # 以读写方式重新挂载根分区
chroot /sysroot # 切换至实际系统环境
passwd # 启动密码修改程序
此时会提示输入新密码(输入时无星号反馈,属于正常现象),需要连续输入两次确认。如果系统提示"BAD PASSWORD"警告(如密码过于简单),可以忽略继续操作。
2.4 处理SELinux上下文
由于修改了敏感系统文件,需要重建SELinux安全上下文:
bash复制touch /.autorelabel # 创建标记文件
exit # 退出chroot环境
exit # 退出救援shell
系统会自动重启并执行完整的文件系统relabel操作。这个过程可能持续2-10分钟,具体时间取决于磁盘速度和文件数量。
2.5 验证新密码
重启完成后,在登录界面:
- 用户名输入
root - 密码输入刚才设置的新密码
如果看到命令行提示符或图形界面,说明密码重置成功。建议立即执行sudo yum update检查系统更新,确保没有安全漏洞。
3. 普通用户密码重置方案
3.1 方案A:通过救援模式修改(推荐)
如果还记得root密码,这是最安全的方式:
bash复制su - # 切换到root
passwd 普通用户名 # 修改指定用户密码
输入两次新密码即可完成修改。这种方式完全在系统正常运行时操作,不会触发SELinux relabel。
3.2 方案B:无root权限时的应急方法
当root密码也遗忘时,可复用第2章的救援模式流程,只需调整passwd命令:
bash复制passwd 用户名 # 替换为实际用户名
其余步骤完全相同。需要注意的是,通过这种方式修改的密码,在首次登录时可能会遇到/home/用户名目录无法访问的问题。这是因为SELinux上下文需要修复,解决方法是:
bash复制restorecon -Rv /home/用户名 # 修复用户目录上下文
4. 深度原理与故障排查
4.1 GRUB工作机制解析
GRUB(Grand Unified Bootloader)是Linux系统的默认引导程序,其特殊之处在于:
- 允许临时修改内核参数
- 提供救援shell接口
- 所有操作仅在内存中生效,不会直接写入磁盘
当我们添加rd.break参数时,系统会:
- 加载内核和initramfs
- 暂停systemd启动流程
- 挂载临时根文件系统(tmpfs)
- 提供最小化救援环境
4.2 SELinux的影响与处理
RHEL默认启用SELinux强制模式,这会导致:
- 直接修改
/etc/shadow可能被拦截 - 新创建的密码文件可能被标记错误上下文
/.autorelabel文件的妙处在于:
- 系统重启时检测到该文件
- 自动启动
fixfiles工具 - 按
/etc/selinux/targeted/contexts/files/file_contexts规则重建上下文
4.3 常见问题解决方案
问题1:GRUB菜单不显示
解决方法:
- 检查
/etc/default/grub中GRUB_TIMEOUT值是否大于0 - 执行
grub2-mkconfig -o /boot/grub2/grub.cfg重新生成配置
问题2:密码修改后仍无法登录
排查步骤:
bash复制ausearch -m AVC -ts recent # 检查SELinux拒绝日志
restorecon -v /etc/shadow # 修复密码文件上下文
getenforce # 确认SELinux模式
问题3:虚拟机无法中断启动
对于VMware/VirtualBox:
- 确保虚拟机设置中未启用"快速启动"
- 尝试在启动时快速按
ESC或F2
5. 安全加固建议
虽然密码重置是必要的应急手段,但从安全角度建议:
- 设置GRUB密码(防止未授权修改)
bash复制
grub2-setpassword - 启用BIOS/UEFI密码
- 对物理服务器加装机柜锁
- 定期备份
/etc/shadow文件 - 使用SSH密钥认证替代密码登录
对于生产环境,建议采用集中化身份管理(如FreeIPA或Active Directory集成),避免本地密码遗忘问题。
6. 扩展应用场景
这套方法还可用于:
- 修复损坏的
/etc/passwd文件 - 恢复被锁定的用户账户
- 重置过期的root密码
- 修复因软件包更新导致的认证模块故障
我曾用此方法成功恢复过因pam_tally2模块配置错误导致的全账户锁定,关键是在救援模式下编辑/etc/pam.d/system-auth文件。
记住,能力越大责任越大。作为系统管理员,在掌握密码重置技术的同时,更要做好权限管理和操作审计。建议至少每季度检查一次关键系统的密码策略,并使用chage -l 用户名查看密码过期时间。