GRUB(Grand Unified Bootloader) 是 Linux 系统最常用的引导加载程序。它不仅负责加载内核,还提供了多系统切换、引导参数修改等功能。
一、 GRUB 的工作原理
由于 BIOS/UEFI 无法直接识别复杂的 Linux 文件系统(如 Ext4, LVM, XFS),GRUB 采用了分阶段引导的设计:
- Stage 1 (MBR/EFI Part):驻留在硬盘主引导记录或 EFI 分区中。它的唯一任务是找到并加载 Stage 1.5 或 Stage 2。
- Stage 1.5:包含文件系统驱动程序,使 GRUB 能够读取
/boot/grub目录下的内容。 - Stage 2:加载图形菜单、读取配置文件(
grub.cfg),并根据指令将 Linux 内核(vmlinuz)和初始化内存盘(initrd)加载到内存中。
二、 为什么要给 GRUB 加密码?
默认情况下,任何人只要能物理接触到服务器,就可以在开机时通过按e键进入编辑模式,在内核行末尾添加init=/bin/bash或rd.break。这允许攻击者绕过root密码验证,直接获得最高权限的 Shell。
三、 GRUB 安全加固步骤(实战)
我们将实现:允许系统正常启动,但禁止未经授权编辑启动参数。
步骤 1:生成密码哈希值
不要使用明文密码。使用 GRUB 内置工具生成 PBKDF2 加密哈希:
grub-mkpasswd-pbkdf2输入并确认你的密码,系统会输出一段以grub.pbkdf2.sha512...开头的长字符串。请完整复制这段字符串。
步骤 2:定义管理员用户
编辑自定义配置文件,不要直接修改grub.cfg,因为它是动态生成的。
nano/etc/grub.d/40_custom在文件末尾添加以下内容:
setsuperusers="admin_user"password_pbkdf2 admin_user[刚才复制的哈希值]步骤 3:解除正常启动的限制(可选但推荐)
默认情况下,设置superusers后,每次开机都要输密码。如果希望仅在编辑(按 e)时输密码,需要修改 10_linux 脚本:
# 在 --class gnu-linux 后添加 --unrestrictedsed-i's/--class gnu-linux/--class gnu-linux --unrestricted/g'/etc/grub.d/10_linux步骤 4:更新配置生效
执行命令将修改后的逻辑同步到真正的引导文件:
update-grub四、 验证与总结
| 场景 | 行为 | 结果 |
|---|---|---|
| 开机自动等待 | 直接回车或等待超时 | 正常进入系统 |
按e编辑 | 尝试修改内核参数 | 提示输入用户名和密码 |
按c命令行 | 尝试进入 GRUB 控制台 | 提示输入用户名和密码 |
五、 核心命令速查表
- 生成密码:
grub-mkpasswd-pbkdf2 - 配置文件路径:
/etc/grub.d/(脚本) 和/boot/grub/grub.cfg(最终配置) - 应用更改:
update-grub(Debian/Ubuntu) 或grub2-mkconfig -o /boot/grub2/grub.cfg(CentOS/RHEL)