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
4.3 签名验证:防止启动文件被篡改
密码保护只能防住交互式攻击。如果有人物理接触你的机器,直接替换/boot目录下的内核或GRUB模块呢?这时候就需要签名验证了。
GRUB2支持使用GPG签名来验证文件完整性。流程是这样的:
- 生成GPG密钥对
- 用私钥对内核、initramfs、GRUB模块签名
- 把公钥嵌入到GRUB的core.img中
- 配置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模式手动签名。
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安全配置就四个维度:知道文件在哪、锁住菜单、验明正身、关掉危险功能。这四个维度缺一不可。我见过有人只设了密码,但没禁用USB模块,结果攻击者插个USB键盘进GRUB命令行,密码形同虚设。也见过有人只做了签名验证,但没设密码,结果攻击者直接改grub.cfg关掉签名检查。
安全是环环相扣的。每一个环节,都是你防线的一部分。
好了,这一章就到这里。记住,GRUB2安全配置不是做完就完事的。每次内核更新、GRUB升级,都要重新检查一遍。别偷懒,安全这事儿,偷懒一次可能就要付出代价。