Administrator
发布于 2026-03-10 / 22 阅读
0
0

Ubuntu 24.04 虚拟机 GRUB 安全加固方案

引言

场景说明:

你是乙方交付人员,需要把一台 Ubuntu 24.04 虚拟机交付给甲方业务团队使用。 甲方有虚拟机系统内账号,并且可能打开虚拟机控制台看到 GRUB 菜单,但不应被允许通过“编辑启动参数或进入恢复模式”来绕过登录并读取数据。

假设甲方没有 hypervisor 管理员权限,也拿不到虚拟磁盘文件。如果这些前提不成立,请在答案里明确说明风险与补救措施(例如磁盘加密、平台侧权限隔离)

目标:

  1. 正常启动业务无感知,但 GRUB 编辑 / recovery / single user 等入口必须被口令拦住。 目标与威胁模型

  2. 防止交付后的 VM 被人在控制台/GRUB 环境下通过 init=/bin/bash、进入 recovery、修改 passwd/shadow 等方式绕过登录,从而读取或拷贝数据。

边界:

如果甲方可以拿到虚拟磁盘文件(vmdk/qcow2)并离线挂载,或拥有 管理程序(ESXi/Proxmox/KVM)管理员权限,仅靠 OS/GRUB 级加固无法从根本上阻止离线拷贝。此时应配合磁盘加密 + 密钥托管 + 平台级权限隔离

任务目标:

  1. 能说清楚本文的威胁模型和边界条件,并能落地完成GRUB口令保护的关键步骤

  2. 能在安全与可用性之间做出合理取舍(正常启动免口令,危险入口需口令)

GRUB 与 Hypervisor 安全边界说明

什么是 GRUB?

你可以把它理解成:电脑开机时的 “启动选择菜单”

  • 你开机看到的那个黑底白字、让你选系统的界面,就是 GRUB

  • 它在还没进系统之前就出现了

  • 正常情况:你只需要等几秒,它就自动进 Ubuntu

  • 危险情况:别人按 e 就能修改启动参数,直接变成 root,不用密码

我们要加固的就是:谁想碰 GRUB、改启动项,必须输密码

GRUB 比喻

你家大门是系统登录密码但你家门口还有个小后门(GRUB)别人不用钥匙,直接撬这个后门就能进家。

我们做的加固:把这个小后门上锁,只有你有钥匙

什么是 hypervisor?

hypervisor = 虚拟机管理平台你可以理解成:虚拟机的 “房东 / 管理员”

常见的 hypervisor 有:

  • VMware ESXi

  • Proxmox

  • KVM

  • 虚拟机平台后台

它的权力非常大:

  • 能看虚拟机里的所有内容

  • 能拷贝虚拟磁盘文件(qcow2、vmdk)

  • 能重置、挂载、破解系统密码

只要有 hypervisor 权限,操作系统再加固都拦不住

hypervisor 比喻

你住的是出租屋(虚拟机)hypervisor 就是房东房东有整栋楼的钥匙,能直接开门进你房间,拦不住

安全边界(非常重要)

  • GRUB 加固只能防护虚拟机控制台操作,无法防护来自虚拟化平台层面的攻击。

  • 如果甲方拥有 Hypervisor 管理员权限,或能获取虚拟磁盘文件,仅靠操作系统加固无法保证数据安全

  • 更高安全等级必须依赖:磁盘加密(LUKS)+ 虚拟化平台权限隔离 + 密钥统一托管

交付结论

本次交付已完成:

  • GRUB 启动菜单口令保护

  • 禁止未授权进入单用户 / 恢复模式

  • 正常业务启动无感知

可有效防止控制台物理 / 虚拟接触方式绕过登录。若需防范虚拟机文件被拷贝、Hypervisor 管理员越权访问,需额外实施磁盘加密与平台权限管控

GRUB 密码加固操作步骤

前置说明

适用系统:Ubuntu 24.04 LTS操作权限:需使用 sudo 执行所有命令(需 root 权限)核心目标:正常启动免密,编辑 / 恢复模式需密码验证

