国产加密算法 SM4 在 Docker 存储插件中的适配要点

解读

面试官想知道你是否能把“国密”合规要求落地到容器运行时最底层——存储插件。Docker 官方及社区插件(local、overlay2、devicemapper、RexRay、Portworx 等)默认只认 AES-256、ChaCha20 等国际算法,SM4 属于国家密码管理局发布的分组对称算法,要在内核模块、用户态库、插件配置、密钥生命周期四条链路全部打通,才能通过等保 2.0/3.0 与行业密评。回答必须体现“算法替换 + 密钥管理 + 性能调优 + 合规审计”四位一体思路,并给出可落地的代码级或配置级细节。

知识点

  1. SM4 算法特征:128 bit 分组、128 bit 密钥、32 轮非线性迭代,无版权限制、已入 Linux 内核 crypto API(5.10+)
  2. 存储插件加密栈:
    • 块层:dm-crypt/LUKS2
    • 文件系统层:fscrypt、ext4 encryption
    • 用户态:OpenSSL/GmSSL、libsm4、kernel crypto af_alg
  3. 国密合规要求:
    • 密钥必须在硬件密码模块(HSM/SM2 证书)内生成、存储、备份
    • 加密与密钥管理分离,支持 SM4/SM2/SM3 协同
    • 审计日志需包含算法标识、密钥版本、操作主体、时间戳
  4. Docker 插件机制:
    • Volume Driver 接口:Create、Mount、Unmount、Get、List、Remove
    • 插件以 Unix Socket 向 Docker Engine 注册,可携带 --opt 键值对
  5. 性能陷阱:
    • SM4 纯软实现吞吐量约为 AES-NI 的 35%,需优先启用 ARMv8 SM4 指令或海光/飞腾硬件加速
    • 块大小对齐到 4 KB 避免国密库额外 memcpy

答案

  1. 内核适配
    确认发行版内核 ≥5.10 且已编译 CONFIG_CRYPTO_SM4、CONFIG_CRYPTO_SM4_GENERIC;若使用麒麟 V10/统信 UOS,直接通过 rpm -qa | grep kcrypto-sm4 验证。低于 5.10 需自行编译 sm4-generic.ko 并签署内核模块签名,确保在 secureboot 打开时也能 insmod

  2. 加密后端选型
    对块存储插件,统一采用 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”

  3. 密钥生命周期
    插件在 Create 阶段调用 国密 HSM 的 PKCS#11 接口(东进、江南科友、三未信安),通过 C_GenerateKey 产生 SM4 会话密钥,密钥句柄仅保存在 HSM 内部,卷元数据只存放经 SM2 公钥加密的密钥密文。Mount 时由 HSM 解密并注入内核 keyring,Unmount 后立即调用 keyctl revoke 清零

  4. 插件改造代码示例
    在 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 字节随机数,绝不落盘

  5. 性能调优
    启用 arm64 sm4-ce 或 x86_64 sm4-avx2 内核加速后,fio 测试 4 KB 随机写 IOPS 可提升 2.8 倍;在插件初始化阶段通过 cpuid 或 /proc/crypto 判断是否存在 sm4-ce,若无则回退到 GmSSL 软实现并开启批量加密(BF 模式)降低上下文切换

  6. 合规审计
    插件在 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 天备查

  7. 交付 checklist

    • cryptsetup luksDump 显示 Cipher name: sm4
    • /proc/crypto 存在 sm4-ce 或 sm4-generic
    • HSM 内部可查到对应密钥索引,插件侧无密钥明文
    • 等保测评工具(绿盟、启明星辰)扫描无 AES 残留
    • 性能衰减 <15%(对比未加密 baseline)

拓展思考

  1. 若集群已使用 Ceph CSI,可通过 ceph-crypt 插件把 SM4 密钥托管在 Vault+KMIP,但 Vault 原生不支持 SM4,需要 二次开发 Vault KMIP plugin,把加密算法枚举值 0x1e 映射到 SM4_CBC
  2. Confidential Computing(TEE)场景,可让 SM4 密钥只在 enclave 内解密,由 kata-qemu-sev 把容器根卷密钥注入 guest memory 的 encrypted region,实现“国密 + 可信执行环境”双合规。
  3. 未来 Docker Engine 23.0 已计划把镜像层加密从 AES-GCM 抽象成插件接口,可提前向 Moby 社区提交 “sm4-gcm” provider patch把国密能力反向贡献给国际社区,既展示技术深度又体现国产化自信。