第一部分:理解问题与威胁模型

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 的安全风险点

攻击方式

操作

后果

编辑启动参数

按 'e' 添加 init=/bin/bash

直接获得 root shell

单用户模式

添加 single 或 1

无需密码进入维护模式

恢复模式

选择 recovery mode

通过菜单获取 root

GRUB 命令行

按 'c' 进入命令行

手动加载内核、读取文件

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.42CB82A829A9E899A43BF7B128FA1EB46BA4C3EC3433F0660357385003AC20BC983327506E7DE352D94210223822E16505F9A855588CC907FC43614130B2B62D

3.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=5

3.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(证明防护被突破需要先认证)