步骤 1:生成 GRUB 加密密码

  1. 登录 Ubuntu 系统,执行以下命令生成 GRUB 密码的加密哈希(避免明文存储):

sudo grub-mkpasswd-pbkdf2
  • 结果图

步骤 2:配置 GRUB 管理员密码

  1. 编辑 GRUB 核心配置文件:

sudo nano /etc/grub.d/00_header
  1. 找到$recordfail_broken,在 ifEOF中间粘贴以下内容(替换为步骤 1 复制的哈希值):

# 设置 GRUB 超级管理员账号与密码
set superusers="admin"
password_pbkdf2 admin 复制的grub.pbkdf2.sha512开头的哈希字符串
  • 结果图

步骤 3:启动免密 + 编辑需密

  1. 启动免密和编辑需密都在这个文本里

sudo nano /etc/grub.d/10_linux
  1. 启动无需密码

# 添加 --unrestricted 正常启动免密 
echo "menuentry '$(echo "$title" | grub_quote)' --unrestricted ${CLASS} ..."

# 添加 --unrestricted 子菜单启动项
echo "menuentry '$(echo "$os" | grub_quote)' --unrestricted ${CLASS}..."
  • 结果图

  1. 编辑权限限制(按e需要密码,这是局部规则""里除了超级用户还可以添加用户)

# 找到 linux_entry 函数里的这一行 添加 --users "" 参数:

linux_entry "${OS}" "${version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" --users ""
  • 结果图

  1. 进阶兜底

# 在 linux_entry 函数的开头,找到这几行
linux_entry ()
{
  os="$1"
  version="$2"
  type="$3"
  args="$4"

# 在 args="$4" 的下一行,直接添加过滤代码:
# 过滤危险参数
args=$(echo "$args" | sed -e 's/init=\/bin\/bash//g' -e 's/init=\/bin\/sh//g')
  • 结果图

步骤 4:禁用恢复模式

  1. 编辑 GRUB 默认配置文件:

sudo nano /etc/default/grub
  1. 找到以下行:

# 若有注释符 # 则删除

GRUB_DISABLE_RECOVERY="true"

# 确保该行无注释且值为 true
# 禁用恢复模式入口,减少攻击面
  • 结果图

步骤 5:使配置生效

  1. 执行以下命令更新 GRUB 配置:

sudo update-grub
  • 结果图

步骤 6:系统层兜底(单用户模式需 root 密码)

# 编辑 initramfs 配置,启用 busybox
sudo nano /etc/initramfs-tools/initramfs.conf

# 找到 BUSYBOX=y 这一行(如果没有,手动添加)
BUSYBOX=y

# 更新initramfs
sudo update-initramfs -u -k all

# 加固root密码(务必设置强密码)
sudo passwd root

# 配置 PAM 强制认证
sudo nano /etc/pam.d/sulogin

#确保文件包含以下内容
# 限制 root 仅能在安全终端登录
auth    required        pam_securetty.so
# 强制验证 root 密码
auth    required        pam_unix.so
# 验证账户有效性
account required        pam_unix.so
# 管理会话
session required        pam_unix.so

步骤 7:验证加固效果

  1. 重启虚拟机:

sudo reboot
  1. 验证场景(核心验收点):

  • 正常启动:选择 Ubuntu 启动项,无需密码直接进入系统(业务无感)

(a)结果图

  • 编辑启动项:按 e 键,弹出用户名 / 密码验证框,输入 admin + 步骤 1 设置的密码才能编辑

(a)结果图

  • 恢复模式:无恢复模式入口

(a)结果图:

  • 单用户模式:需验证 GRUB 密码才能进入

注意事项

  1. 务必记录好 GRUB 密码(丢失后无法编辑启动项,需通过安装介质重置);

  2. 若需修改 GRUB 密码,重复步骤 1-5 即可;

  3. 操作过程中若输错配置,可重新编辑对应文件后执行 sudo update-grub 修复


评论