查看原文
其他

Anolis商密OS最佳实践之内核模块签名商密化 | 龙蜥技术

李艺林 OpenAnolis龙蜥 2022-05-30

商密软件栈SIG :基于 Anolis OS,在整个系统软件层面(包括硬件,固件,bootloader,内核以及 OS)实现以国密算法为主的全栈国密操作系统,结束一直以来国密算法生态碎片化的状况,在技术方面打造社区和生态,在资质合规方面致力于为行业提供基于国密的信息安全标准。

作者:李艺林(伯纪),商密软件栈SIG核心成员。

欢迎更多开发者加入商密软件栈SIG:

网址:https://openanolis.cn/sig/crypto

邮件列表:tc@lists.openanolis.cn

接回上文,我们体验了 IMA 的商密化后,今天我们继续实践内核模块签名商密化。
开始之前,我们仍然需要准备与 IMA 类似的环境,配置 ShangMi 源,下载内核源码,生成商密密钥和证书。不过这次生成的密钥是用于签名内核模块,在内核模块签名我们选择使用根证书 ca.crt 直接签名,因此可以不需要生成 cert.pem 证书。

内核模块签名简介

Linux 支持只加载认证了的内核模块,开启这个功能时,可以阻止来源不明和没有认证的内核模块加载到内核,用以保护系统的安全性,这个认证也是通过数字签名来保证的,不同于 IMA 的签名,Linux 内核模块的签名是以特定的数据格式追加在文件结尾的,使用的算法通常是国际算法。
涉及到签名的场景就可以使用商密算法来替换掉国际算法,要使内核模块签名支持使用商密算法,也需对签名工具和内核本身做修改,签名工具和内核同时需要支持解析使用商密算法的 PKCS#7 数字签名,同样的,应用层商密基础能力由 BabaSSL 提供,sign-file 调用 BabaSSL 完成使用商密算法的签名。

编译内核

生成了 CA 证书之后,我们同样需要把 CA 根证书内置到内核,这就需要重新编译内核。

下载Anolis OS的ANCK内核源码

首先下载 Anolis OS 的 ANCK 内核代码,其开发分支为devel-4.19
git clone git@codeup.openanolis.cn:codeup/kernel/cloud-kernel.git -b devel-4.19

编译内核

按如下方法编译并安装集成了商密 CA 证书的内核:
# 安装编译依赖yum install -y bison flex elfutils-libelf-devel bc make gcc
# 用上一步生成好的ca.crt作为sm2_cert.pem,使用默认配置编译内核cp -f ca.crt <kernel_src>/certs/sm2_cert.pem
# 进入内核源码目录,使用默认配置编译内核cd <kernel_src># 如果您是arm的镜像,请将arch/arm64/configs/anolis_defconfig作为.config;# 如果是x86的,请将arch/x86/configs/anolis_defconfig作为.config。以x86为例cp -f arch/x86/configs/anolis_defconfig .config
# 配置系统的可信跟证书为/certs/sm2_cert.pemsed -i 's/CONFIG_SYSTEM_TRUSTED_KEYS=\"\"/CONFIG_SYSTEM_TRUSTED_KEYS=\"certs\/sm2_cert.pem\"/' .config
make
# 安装modulesmake modules_install
# 安装内核,这一步也会自动生成initramfs并更新grub.cfgmake install
# 查看vmlinuzls -l /boot/vmlinuz*
# 将新内核(比如vmlinuz-4.19.91+ )设置为缺省的启动内核grubby --set-default /boot/vmlinuz-4.19.91+
reboot

内核模块签名商密实践

签名

接下来我们使用内核提供的sign-file工具,给一个内核模块ko文件加上商密签名,命令如下:
${kernel_src}/scripts/sign-file sm3 ca.key ca.crt ${kmod}.ko ${kmod}.ko.signed

验证签名

通过tail ${kmod}.ko.signed 看到~Module signature appended~字样说明模块已经有了签名。
然后你可以insmod你签名后的内核模块,来判断签名是否正确。通过cat /proc/modules来查看加载的内核模块是否签名。
  • O: Out-of-tree module has been loaded
  • E: Unsigned module has been loaded
如果你的模块签名正确,则通过cat /proc/modules可以看到对应的模块没有E标记,以 Out-of-tree 的 hello 为例,正确签名后是这样的:
# cat /proc/moduleshello 262144 0 - Live 0xffff000003520000 (O)
如果你的模块签名失败(包括未签名),则在cat /proc/modules可以看到E标记,比如:
# cat /proc/modulesnft_fib_inet 262144 1 - Live 0xffff0000034a0000 (E)
这时候可以通过dmesg查看对应的失败原因,比如PKCS#7signature not signed with a trusted key等。
Anolis 商密软件栈将持续致力于国内商密基础设施建设,做大商用密码的软硬件生态,打造如丝般顺滑的商密应用体验,为国内数据和网络安全保驾护航。
—— 完 ——
关于龙蜥SIG

SIG是开放的,并争取让交付成果成为社区发行的一部分,由组内核心成员主导治理,可通过邮件列表和组内的成员进行交流。龙蜥社区SIG目前已超20个,包括硬件兼容性测试 SIG、商密软件栈、高性能存储技术 SIG、Java语言与虚拟机SIG、Cloud Kernel、OceanBase SIG等。

SIG网址:https://openanolis.cn/sig

加入龙蜥社群

加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】拉你入群;加入钉钉群:扫描下方钉钉群二维码。欢迎开发者/用户加入龙蜥社区(OpenAnolis)交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!

往期精彩推荐
1.时速云加入龙蜥社区,共建开源操作系统生态
2.漫画 | CentOS退出江湖,互联网人用什么操作系统?
3.龙蜥社区一周动态
4.云栖回顾|龙蜥社区有哪些值得回味的精彩瞬间?
5.龙蜥操作系统:又一个 Linux 操作系统?

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存