linux内核模块签名验证需四者协同:编译配置(config_module_sig=y等)、运行时策略(module.sig_enforce=1)、密钥管理(mok导入)与模块签名(sign-file),缺一不可;否则无法阻止未签名模块加载。

Linux 内核模块签名验证不是“开个开关”就能用的功能,它依赖内核编译配置、运行时策略、密钥管理与模块签名流程四者协同。启用后,系统将拒绝加载未签名或签名无效的模块(除非显式绕过),从而显著提升内核空间安全性。
确认内核已启用签名支持
签名验证能力由内核编译时决定。若当前内核未开启相关选项,后续所有签名操作均无效。执行以下命令检查:
-
查看内核配置:
zcat /proc/config.gz | grep -E "CONFIG_MODULE_SIG|CONFIG_MODULE_SIG_FORCE"(若提示无此文件,先安装linux-image-extra-$(uname -r)或对应内核头包) - 关键项应为y:
CONFIG_MODULE_SIG=y(必需)、CONFIG_MODULE_SIG_ALL=y(可选,用于自动签名全部内置模块)、CONFIG_MODULE_SIG_FORCE=y(强制拒绝未签名模块) - 若结果为空或显示n或m,说明该内核不支持运行时签名验证,需更换启用签名的内核或自行重新编译
设置运行时强制验证策略
即使内核支持签名,也需通过启动参数激活强制校验行为。否则默认仅标记“tainted”,仍会加载模块。
- 编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX中添加:module.sig_enforce=1 - 同时建议追加
lockdown=confidentiality以限制运行时模块操作权限 - 更新引导配置:
• Ubuntu/Debian:sudo update-grub
• RHEL/CentOS/Fedora:sudo grub2-mkconfig -o /boot/grub2/grub.cfg - 重启生效。之后尝试加载未签名模块(如
sudo insmod /lib/modules/$(uname -r)/kernel/drivers/scsi/scsi_mod.ko)应直接报错Operation not permitted
签名第三方模块(如 vboxdrv、vmmon)
对于 VirtualBox、VMware 等第三方驱动,需手动签名并导入公钥到系统信任链。
-
生成密钥对(建议使用 4096 位 RSA):
openssl req -new -x509 -newkey rsa:4096 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 3650 -subj "/CN=My Custom Modules/" -
签名模块(需对应内核头文件):
/usr/src/linux-headers-$(uname -r)/scripts/sign-file sha512 MOK.priv MOK.der /path/to/vboxdrv.ko -
注册公钥到 MOK(Machine Owner Key):
sudo mokutil --import MOK.der→ 设置密码 → 重启后在蓝屏 MOK 管理界面完成确认 - 验证:
modinfo /path/to/vboxdrv.ko | grep -E "(signer|signature)"应显示签名信息;加载后不再报Key was rejected by service
临时禁用验证(仅限调试)
开发或紧急排障时可临时关闭验证,但切勿在生产环境长期使用。
- 编辑
/etc/default/grub,将启动参数改为:module.sig_enforce=0 - 运行
sudo update-grub或sudo grub2-mkconfig并重启 - 注意:此设置会削弱 Secure Boot 效果,且部分发行版(如新版 Ubuntu)可能因 shim 策略限制而无法完全绕过











