国产加密算法 SM4 在 Docker 存储插件中的适配要点
解读
面试官想知道你是否能把“国密”合规要求落地到容器运行时最底层——存储插件。Docker 官方及社区插件(local、overlay2、devicemapper、RexRay、Portworx 等)默认只认 AES-256、ChaCha20 等国际算法,SM4 属于国家密码管理局发布的分组对称算法,要在内核模块、用户态库、插件配置、密钥生命周期四条链路全部打通,才能通过等保 2.0/3.0 与行业密评。回答必须体现“算法替换 + 密钥管理 + 性能调优 + 合规审计”四位一体思路,并给出可落地的代码级或配置级细节。
知识点
- SM4 算法特征:128 bit 分组、128 bit 密钥、32 轮非线性迭代,无版权限制、已入 Linux 内核 crypto API(5.10+)
- 存储插件加密栈:
- 块层:dm-crypt/LUKS2
- 文件系统层:fscrypt、ext4 encryption
- 用户态:OpenSSL/GmSSL、libsm4、kernel crypto af_alg
- 国密合规要求:
- 密钥必须在硬件密码模块(HSM/SM2 证书)内生成、存储、备份
- 加密与密钥管理分离,支持 SM4/SM2/SM3 协同
- 审计日志需包含算法标识、密钥版本、操作主体、时间戳
- Docker 插件机制:
- Volume Driver 接口:Create、Mount、Unmount、Get、List、Remove
- 插件以 Unix Socket 向 Docker Engine 注册,可携带 --opt 键值对
- 性能陷阱:
- SM4 纯软实现吞吐量约为 AES-NI 的 35%,需优先启用 ARMv8 SM4 指令或海光/飞腾硬件加速
- 块大小对齐到 4 KB 避免国密库额外 memcpy
答案
-
内核适配
确认发行版内核 ≥5.10 且已编译 CONFIG_CRYPTO_SM4、CONFIG_CRYPTO_SM4_GENERIC;若使用麒麟 V10/统信 UOS,直接通过 rpm -qa | grep kcrypto-sm4 验证。低于 5.10 需自行编译 sm4-generic.ko 并签署内核模块签名,确保在 secureboot 打开时也能 insmod。 -
加密后端选型
对块存储插件,统一采用 dm-crypt + LUKS2,把 cipher 串写成 sm4-xts-plain64:512,key-size 128;对文件系统插件,使用 fscrypt v2,在 /etc/fscrypt.conf 中新增 "sm4-cts" 作为 contents 算法。两者均通过 libcryptsetup 的 crypt_load() 指定 CRYPT_LUKS2,在 token 头中写入 sm4_keyslot,保证 cryptsetup luksDump 能看到“Cipher name: sm4”。 -
密钥生命周期
插件在 Create 阶段调用 国密 HSM 的 PKCS#11 接口(东进、江南科友、三未信安),通过 C_GenerateKey 产生 SM4 会话密钥,密钥句柄仅保存在 HSM 内部,卷元数据只存放经 SM2 公钥加密的密钥密文。Mount 时由 HSM 解密并注入内核 keyring,Unmount 后立即调用 keyctl revoke 清零。 -
插件改造代码示例
在 VolumeDriver.Create 里新增opts["cipher"]="sm4-xts-plain64:512" opts["keysize"]="128"然后调用
cryptsetup luksFormat --type luks2 --cipher sm4-xts-plain64 --key-size 512 --pbkdf argon2id --disable-locks <device>注意 --key-file 指向由 HSM 导出的 32 字节随机数,绝不落盘。
-
性能调优
启用 arm64 sm4-ce 或 x86_64 sm4-avx2 内核加速后,fio 测试 4 KB 随机写 IOPS 可提升 2.8 倍;在插件初始化阶段通过 cpuid 或 /proc/crypto 判断是否存在 sm4-ce,若无则回退到 GmSSL 软实现并开启批量加密(BF 模式)降低上下文切换。 -
合规审计
插件在 Mount/Unmount 事件通过 syslog(LOG_AUTHPRIV) 输出 JSON 审计字段:{"algo":"SM4","key_ver":"v1.2","vol_id":"pvc-123","op":"mount","subject":"kubelet","time":"2025-06-05T14:23:10+08:00"}日志由 rsyslog 转发到国密审计系统,保存 180 天备查。
-
交付 checklist
- cryptsetup luksDump 显示 Cipher name: sm4
- /proc/crypto 存在 sm4-ce 或 sm4-generic
- HSM 内部可查到对应密钥索引,插件侧无密钥明文
- 等保测评工具(绿盟、启明星辰)扫描无 AES 残留
- 性能衰减 <15%(对比未加密 baseline)
拓展思考
- 若集群已使用 Ceph CSI,可通过 ceph-crypt 插件把 SM4 密钥托管在 Vault+KMIP,但 Vault 原生不支持 SM4,需要 二次开发 Vault KMIP plugin,把加密算法枚举值 0x1e 映射到 SM4_CBC。
- 在 Confidential Computing(TEE)场景,可让 SM4 密钥只在 enclave 内解密,由 kata-qemu-sev 把容器根卷密钥注入 guest memory 的 encrypted region,实现“国密 + 可信执行环境”双合规。
- 未来 Docker Engine 23.0 已计划把镜像层加密从 AES-GCM 抽象成插件接口,可提前向 Moby 社区提交 “sm4-gcm” provider patch,把国密能力反向贡献给国际社区,既展示技术深度又体现国产化自信。