1 问题现状
在讨论问题之前,先假设这样的场景:某服务器管理员忘记了 root 用户的密码,不能登录服务器,此时需要进行怎样的操作来重置 root 用户的密码呢?
一般的操作流程如下:
- 重启服务器进入 grub2 界面(选择内核的界面)
- 按 “e” 进入 grub2 配置界面,找到 linux 开头的行,将该行中的
ro
修改为rw
,并在该行的末尾加上init=/bin/sh
- 使用组合键 “ctrl+x” 进入单用户模式,获得 shell 操作界面,执行
passwd root
命令为 root 用户设置密码 - 若 SELinux 为 Enforcing 状态,则还需要执行
touch /.autorelabel
命令以使系统重新打标签 - 退出单用户,重启服务器,使用新的 root 用户密码登录系统
从以上处理流程可以看到,即使在不知道服务器 root 用户密码的情况下,只要能接触到物理服务器,也能通过一系列进入系统。因此,出于安全考虑,对 grub2 加密是有必要的。以下内容摘自官方文档:
GRUB (GRand UnifiedBootloader) 是操作系统启动管理器,用来引导不同系统(如Windows、Linux)。GRUB2 是 GRUB 的升级版。系统启动时,可以通过 GRUB2 界面修改启动参数。为了确保系统的启动参数不被任意修改,需要对 GRUB2 界面进行加密,仅在输入正确的 GRUB2 口令时才能修改
openEuler 操作系统默认为 grub2 进行了加密并设置了密码,登录 grub2 的用户名为 root,登陆密码为 openEuler#12。官方文档也进行了说明,详见:帐号清单
虽然对 grub2 设置密码比较安全,但是机房重地,并非人人都能接触到物理服务器。因此在某些场景下为 grub2 加密反而使操作变得繁琐,在实际生产中,也遇到很多想要取消 grub2 加密的需求,以下就该问题提出完整的解决方案
2 如何取消 grub2 加密
2.1 临时方案
直接修改 /boot/efi/EFI/openEuler/grub.cfg 或 /boot/grub2/grub.cfg 文件,当然也可以修改 /etc/grub2-efi.cfg 文件(与前述文件是软链接关系),将如下代码删除:
set superusers=root
password_pbkdf2 root grub.pbkdf2.sha512.10000.5A45748D892672FDA02DD3B6F7AE390AC6E6D532A600D4AC477D25C7D087644697D8A0894DFED9D86DC2A27F4E01D925C46417A225FC099C12DBD3D7D49A7425.2BD2F5BF4907DCC389CC5D165DB85CC3E2C94C8F9A30B01DACAA9CD552B731BA1DD3B7CC2C765704D55B8CD962D2AEF19A753CBE9B8464E2B1EB39A3BB4EAB08
删除上述代码后,再次重启系统进入 grub2 就不再需要输入密码。然而作为临时方案,这种操作是不能永久生效的
当执行了 grub2-mkconfig -o /path/to/grub.cfg
命令或执行了能触发该命令的操作时,都会重新生成 grub.cfg 文件,使得被删除的代码又重新写入
2.2 永久方案
只要删除 /etc/grub.d/00_header 文件末尾 cat <<EOF ... EOF
部分的代码,即可实现永久取消 grub2 加密
在临时方案中修改 grub.cfg 文件时,注意到删除的代码位于以下两行注释中:
### BEGIN /etc/grub.d/00_header ###
......
set superusers=root
password_pbkdf2 root grub.pbkdf2.sha512.10000.5A45748D892672FDA02DD3B6F7AE390AC6E6D532A600D4AC477D25C7D087644697D8A0894DFED9D86DC2A27F4E01D925C46417A225FC099C12DBD3D7D49A7425.2BD2F5BF4907DCC389CC5D165DB85CC3E2C94C8F9A30B01DACAA9CD552B731BA1DD3B7CC2C765704D55B8CD962D2AEF19A753CBE9B8464E2B1EB39A3BB4EAB08
### END /etc/grub.d/00_header ###
可见这两行用于加密的代码来自于 /etc/grub.d/00_header 文件,那么接下来修改这个文件。该文件末尾有以下代码,表示在生成 grub.cfg 文件时,通过 cat <<EOF ... EOF
命令将加密的代码写入 grub.cfg 文件:
cat <<EOF
set superusers=root
password_pbkdf2 root grub.pbkdf2.sha512.10000.5A45748D892672FDA02DD3B6F7AE390AC6E6D532A600D4AC477D25C7D087644697D8A0894DFED9D86DC2A27F4E01D925C46417A225FC099C12DBD3D7D49A7425.2BD2F5BF4907DCC389CC5D165DB85CC3E2C94C8F9A30B01DACAA9CD552B731BA1DD3B7CC2C765704D55B8CD962D2AEF19A753CBE9B8464E2B1EB39A3BB4EAB08
EOF
因此只要删除 /etc/grub.d/00_header 文件末尾 cat <<EOF ... EOF
部分的代码,即可实现永久取消 grub2 加密
2.3 彻底解决方案
删除 /usr/sbin/security-tool.sh 文件第 948 行的代码
删除的代码内容如下:
echo -e "cat <<EOF\nset superusers="root"\npassword_pbkdf2 root grub.pbkdf2.sha512.10000.5A45748D892672FDA02DD3B6F7AE390AC6E6D532A600D4AC477D25C7D087644697D8A0894DFED9D86DC2A27F4E01D925C46417A225FC099C12DBD3D7D49A7425.2BD2F5BF4907DCC389CC5D165DB85CC3E2C94C8F9A30B01DACAA9CD552B731BA1DD3B7CC2C765704D55B8CD962D2AEF19A753CBE9B8464E2B1EB39A3BB4EAB08\nEOF\n" >> /etc/grub.d/00_header
在永久解决方案中,/etc/grub.d/00_header 文件末尾 cat <<EOF ... EOF
部分的代码也不是凭空产生的,而是由 /usr/sbin/security-tool.sh 这个文件的第 948 行代码写入的,因此只要将其删除,即可从源头上取消 grub2 加密
3 总结
grub2 加密的流程为:
- 先通过 /usr/sbin/security-tool.sh 文件第 948 行的代码将加密指令写入 /etc/grub.d/00_header 文件末尾
- 再通过/etc/grub.d/00_header 文件末尾的加密指令,将加密内容写入 grub.cfg 文件
- 系统启动时读取 grub.cfg 文件的加密内容从而对 grub2 加密
在了解 grub2 加密的流程后,就可以在每个阶段进行操作,从而达到彻底取消、永久取消、临时取消 grub2 加密的目的