第一部分:理解问题与威胁模型
1.1 真实场景还原
作为乙方交付人员,你刚为甲方部署了一台关键的 Ubuntu 24.04 虚拟机。甲方业务团队将通过 SSH 远程使用系统内的账号。但根据合规要求,甲方人员也可能通过虚拟化平台的控制台直接访问这台虚拟机。
潜在风险:任何能打开虚拟机控制台的人,在 GRUB 启动菜单界面,只需按 'e' 键添加 init=/bin/bash 或选择恢复模式,就能完全绕过系统登录,直接获得 root 权限,读取所有数据。
1.2 威胁模型分析
假设前提(本方案有效的前提)
✅ 甲方没有 hypervisor 管理员权限(无法直接挂载磁盘)
✅ 甲方拿不到虚拟磁盘文件(vmdk/qcow2)
✅ 甲方仅能通过控制台看到 GRUB 菜单
1.3 加固目标
正常启动:用户无感知,业务自动运行
危险操作:编辑启动参数、恢复模式、单用户模式必须口令认证
交付文档:清晰说明防护边界和风险
第二部分:GRUB 核心概念详解
2.1 什么是 GRUB?
GRUB(GRand Unified Bootloader)是 Linux 系统中最常用的引导加载程序,在操作系统启动之前运行。
可以把它理解为"系统的守门人":
平时:正常开门,让用户进入系统(正常启动)
异常时:如果有人想走"后门"(编辑模式、恢复模式),需要检查证件
2.2 GRUB 的安全风险点
2.3 GRUB 的权限模型
GRUB 2 引入了类似 UNIX 的权限控制:
superusers:超级用户,拥有所有权限
普通用户:仅能执行被授权的菜单项
--unrestricted:标记的菜单项无需认证即可启动
password_pbkdf2:使用 PBKDF2 算法存储密码哈希
第三部分:GRUB 口令保护实施步骤
3.1 生成强密码哈希
sudo grub-mkpasswd-pbkdf2
释义:
sha512:使用 SHA-512 哈希算法
10000:迭代次数(可增加,但会影响启动速度)
后面的长字符串:盐值 + 哈希结果
重要:完整复制这串哈希值,不要遗漏任何字符。
3.2 配置 GRUB 用户认证
编辑自定义配置文件:
sudo vim /etc/grub.d/40_custom添加以下内容:
#!/bin/sh
exec tail -n +3 $0
# 本文件用于 GRUB 自定义配置
# 设置超级用户
set superusers="grubadmin"
# 设置密码
password_pbkdf2 grubadmin grub.pbkdf2.sha512.10000.A65A382A3B05263F9EE905CAF52CBD0A677B12921D1D0A59B9DC0A743EF89C2C62DE5ADE397534499B1E8085DA74608B3D489A4DBF273EB7901ABC61321104A6.42CB82A829A9E899A43BF7B128FA1EB46BA4C3EC3433F0660357385003AC20BC983327506E7DE352D94210223822E16505F9A855588CC907FC43614130B2B62D3.3 确认正常启动免密机制
GRUB 2 的菜单项由 /etc/grub.d/10_linux 脚本生成:
正常启动项自动添加 --unrestricted 标志
恢复模式没有此标志
验证生成的配置:
# 查看 grub.cfg 中的菜单项
sudo cat /boot/grub/grub.cfg | grep -A5 -B2 "menuentry"正常启动项应包含 --unrestricted:

3.4 隐藏恢复模式
为了进一步缩减攻击面,建议直接关闭 Recovery Mode。
关闭 Recovery Mode 可以:
减少一个需要密码保护的入口
防止未来 GRUB 配置错误导致意外开放
简化安全配置(少一个需要验证的地方)
编辑 /etc/default/grub:
# 关闭恢复模式(取消注释或添加此行)
GRUB_DISABLE_RECOVERY="true"
# 确保没有设置超时为0(方便维护)
GRUB_TIMEOUT=53.5 应用配置并更新
sudo update-grub
第四部分:验证
4.1 正常启动免密
# 重启虚拟机
sudo reboot
# 观察:GRUB 菜单倒计时后自动启动
# 进入系统登录界面(无需输入 GRUB 密码)4.2 编辑启动参数需要密码
l 重启虚拟机
l GRUB 菜单出现时,按 'e' 键

l 应出现认证提示:
Enter username:
Password:

l 密码正确后进入编辑界面

l 找到 linux 行,在末尾添加:init=/bin/bash

l 按 Ctrl+X 或 F10 启动
l 启动后获得 root shell(证明防护被突破需要先认证)
