基于国密 SM4 算法的OpenEuler高安全系统设计与性能分析
基于国密 SM 算法的OpenEuler高安全系统设计与性能分析
一、 实验目的
- 掌握国密存储技术:熟悉 openEuler 内核对国密 SM4 算法的原生支持,掌握使用
cryptsetup构建加密磁盘的完整流程。 - 理解底层映射机制:深入理解 Linux 内核
dm-crypt(Device Mapper) 的工作原理,掌握用户态工具与内核态加密模块的交互。 - 性能建模与分析:通过基准测试,对比国密 SM4 与国际 AES 算法的性能差异,理解硬件加速指令集(如 SM4-NI)的实际价值。
- 工程化容灾实战:学习 LUKS2 元数据头部的备份与恢复,模拟极端情况下的数据抢救,建立严谨的信息安全工程思维。
二、 实验环境
- 宿主机:Windows 10/11 或 macOS
- 虚拟机软件:VMware Workstation
- 目标系统:openEuler 24.03 LTS (需满足内核版本 5.10.0-106)
- 硬件要求:建议开启 CPU 虚拟化透传,以便虚拟机识别宿主机的加密加速指令。
- 必要软件:
cryptsetup( 2.4.1),fio(性能测试工具),openssl。
三、 实验内容与步骤
1. 国密算法与 openEuler 安全特性背景
国产商用密码算法(后文简称商密)属于商用的、不涉及国家秘密的密码技术。密码算法是信息系统的安全技术基础,在国际上已经有广泛使用的RSA、AES、SHA256等密码算法。与之相对的,国内也有一系列自主研发的密码算法,可以覆盖主流的应用场景。其中在操作系统场景,相对应用广泛的算法是SM2/3/4
国密 SM4 算法是我国自主研发的分组加密标准,广泛应用于金融、政务等核心领域。openEuler 操作系统在内核深度集成了 SM4 算法及其在 XTS 模式下的优化实现。与传统的软件模拟相比,openEuler 充分利用了现代处理器的并行指令集,极大地降低了加密对系统 IO 性能的损耗。
本实验通过构建一个基于 LUKS2 标准的加密分区,实现在物理层数据被窃取时,逻辑数据依然处于加密状态的防护效果。
2.磁盘加密
通过将磁盘格式化成指定加密模式的磁盘,然后映射到/dev/mapper下作为dm设备,后续对磁盘的读写都通过该dm设备进行,数据的加解密过程由内核态完成,用户态不感知。参考步骤如下:
格式化磁盘,将磁盘映射为 dm 设备
luks2 模式
# cryptsetup luksFormat /dev/sdd -c sm4-xts-plain64 --key-size 256 --hash sm3
# cryptsetup luksOpen /dev/sdd crypt1
plain 模式
# cryptsetup plainOpen /dev/sdd crypt1 -c sm4-xts-plain64 --key-size 256 --hash sm3
映射成功后可通过 lsblk 查看设备信息
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
...
sdd 8:48 0 50G 0 disk
└─crypt1 253:3 0 50G 0 crypt
...
对加密后的设备进行 IO 读写
直接对裸盘下发 IO:
# dd if=/dev/random of=/dev/mapper/crypt1 bs=4k count=10240
通过文件系统下发 IO:
# mkfs.ext4 /dev/mapper/crypt1
# mount /dev/mapper/crypt1 /mnt/crypt/
# dd if=/dev/random of=/mnt/crypt/tmp bs=4k count=10240
关闭设备映射
如果挂载了文件系统,需要先卸载:
# umount /mnt/crypt
关闭设备:
# cryptsetup close crypt1
⚠️ 注意:
在执行上述命令时,请务必将 /dev/sdd 替换为您实际的硬盘设备名称(例如您之前提到的 /dev/nvme0n1),并确保数据已备份,因为格式化操作会抹除磁盘上的原有数据。
3.内核模块签名
内核模块签名机制是保护Linux内核安全的重要机制,通过在内核模块文件末尾按照一定格式追加签名信息,并在内核模块加载时检查签名是否与内核预置的公钥匹配,从而保障内核模块文件的真实性和完整性。
3.1.生成 SM2 证书配置文件
echo 'subjectKeyIdentifier=hash' > mod.cfg
3.2.生成 SM2 私钥与证书
# 生成私钥
openssl ecparam -genkey -name SM2 -out mod.key
# 生成签名请求
openssl req -new -sm3 -key mod.key -out mod.csr -subj "/CN=My SM2 Module Signer/"
# 生成自签名证书 (有效期10年)
openssl x509 -req -days 3650 -extfile mod.cfg -signkey mod.key -in mod.csr -out mod.crt

3.3.编写一个简单的内核模块hello.c
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void) {
printk(KERN_INFO "SM-Sign Lab: Module loaded!\n");
return 0;
}
void cleanup_module(void) {
printk(KERN_INFO "SM-Sign Lab: Module unloaded!\n");
}
MODULE_LICENSE("GPL");
3.4.编写Makefile文件并编译
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
make
3.5.手动签名与验证
检查未签名状态
modinfo hello.ko | grep sig
# 预期:没有 signature 字段输出
执行签名:
SIGN_SCRIPT=/usr/src/kernels/$(uname -r)/scripts/sign-file
# 如果找不到,可以尝试 /lib/modules/$(uname -r)/build/scripts/sign-file
$SIGN_SCRIPT sm3 mod.key mod.crt hello.ko
再次检查签名信息
modinfo hello.ko
# 预期:可以看到 signer: My SM2 Module Signer 和 sig_hashalgo: sm3 等信息

接下来测试,在默认模式和安全模式下的内核操作
- 默认模式:
insmod hello.ko
rmod hello.ko
可以发现,在默认模式(非安全模式)下,加载/卸载模块都可以正常进行
- 安全模式:
编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 行的末尾添加 module.sig_enforce=1。
vi /etc/default/grub

更新 Grub 并重启
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
安全性测试
# 稍微修改一下已签名的二进制文件(模拟恶意篡改)
echo "malicious data" >> hello.ko
# 尝试加载
insmod hello.ko

系统报错 Required key not available 或 Permission denied,由于签名失效或不可信,模块无法进入内核
4.内核 IMA 完整性评估(Hash 模式)
4.1.开启 IMA 修复模式
首先,我们需要让内核扫描文件并把 SM3 哈希值写到文件的扩展属性(xattr)中。修改 /etc/default/grub,在 GRUB_CMDLINE_LINUX 中添加以下参数:
ima_policy=appraise_tcb ima_hash=sm3 ima_appraise=fix
更新grub并重启
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
重启后,遍历系统文件以自动生成 SM3 摘要标记:
# 扫描整个根目录,忽略报错,确保每个文件都被读取过
find / -fstype ext4 -type f -uid 0 -exec dd if='{}' of=/dev/null count=0 status=none \; 2>/dev/null
检查 /usr/bin/ls 是否获得了 SM3 扩展属性:
getfattr -m - -d -e hex /usr/bin/ls
# 预期输出中 security.ima 应以 0x0411 开头(0x04 代表 hash 模式)

4.2.切换到强制模式
再次修改 /etc/default/grub,将 ima_appraise=fix 改为:
ima_appraise=enforce
更新 Grub 并重启:
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
4.3.攻击性测试
cp /usr/bin/echo ./my_echo
./my_echo "Hello" # 正常运行
# 恶意篡改:在文件末尾注入垃圾数据
echo "attack" >> ./my_echo
# 再次尝试运行
./my_echo "Hello"
预期结果:系统报错 Permission denied。
- 点赞
- 收藏
- 关注作者
评论(0)