如何保护GRUB2在Linux中无需密码即可引导内核

时间:2020-02-23 14:40:16  来源:igfitidea点击:

我们希望保护GRUB2免受未经授权的访问,那么除了指定用户之外,没有其他人可以从内核引导系统。

GRUB2提供两种类型的密码保护:

  • 修改菜单项需要密码,但引导现有菜单项则不需要密码;

  • 修改菜单项和引导一个,多个或者所有菜单项都需要密码。

在上述两个用例中,设置密码和保护GRUB2的步骤是相同的。
使用grub2-setpassword设置密码可以防止菜单项未经授权的修改,但不能防止在启动阶段未经授权的内核启动。

警告:

如果我们忘记了GRUB2密码,将无法启动按照以下过程重新配置的条目

保护GRUB2避免在没有密码的情况下引导内核的步骤

首先使用grub2-setpasswordroot用户创建一个密码。

# grub2-setpassword
Enter password:
Confirm password:

此命令将使用哈希密码创建(如果尚不存在)或者更新/boot/grub2/user.cfg的内容

# cat /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.BB05A464F1E8C1AFC62CAE808679084D07B2DB9635934A8B7640BF84329455114E36001854108B7080D0A8A6335CBCBBA3E7B86BDF7468F307EE4EEFDCC294E2.CED195B269E2C60A94B5C61EFCF6B610383C306D5313CDB65DBE8063C7B8BDB1E571BD4661D398A7626878BF6055435658741D804F01A8E679DC69E8510B72A0

打开/boot/grub2/grub.cfg文件。

通过搜索以menuentry开头的行来找到要使用密码保护的引导条目。

例如,从菜单输入块中删除--unrestricted参数

menuentry 'Red Hat Enterprise Linux Server (3.10.0-862.6.3.el7.x86_64) 7.4 (Maipo)' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-862.6.3.el7.x86_64-advanced-eeec84ef-a61a-4907-adba-3a1ed52a144b' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod part_msdos
        insmod diskfilter
        insmod mdraid1x
        insmod ext2
        set root='mduuid/8cde9b0cbcafd5dc9814309e952e758d'

更改后,内容应如下所示

menuentry 'Red Hat Enterprise Linux Server (3.10.0-862.6.3.el7.x86_64) 7.4 (Maipo)' --class red --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.10.0-862.6.3.el7.x86_64-advanced-eeec84ef-a61a-4907-adba-3a1ed52a144b' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod part_msdos
        insmod diskfilter
        insmod mdraid1x
        insmod ext2
        set root='mduuid/8cde9b0cbcafd5dc9814309e952e758d'

保存并关闭文件。

说明:

每当grub2-mkconfig用于重新生成initramfs文件时,此文件中所做的更改将被覆盖。
因此,每次调用grub2-mkconfig时,都必须重新执行上述步骤

重新启动节点以验证更改。
系统进入引导加载程序阶段后,将提示我们输入"用户名"和"密码"(假设默认的内核访问受到限制)

密码保护GRUB2中的所有内核条目

如果我们希望用密码保护grub2.cfg中所有可用的内核条目,则可以从/etc/grub.d/10_linux中删除--unrestricted参数。

备份现有文件

# /etc/grub.d/10_linux /etc/grub.d/10_linux.bkp

--unrestricted删除内容

# sed -i "/^CLASS=/s/--unrestricted//" /etc/grub.d/10_linux

接下来为根用户创建GRUB2密码以保护GRUB2

# grub2-setpassword
Enter password:
Confirm password:

最后,使用新更改重建initramfs和vmlinuz

对于基于BIOS的计算机:

# grub2-mkconfig -o /boot/grub2/grub.cfg

对于基于UEFI的机器:

# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

继续重启以确认更改

删除GRUB2密码的步骤

要恢复更改,我们必须在/etc/grub.d/10_linux中重新添加--unrestricted值(或者,如果我们有备份文件,则覆盖现有文件

正确的10_linux文件到位后,重新构建initramfs

对于基于BIOS的计算机:

# grub2-mkconfig -o /boot/grub2/grub.cfg

对于基于UEFI的机器:

# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

接下来,删除使用grub2-setpassword创建的grub2密码。

# rm -f /boot/grub2/user.cfg

就是这样,现在我们可以重新启动节点以验证更改。
在引导加载程序阶段,该节点将不再提示输入任何密码。