4、GRUB2安全配置:GRUB2配置文件结构、密码保护、签名验证、禁用不安全模块

各位好,我是老周。今天咱们聊聊GRUB2的安全配置。说实话,GRUB2这玩意儿,很多人装完系统就扔那儿不管了。但你要知道,它是系统启动的第一道门槛。我见过太多服务器,GRUB2裸奔着,谁都能进单用户模式改root密码。嗯,这跟把家门钥匙挂在门外有啥区别?

咱们这一章,就把它彻底锁死。

4.1 GRUB2配置文件结构:你得知道它长啥样

GRUB2的配置文件,核心就两个地方:

  • /etc/default/grub:这是主配置模板。你改这里,然后跑update-grub生成最终文件。
  • /boot/grub/grub.cfg:这是最终生效的配置文件。注意,不要手动编辑它!我刚开始学的时候犯过这错,直接改grub.cfg,结果update-grub一跑,全给我覆盖了。白忙活。

另外,/etc/grub.d/目录下有一堆脚本,比如00_header、10_linux、30_os-prober。这些脚本按数字顺序执行,拼装出最终的grub.cfg。你自定义的配置,最好放在40_custom里,别乱改前面的脚本。

我的习惯:每次改完配置,先跑grub-mkconfig -o /boot/grub/grub.cfg看看输出有没有报错。确认无误再重启。别问我为什么强调这个——有一次我忘了检查,重启后直接进了grub rescue>,那叫一个酸爽。

4.2 密码保护:别让任何人随便改启动项

GRUB2支持两种密码模式:

  • 普通密码:进入GRUB菜单时,按e编辑启动项需要密码。
  • 超级用户密码:只有超级用户才能编辑菜单、进入命令行。普通用户只能选菜单项启动。

我个人建议用超级用户模式。为什么?你想想看,如果只设普通密码,那别人虽然不能改启动参数,但还能进GRUB命令行。在命令行里,他可以直接insmod加载模块、ls查看分区、甚至cat读文件。这风险太大了。

设置方法如下:

# 生成密码哈希
grub-mkpasswd-pbkdf2
# 输入密码后,会得到一串类似 grub.pbkdf2.sha512.10000.xxxx 的哈希值

# 编辑 /etc/grub.d/40_custom,添加:
set superusers="admin"
password_pbkdf2 admin grub.pbkdf2.sha512.10000.xxxx

# 更新配置
update-grub
注意:密码哈希是明文写在配置文件里的。虽然PBKDF2很难破解,但物理接触到你机器的人,还是能看到哈希。所以,别用你常用的密码。我曾经见过有人把AD域密码设成GRUB密码,结果哈希泄露了……嗯,后面的事我就不说了。

4.3 签名验证:防止启动文件被篡改

密码保护只能防住交互式攻击。如果有人物理接触你的机器,直接替换/boot目录下的内核或GRUB模块呢?这时候就需要签名验证了。

GRUB2支持使用GPG签名来验证文件完整性。流程是这样的:

  1. 生成GPG密钥对
  2. 用私钥对内核、initramfs、GRUB模块签名
  3. 把公钥嵌入到GRUB的core.img中
  4. 配置GRUB只加载已签名的文件

具体操作:

# 1. 生成GPG密钥
gpg --gen-key

# 2. 导出公钥
gpg --export -a > /tmp/pubkey.asc

# 3. 将公钥嵌入GRUB
grub-install --pubkey /tmp/pubkey.asc /dev/sda

# 4. 签名内核和initramfs
gpg --detach-sign /boot/vmlinuz-xxx
gpg --detach-sign /boot/initrd.img-xxx

# 5. 在 /etc/grub.d/40_custom 中添加:
check_signatures=enforce

这里有个坑:签名验证一旦开启,所有加载的文件都必须有签名。包括GRUB模块(.mod文件)、字体文件、背景图片。我遇到过最头疼的情况是,更新内核后忘了签名新内核,结果重启直接卡在GRUB界面,提示签名验证失败。最后只能进rescue模式手动签名。

避坑指南:我曾经在批量部署时,写了个脚本自动签名所有/boot下的文件。但有个服务器因为磁盘空间不足,签名文件没写全,结果启动失败。后来我改成先检查签名文件是否存在,再开启enforce模式。稳多了。

4.4 禁用不安全模块:减少攻击面

GRUB2有很多模块,但不是每个都安全。有些模块在特定场景下可以被利用来绕过安全限制。比如:

模块名 风险说明 建议
cryptodisk 允许GRUB直接访问加密分区,如果密码泄露,攻击者可解密磁盘 非必要不加载
loopback 支持挂载镜像文件,可能被用来加载恶意镜像 禁用
usb 支持USB键盘/存储,物理攻击者可插入恶意USB设备 服务器环境禁用
efi_netboot 支持网络启动,可能被中间人攻击 按需启用
test 条件判断模块,本身无风险,但常被用于复杂攻击链 保留

禁用模块的方法:在/etc/default/grub中设置GRUB_DISABLE_MODULES变量。

# 编辑 /etc/default/grub
GRUB_DISABLE_MODULES="cryptodisk loopback usb efinet"

# 更新配置
update-grub

注意,有些模块是GRUB核心功能依赖的,比如normal、boot、linux。这些不能禁用,否则GRUB直接罢工。我刚开始做安全加固时,一激动把normal也禁了,结果重启后GRUB直接报错,连菜单都出不来。最后只能进Live CD修复。

我的建议:先在一个测试环境里试,确认禁用后系统能正常启动,再推到生产环境。别问我为什么强调这个——有一次我在生产环境上直接改,差点酿成事故。

4.5 知识体系总览

下面这张图,把GRUB2安全配置的核心逻辑串起来了。你可以把它当作一个检查清单:

GRUB2安全配置核心逻辑 GRUB2安全配置 配置文件结构 /etc/default/grub /boot/grub/grub.cfg /etc/grub.d/ 脚本 密码保护 超级用户密码 PBKDF2哈希 限制编辑/命令行 签名验证 GPG密钥对 签名内核/模块 enforce模式 禁用不安全模块 cryptodisk / loopback usb / efi_netboot GRUB_DISABLE_MODULES 目标:防止未授权修改启动项、防止启动文件被篡改

说白了,GRUB2安全配置就四个维度:知道文件在哪、锁住菜单、验明正身、关掉危险功能。这四个维度缺一不可。我见过有人只设了密码,但没禁用USB模块,结果攻击者插个USB键盘进GRUB命令行,密码形同虚设。也见过有人只做了签名验证,但没设密码,结果攻击者直接改grub.cfg关掉签名检查。

安全是环环相扣的。每一个环节,都是你防线的一部分。

好了,这一章就到这里。记住,GRUB2安全配置不是做完就完事的。每次内核更新、GRUB升级,都要重新检查一遍。别偷懒,安全这事儿,偷懒一次可能就要付出代价。

可可精品资料库