根据用户@zwets的建议,我在这里复制(并进行了编辑)一个答案:
自从内核版本4.4.0-20开始,强制要求在启用安全启动的情况下,不允许运行未签名的内核模块。如果您想保持安全启动并运行这些模块,那么下一步就是对这些模块进行签名。
所以让我们试一试吧。
创建签名密钥
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=描述性名称/"
对模块进行签名
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /path/to/module
注意1:对于单个驱动程序/模块,可能需要签署多个文件,因此/path/to/module
可能需要替换为$(modinfo -n <modulename>)
,例如$(modinfo -n vboxdrv)
注意2:如果sign-file
不可用,sudo kmodsign sha512 ./MOK.priv ./MOK.der /path/to/module
是一种替代方法。
注册安全启动的密钥
sudo mokutil --import MOK.der
提供一个密码以便在重启后使用
重新启动
并按照指示注册MOK(机器所有者密钥)。这里有一个带有图片的示例。系统将再次重启。
如果密钥已经正确注册,它将显示在 sudo mokutil --list-enrolled
下面。
请告诉我您的模块是否可以在 Ubuntu 16.04 上以这种方式运行(我相信是在内核 4.4.0-21 上)。
资源:详细网站Fedora 文章和Ubuntu 实现模块签名。(他们一直在进行改进);-)
附加资源:我创建了一个用于每次 virtualbox-dkms
升级并覆盖已签名模块的自己使用的 bash 脚本。查看我的GitHub 上的vboxsign
。
对于安全(特别)关注的额外说明:;-)
由于您创建的私钥(在此示例中为
MOK.priv
)可以被任何能够访问它的人使用,因此将其保密是一个好的做法。您可以使用
chmod
命令对其进行权限设置,使用
gpg
进行加密,或将其存储在其他更安全的地方。或者,如
此评论所述,在第一步中删除选项
-nodes
。这将使用密码短语对密钥进行加密。