您的位置:首页 > 其它

Grub2加密----"禁止"修改启动菜单

2018-03-03 10:03 405 查看

Grub2加密—-“禁止”修改启动菜单

自己的机子装了双系统,改用 Grub2 引导 Windows.

这就带来一个问题: Linux 的 root 密码可以通过进入单用户模式重置(大家都知道).

可以把整个Grub2加密,但这样每次都要输入密码,很麻烦.

如果只在修改启动参数时才要输入密码,而正常引导不用,问题就解决了.

查了一下资料,参考了别人的做法,笔记如下.

系统为 Ubuntu 16.04 LTS,UEFI 引导

仅供参考,请结合实际情况谨慎操作

修改前,建议预先备份文件

如有错误,欢迎指正,谢谢

E-mail:tophf4@126.com

大概流程:

1. 设置超级用户

2. 对相应菜单项设置限制

3. 更新grub.cfg

Grub2加密—-“禁止”修改启动菜单
设置Grub2超级用户
添加脚本文件

设置用户及密码加密至脚本文件中

对相应菜单项进行加密
找到引导界面中的菜单项在相应生成脚本的位置

添加菜单项参数

更新grub.cfg

其他

设置Grub2超级用户

注意,这里的用户不是系统中的用户

添加脚本文件

要启用加密认证支持,必须设置超级用户,其拥有拥有所有系统菜单进入、修改、启动权限. 普通用户可以不设置.

我把超级用户的名字和密码都写在用于生成grub2的脚本文件中,而不是直接修改
/boot/grub/grub.cfg
.

脚本文件在
/etc/grub.d/
下,

update-grub命令执行时会读取此目录下的文件,并将配置合并至grub.cfg中,grub.cfg中的菜单顺序是由此目录中的文件顺序决定的,文件开头数字较小的会先执行,全英文名字的文件将会在最后执行,自定义选项在40_custom中定义,或者建立一个新文件,此目录下的文件必须有执行权限才会被update-grub读取,并把配置合并到grub.cfg

我新建一个文件,
01_users
(也可用别的名字)用于放置用户信息,权限改成和别的脚本一样.



设置用户及密码加密至脚本文件中

将下列文本写入至
01_users
:

#!/bin/sh

cat <<EOF
set superusers="root" # 超级用户的名字,可以改成别的
password_pbkdf2 root grub.pbkdf2.sha512.10000.0D0D4315C73E55A4DE1DEE449E84076E00F1C1430E85862DA91F0D559871DADE672A13301136DAB2442257F688BB6895FA6DE0A55C1F43FFB941E8CF2AA21951.03A0C55676177F6C7387DDE0DFC24B4E8E7C4854BF72CA239A754613F0EF4D7E1ADED0EE89081A6C8DBD30D1F8860FB835B4211E5F8BE99196867FAA529F15EA
# root 密码的哈希值,待会说如何生成
#password root 12345 #明文密码
EOF


生成密码的哈希值:
grub-mkpasswd-pbkdf2


对相应菜单项进行加密

只要在引导界面中的菜单项中添加
–unrestricted
,

就可以让任何人都可以boot,但是不能‘e’,即修改启动参数

参数要在生成脚本中添加,而不是直接修改
grub.cfg
,


不然每次内核更新就会将
grub.cfg
打回无保护的状态.

不过生成脚本贼复杂,如果嫌麻烦可以看文章最后的方法(有风险).

找到引导界面中的菜单项在相应生成脚本的位置

为得到自己系统的引导菜单,可以:

a. 引导时记录下来

b. 查看
/boot/grub/grub.cfg


若是查看
/boot/grub/grub.cfg
,

则找到
menuentry
后面的用单引号括起的字串, 和
submenu
后面的用单引号括起的字串:



例如上图的
'Ubuntu'
.

下图的
'Ubuntu 高级选项'
.



menuentry
表示这是一个启动项,而
submenu
表示这是一个子菜单,里头包含很多启动项.

然后找到它们分别属于那个生成脚本:



例如上图的
'Windows Boot Manager (on /dev/sdb1)'
就包含在
/etc/grub.d/30_os-prober
中,其他的也一样.

接下来就找到菜单项在生成脚本的位置:匹配菜单项的参数

例如,从以下俩图显然能看出来第一张为生成脚本,它生成的菜单项就是第二张图的内容





这个就是我机子中的Windows引导项.

添加菜单项参数

建议预先备份相应文件

关于菜单项加密参数的用法有很多,我只需要可以实现禁止’e’菜单项的:

在生成脚本中添加
--unrestricted
.


位置就是刚才找到的位置,例如

echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id'  {" | sed "s/^/$submenu_indentation/"


在后面添加
--unrestricted
:

echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' --unrestricted {" | sed "s/^/$submenu_indentation/"
#####################################################################################################################这里


子菜单
submenu
也一样.

更新grub.cfg

建议预先备份相应文件

生成新的grub.cfg:

sudo update-grub2


ok.

其他

若是怕麻烦,一般情况下,生成引导菜单项的生成脚本为

/etc/grub.d/10_linux
:定位当前操作系统使用中的root设备内核的位置

/etc/grub.d/30_os-prober
用来搜索其他系统

然后在所有的菜单项中添加参数(一刀切),不过可能会带来问题.

相应文件要备份好,特别是
/boot/grub/grub.cfg
.

参考链接:

GNU GRUB Manual 2.02:https://www.gnu.org/software/grub/manual/grub/grub.html

GRUB2配置文件”grub.cfg”详解(GRUB2实战手册:http://www.jinbuguo.com/linux/grub.cfg.html

Linux GRUB2 配置简介 :https://linux.cn/article-8603-1.html

Grub2加密:http://blog.csdn.net/ztq157677114/article/details/52788765

Ubuntu下Grub配置详解:https://www.linuxidc.com/Linux/2016-10/135741.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: