内核模块签名
概述
内核模块签名机制是保护Linux内核安全的重要机制,通过在内核模块文件末尾按照一定格式追加签名信息,并在内核模块加载时检查签名是否与内核预置的公钥匹配,从而保障内核模块文件的真实性和完整性。
前置条件
- 准备openEuler内核编译环境,可参考:https://gitee.com/openeuler/kernel/wikis/kernel;
- 内核模块签名支持商密算法在openEuler 6.4内核支持,建议选取最新6.4内核源码进行编译;
- 生成用于内核模块签名的SM2私钥和证书。使用openssl生成的参考命令如下:
# 生成证书配置文件(配置文件其他字段可按需定义)
$ echo 'subjectKeyIdentifier=hash' > mod.cfg
# 生成SM2签名私钥
$ openssl ecparam -genkey -name SM2 -out mod.key
# 生成签名请求
$ openssl req -new -sm3 -key mod.key -out mod.csr
# 生成SM2证书
$ openssl x509 -req -days 3650 -extfile mod.cfg -signkey mod.key -in mod.csr -out mod.crt
如何使用
场景1:手动签名
在内核源码目录下调用sign_file对指定内核模块进行签名:
$ ./scripts/sign-file sm3 /path/to/mod.key /path/to/mod.crt <module_file>
场景2:模块加载校验
在内核启动参数中添加module.sig_enforce,开启内核模块强制签名校验:
linux /vmlinuz-6.4.0-10.1.0.20.oe2309.x86_64 root=/dev/mapper/openeuler-root ro resume=/dev/mapper/openeuler-swap rd.lvm.lv=openeuler/root rd.lvm.lv=openeuler/swap crashkernel=512M module.sig_enforce
重启系统后,只有通过指定证书校验的内核模块才能被正常加载:
# insmod /usr/lib/modules/6.4.0/kernel/crypto/sm4.ko
文档捉虫




