基于国密 SM4 算法的OpenEuler高安全系统设计与性能分析

举报
pluto1447 发表于 2025/12/26 17:10:09 2025/12/26
【摘要】 本实验基于 openEuler 深度实践了国密 SM2/3/4 算法的全栈安全应用。通过构建 SM4-XTS 加密磁盘,实现了底层存储的高安全防护与性能平衡;利用 SM2 证书签名与内核强制校验,确保了驱动模块的可信加载;结合 IMA 完整性评估与 SM3 哈希,有效识别并拦截了文件篡改攻击。实验验证了国密算法在现代系统中的卓越性能与可靠性,为构建自主可控、高安全的工程化存储方案提供了核心技术支持

基于国密 SM 算法的OpenEuler高安全系统设计与性能分析

一、 实验目的

  1. 掌握国密存储技术:熟悉 openEuler 内核对国密 SM4 算法的原生支持,掌握使用 cryptsetup 构建加密磁盘的完整流程。
  2. 理解底层映射机制:深入理解 Linux 内核 dm-crypt (Device Mapper) 的工作原理,掌握用户态工具与内核态加密模块的交互。
  3. 性能建模与分析:通过基准测试,对比国密 SM4 与国际 AES 算法的性能差异,理解硬件加速指令集(如 SM4-NI)的实际价值。
  4. 工程化容灾实战:学习 LUKS2 元数据头部的备份与恢复,模拟极端情况下的数据抢救,建立严谨的信息安全工程思维。

二、 实验环境

  • 宿主机:Windows 10/11 或 macOS
  • 虚拟机软件:VMware Workstation
  • 目标系统:openEuler 24.03 LTS (需满足内核版本 \ge 5.10.0-106)
  • 硬件要求:建议开启 CPU 虚拟化透传,以便虚拟机识别宿主机的加密加速指令。
  • 必要软件cryptsetup (\ge 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。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。