引言
场景说明:
你是乙方交付人员,需要把一台 Ubuntu 24.04 虚拟机交付给甲方业务团队使用。 甲方有虚拟机系统内账号,并且可能打开虚拟机控制台看到 GRUB 菜单,但不应被允许通过“编辑启动参数或进入恢复模式”来绕过登录并读取数据。
假设甲方没有 hypervisor 管理员权限,也拿不到虚拟磁盘文件。如果这些前提不成立,请在答案里明确说明风险与补救措施(例如磁盘加密、平台侧权限隔离)
目标:
正常启动业务无感知,但 GRUB 编辑
/ recovery / single user等入口必须被口令拦住。 目标与威胁模型防止交付后的 VM 被人在控制台/GRUB 环境下通过
init=/bin/bash、进入 recovery、修改passwd/shadow等方式绕过登录,从而读取或拷贝数据。
边界:
如果甲方可以拿到虚拟磁盘文件(vmdk/qcow2)并离线挂载,或拥有 管理程序(ESXi/Proxmox/KVM)管理员权限,仅靠 OS/GRUB 级加固无法从根本上阻止离线拷贝。此时应配合磁盘加密 + 密钥托管 + 平台级权限隔离
任务目标:
能说清楚本文的威胁模型和边界条件,并能落地完成GRUB口令保护的关键步骤
能在安全与可用性之间做出合理取舍(正常启动免口令,危险入口需口令)
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 加密密码
登录 Ubuntu 系统,执行以下命令生成 GRUB 密码的加密哈希(避免明文存储):
sudo grub-mkpasswd-pbkdf2结果图

步骤 2:配置 GRUB 管理员密码
编辑 GRUB 核心配置文件:
sudo nano /etc/grub.d/00_header找到
$recordfail_broken,在if和EOF中间粘贴以下内容(替换为步骤 1 复制的哈希值):
# 设置 GRUB 超级管理员账号与密码
set superusers="admin"
password_pbkdf2 admin 复制的grub.pbkdf2.sha512开头的哈希字符串结果图

步骤 3:启动免密 + 编辑需密
启动免密和编辑需密都在这个文本里
sudo nano /etc/grub.d/10_linux启动无需密码
# 添加 --unrestricted 正常启动免密
echo "menuentry '$(echo "$title" | grub_quote)' --unrestricted ${CLASS} ..."
# 添加 --unrestricted 子菜单启动项
echo "menuentry '$(echo "$os" | grub_quote)' --unrestricted ${CLASS}..."结果图

编辑权限限制(按e需要密码,这是局部规则
""里除了超级用户还可以添加用户)
# 找到 linux_entry 函数里的这一行 添加 --users "" 参数:
linux_entry "${OS}" "${version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" --users ""结果图

进阶兜底
# 在 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:禁用恢复模式
编辑 GRUB 默认配置文件:
sudo nano /etc/default/grub找到以下行:
# 若有注释符 # 则删除
GRUB_DISABLE_RECOVERY="true"
# 确保该行无注释且值为 true
# 禁用恢复模式入口,减少攻击面结果图

步骤 5:使配置生效
执行以下命令更新 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:验证加固效果
重启虚拟机:
sudo reboot验证场景(核心验收点):
正常启动:选择 Ubuntu 启动项,无需密码直接进入系统(业务无感)
(a)结果图

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

恢复模式:无恢复模式入口
(a)结果图:

单用户模式:需验证 GRUB 密码才能进入
注意事项
务必记录好 GRUB 密码(丢失后无法编辑启动项,需通过安装介质重置);
若需修改 GRUB 密码,重复步骤 1-5 即可;
操作过程中若输错配置,可重新编辑对应文件后执行
sudo update-grub修复