如何保护GRUB2在Linux中无需密码即可引导内核
我们希望保护GRUB2免受未经授权的访问,那么除了指定用户之外,没有其他人可以从内核引导系统。
GRUB2提供两种类型的密码保护:
修改菜单项需要密码,但引导现有菜单项则不需要密码;
修改菜单项和引导一个,多个或者所有菜单项都需要密码。
在上述两个用例中,设置密码和保护GRUB2的步骤是相同的。
使用grub2-setpassword
设置密码可以防止菜单项未经授权的修改,但不能防止在启动阶段未经授权的内核启动。
警告:
如果我们忘记了GRUB2密码,将无法启动按照以下过程重新配置的条目
保护GRUB2避免在没有密码的情况下引导内核的步骤
首先使用grub2-setpassword
和root
用户创建一个密码。
# 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
就是这样,现在我们可以重新启动节点以验证更改。
在引导加载程序阶段,该节点将不再提示输入任何密码。