资讯详情

Anolis商密OS最佳实践之IMA商密化 | 龙蜥SIG

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

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

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

c962fc027c2a94806dacb2c273ceff17.png

随着近年来国际贸易冲突和技术封,互联网的快速发展, IOT 随着该领域的兴起,金融领域的变化日益加剧。特别有必要和迫切需要摆脱对外国技术和产品的过度依赖,建设行业网络安全环境,提高中国行业信息系统的安全可信度。

密码算法是保证信息安全的核心技术,特别是在互联网的核心领域,长期以来一直被使用 AES、SHA-2、RSA 国际通用密码算法系统及相关标准。

Linux 内核和 OpenSSL 作为互联网的基本软件基础,近年来对商密算法提供了有限的支持,核心只实现基础 SM3 摘要算法和 SM4 鉴于上述原因,我们最近正在进行对称加密 ,内核中商密算法的这一短板得到了补充,率先在内核中 Alibaba Cloud Linux 和 Anolis OS 发行版输出。与此同时,蚂蚁相关团队也积极投资,将商密标准推向 OpenSSL 社区为国密标准的国际化做出了巨大贡献。

OS 核心安全一直是安全界的重点研究课题。今天,我们使用商业秘密算法来支持它 Linux 内核 IMA 安全子系统,为客户输出可靠的安全可靠技术。

IMA 是 Integrity Measurement Architecture 的缩写,。目前 Linux 支持内核完整性子系统 EVM 和 IMA,前者用于保护文件的扩展属性。本文讨论了后者。

  • 能够评估正在打开的文件的完整性。

  • 能够正在执行 exec 评估文件(可执行程序)的完整性。

  • 能够正在执行 mmap(PROT_EXEC) 评估文件(共享库)的完整性。

  • 正在加载的 kernel 模块和固件进行完整性评估。

所谓完整性评估,是指在执行特定的内核操作时,主动检查文件内容的完整性。IMA 子系统借用内核 security 子系统在 open(), execve(), mmap()等系统调用中下系统 hook 执行自己的代码。

IMA 完整性验证时,文件扩展属性将提前存储在文件系统中 security.ima 进行。具体来说,借款。IMA签名工具 evmctl,当系统部署时,管理员将文件的完整性信息作为特权用户写入文件扩展属性 security.ima 中。

当系统运行时,IMA 子系统将从扩展属性中读取文件的完整性信息,并与实际计算的完整性信息进行比较。

因此,即使攻击者通过密码破解获得了当地特权,或者利用安全漏洞获得了当地特权,在准备操作恶意程序或植入后门程序时,因为没有 IMA 在私钥的情况下,不可能构建合法的 IMA 因此,恶意程序或被篡改的程序无法运行。即使带有 IMA 受保护的存储设备受到离线攻击(例如,将存储设备从主机上取下,拿到另一台机器进行修改,然后重新安装到主机上)。被篡改的文件或攻击者植入的恶意软件在运行过程中仍不能运行,这可以在一定程度上抑制类似性 Dirty Cow 这种核心漏洞的危害。

所谓 IMA 商密化,就是在 IMA 在整个签名验证过程中,使用商密算法 SM3 取代国际常用的哈希算法 SHA256、SHA512 等,用 SM2 更换算法签名验签 RSA 算法。

  • SM2:基于椭圆曲线密码(ECC)提供数字签名、密钥交换和公钥加密的公钥密码算法标准 RSA/ECDSA/ECDH 等国际算法

  • SM3:消息摘要算法,哈希结果是 256 bits,用于替换 MD5/SHA1/SHA256等国际算法

Anolis OS 是龙蜥社区(OpenAnolis)全开源、中立、开放的发行版支持多计算架构,云场景优化100% 兼容 CentOS 8 软件生态。Anolis OS 8 旨在为开发者和运维人员提供稳定、高性能、安全、可靠、开源的操作系统服务。

BabaSSL 基于蚂蚁集团和阿里集团内部,诞生于蚂蚁的项目 OpenSSL版本合并,项目主体已经在github开源(https://github.com/BabaSSL/BabaSSL ),当前的开源版本是 8.2.也是目前最新的稳定版。

BabaSSL 目前,它已广泛应用于阿里巴巴集团和蚂蚁集团。从具体场景来看,有以下三个方面:存储、网络和端部设备。网络服务的场景是BabaSSL 最大的支撑场景,如淘宝、天猫、阿里云等涉及链路加密的服务器端。

BabaSSL 它是一个密码算法库,算法库,兼容 OpenSSL 1.1.1 版本的基础上,全面支持了商密算法以及商密相关协议,作为国密场景下的密码算法主要解决方案,也是密码算法国产化的工程实现。

  • 基于 OpenSSL 1.1.1,具备 OpenSSL 1.1.1 保持兼容的所有能力和能力

  • 支持国密 SM2、 SM3 和 SM4,并对 OpenSSL 1.1.1 中所欠缺的 SM2 能力,比如 X509 证书的签发和验证功能已完成

  • GM/T 0024 和 TLCP 国密双证书 TLS 协议

  • 支持 RFC 8998:TLS 1.3 国密单证书

  • 提供了对 IETF 在标准化过程中 Delegated Credentials

  • 支持 IETF QUIC API 底层密码学能力

  • 更加完善的 SM2 例如,算法支持 X.509 支持证书签发和验证

  • 申请软件密码模块一级资格

主要环境包括操作系统和上密码相关工具包,这里选择操作系统 Anolis 商密版 OS 8.2 镜像(同时支持 x86 和 arm64)目前最新版本完全支持全套商密算法 SM2/3/4 以及使用 SM2-with-SM3 算法的 X509 证书,,默认开启 IMA 特性。

上层密码学工具选择内置在镜像中的 BabaSSL,版本是 8.2.一是完全实现商密标准的密码算法库。,默认内置 Anolis 商密镜像中。

ShangMi 源会内置在下一个版本的全栈国密镜像中,目前也可以编辑/etc/yum.repos.d/AnolisOS-ShangMi.repo来使用 Anolis OS 的 ShangMi 源。

# AnolisOS-ShangMi.repo #   [ShangMi] name=AnolisOS-$releasever - ShangMi baseurl=http://mirrors.openanolis.cn/anolis/$releasever/ShangMi/$basearch/os enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KY-ANOLIS
gpgcheck=1

安装实践 IMA 必要的工具包:其中 BabaSSL 默认已经安装到标准目录取代OpenSSL, ima-evm-utils 默认已经安装。

yum install -y  keyutils

为了使用 IMA 功能,先要准备以下密钥和证书:

CA 根证书,自签名的证书,作为信任根内置到内核里

IMA 私钥,与 IMA 证书对应的 SM2 私钥,用于签名文件

IMA 证书,由 CA 根证书签名,系统启动后动态导入内核

# 创建签名证书请求使用的配置文件openssl.cnf
cat > openssl.cnf << EOF
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = v3_req


[ req_distinguished_name ]
O = Test
OU = Test
CN = Test key
emailAddress = test@foo.com


[ v3_req ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always
EOF


# 生成SM2私钥private.pem
openssl ecparam -genkey -name SM2 -out private.pem


# 从私钥生成证书请求
openssl req -new \
    -key private.pem \
    -out csr.pem \
    -sm3 -sigopt "sm2_id:1234567812345678" \
    -subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Alibaba/OU=OS/CN=test/emailAddress=test@foo.com"


# 生成一个自签名的根证书ca.crt,作为CA证书
openssl ecparam -genkey -name SM2 -text -out ca.key
openssl req -new \
    -x509 -days 3650 \
    -key ca.key \
    -out ca.crt \
    -sm3 -sigopt "sm2_id:1234567812345678" \
    -subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Alibaba/OU=OS/CN=CA/emailAddress=ca@foo.com"


# 使用CA证书给SM2证书请求签名,生成IMA要使用的商密证书cert.pem
openssl x509 \
    -req -days 3650 \
    -in csr.pem \
    -out cert.pem \
    -sm3 \
    -sigopt "sm2_id:1234567812345678" \
    -sm2-id "1234567812345678" \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -extfile openssl.cnf -extensions v3_req

生成了 CA 证书之后,为了测试和验证 IMA 特性,我们就需要把 CA 根证书内置到内核,这需要使用新的 CA 根证书重新编译内核。

首先下载 Anolis OS 的 ANCK 内核代码,其开发分支为devel-4.19

git clone git@codeup.openanolis.cn:codeup/kernel/cloud-kernel.git -b devel-4.19

# 安装编译依赖
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.pem
sed -i 's/CONFIG_SYSTEM_TRUSTED_KEYS=\"\"/CONFIG_SYSTEM_TRUSTED_KEYS=\"certs\/sm2_cert.pem\"/' .config


make


# 安装modules
make modules_install


# 安装内核,这一步也会自动生成initramfs并更新grub.cfg
make install


# 查看vmlinuz
ls -l /boot/vmlinuz*


# 将新内核(比如vmlinuz-4.19.91+ )设置为缺省的启动内核
grubby --set-default /boot/vmlinuz-4.19.91+


reboot

重启机器后,通过/proc/keys或者keyctl可以看到我们的 SM2 根证书已经内置到了内核中:

# cat /proc/keys | grep sm2
02a32516 I------     1 perm 1f030000     0     0 asymmetri Alibaba: CA: bc08a9e6e43c30fd421ebc6fec7bb9063a089aca: X509.sm2 3a089aca []


# keyctl show %:.secondary_trusted_keys
Keyring
371108982 ---lswrv      0     0  keyring: .secondary_trusted_keys
945861859 ---lswrv      0     0   \_ keyring: .builtin_trusted_keys
575535217 ---lswrv      0     0       \_ asymmetric: Build time autogenerated kernel key: 60d20efc1951f58c8bba2b04d937e4fa2a6cd62a
44246294 ---lswrv      0     0       \_ asymmetric: Alibaba: CA: bc08a9e6e43c30fd421ebc6fec7bb9063a089aca

为了使用 IMA 功能,我们需要把前面用 CA 证书签名的 IMA 证书 cert.pem 导入到内核,之后才能用该证书正确验签 IMA 私钥签名的文件,因为内核已经集成了 CA 根证书,也只有 CA 签名的证书才能成功导入内核。

因为内核只支持导入 DER 格式的证书,因此我们需要先将 pem 的证书转换为 der 格式的,具体命令如下

# 内核只支持导入DER格式的证书
openssl x509 -in cert.pem -out cert.der -outform der

用 keyctl 导入证书,注意

# 非持久性导入, 重启后失效
keyctl padd asymmetric "IMA" %:.ima < cert.der

IMA 证书导入成功后,我们可以从 /proc/keys 看到证书信息

# IMA证书导入成功后,我们可以从/proc/keys看到证书信息:
cat /proc/keys | grep sm2
03cd0857 I------     1 perm 1f030000     0     0 asymmetri Alibaba: CA: 10024aa19b7b8d73f4b3b413f70bcf94806f9ca2: X509.sm2 806f9ca2 []
069ced19 I--Q---     1 perm 39010000     0     0 asymmetri IMA: X509.sm2 604c5d8c []

接下来给系统中需要 IMA 验证的文件加上 SM3 的签名,这里简单粗暴的给常用目录下文件全部签名,如果文件比较多的话,这个过程会持续几分钟。

# 使用SM3哈希算法,private.pem是签名用的私钥,给系统主要目录下所有文件做IMA签名
evmctl ima_sign -a sm3 -s -k /path/to/private.pem -r -t f /bin
evmctl ima_sign -a sm3 -s -k /path/to/private.pem -r -t f /sbin
evmctl ima_sign -a sm3 -s -k /path/to/private.pem -r -t f /usr
evmctl ima_sign -a sm3 -s -k /path/to/private.pem -r -t f /lib
evmctl ima_sign -a sm3 -s -k /path/to/private.pem -r -t f /lib64
evmctl ima_sign -a sm3 -s -k /path/to/private.pem -r -t f /etc
evmctl ima_sign -a sm3 -s -k /path/to/private.pem -r -t f /home


# 通过getfattr可以查看添加到文件扩展属性中的签名数据(不是必需)
yum install -y attr
getfattr -n security.ima /path/to/file

IMA 策略是使能 IMA 的必备步骤,策略的内容可以根据实际需要进行定制。为了方便说明问题,这里以用户 imatest 来测试,在下面的规则示例中,当以 imatest 身份运行可执行程序和共享库时,会进行 IMA 度量以及 apprase 检查。

# 创建用户
imatestuseradd imatest


# 用户ID可以从/etc/passwd中看到,这里是1001,用户ID会在IMA规则中用到
tail /etc/passwd | grep imatest
# imatest:x:1001:1001::/home/imatest:/bin/bash

将下面的文件内容另存为ima.policy文件:

appraise appraise_type=imasig uid=1001 func=BPRM_CHECK
measure uid=1001 func=BPRM_CHECK
appraise appraise_type=imasig uid=1001 func=MMAP_CHECK
measure uid=1001 func=MMAP_CHECK

上面的规则表示:

  • 度量以uid=1001身份运行的程序和共享库,并将度量值记录在 /sys/kernel/security/ima/ascii_runtime_measurements 文件中。

  • 评估以 uid=1001 身份运行的程序和共享库,如果程序的完整性被破坏,程序将被拒绝运行。

然后写入 IMA 规则到内核:

cat ima.policy > /sys/kernel/security/ima/policy

IMA 策略写入内核后,IMA 特性就已经在内核生效了,此时可以以 imatest 用户身份执行一些操作

su imatest


... ...

通过ascii_runtime_measurements我们可以看到 IMA 运行时度量的信息,这些都是通过 IMA 验证的文件,以下是部分度量日志:

# cat /sys/kernel/security/ima/ascii_runtime_measurements
10 bcb0e518b79de0d7f2cd20b8a29a7092e65db7ef ima-sig sha1:0000000000000000000000000000000000000000 boot_aggregate
10 d20bcf8ea6f3f8c03dd475766dfe18ccc14d264b ima-sig sm3:66acf6555ad2f6e5b89e1a80644eae4fd0015e5b811be63d1a58415e2f4f2b0e /usr/bin/bash 030211604c5d8c00473045022100ce91713b9aa37a2f8ce16f95acc00a7f072d7d3cc90ad8fae916ffc6072b10f4024
10 b829e4761f7a717dde6daab8089c8bac15fbb139 ima-sig sm3:1bcd4a4cb2a2c4418aa7075f5c012de03a383f3af172579132e5ad21bd5752c5 /usr/lib64/ld-2.17.so 030211604c5d8c0046304402203db3c575be22d35abe49d6e9f7fde0be22be02fdd9211feebf7ae172b8c66
10 be220df2bc614980a06eff27f7286305c7afbdc2 ima-sig sm3:66acf6555ad2f6e5b89e1a80644eae4fd0015e5b811be63d1a58415e2f4f2b0e /usr/bin/bash 030211604c5d8c00473045022100e66e7f2d356668c1779cfbe05838979c789d9f81c8b5cd0e19022b8255ea13f1024
10 d262c29452b0d575a81786c49453fe6f14c0969d ima-sig sm3:1bcd4a4cb2a2c4418aa7075f5c012de03a383f3af172579132e5ad21bd5752c5 /usr/lib64/ld-2.17.so 030211604c5d8c004730450220432ee49d0fe84c36633365afdd1fc138316e5ea2cb854c5dc5b0c9d03619f
10 26bf0fc75828783a0013b9f52045c9a56e8b4853 ima-sig sm3:18781f4c910453fdbcb36a359092128df86a660e230db4bb52765e32e209cf94 /usr/lib64/libtinfo.so.5.9 030211604c5d8c00473045022100fb46c2b15aef6f1005fea3f96d23d95a2d036d5da761d593b76891
10 28ee84f368f892180efaefb3d9b68c90ded73268 ima-sig sm3:1c568b3aa88a2bafe543d4aa1db95c12e7e062f54de5c55c50729fa3ac786ab2 /usr/lib64/libdl-2.17.so 030211604c5d8c00483046022100930e63c0325013bfdbdbe098bc13ac514703af2ff7998fe447675910
10 88120ffffa110b3621947f937117739f46cc8a46 ima-sig sm3:a53099f1946d13df1cf2561be1989cafbf4f1e4908294b315f80b8b07936c6d8 /usr/lib64/libc-2.17.so 030211604c5d8c00473045022010f571c748201ddc229f5b9cbbc4d471fb892b98653f8f73dc614eacfa2
10 1c83184c6b11f31ca8f1090aafc4ee5be8e336b0 ima-sig sm3:a591bc1f9eb1d1b89f0a1a83f6236302132a973515edebec1664499e32e42f12 /usr/lib64/libnss_files-2.17.so 030211604c5d8c00483046022100b51c03e638f2d71f6a4368592d8e055c231441962b1fb0989
... ...

注意期中第一条日志,boot_aggregate 是系统启动阶段 TPM PCR 的汇聚值,这个值是汇聚 TPM 设备对应 PCR bank 的值做一个 digest,所使用的摘要算法是根据 TPM 设备版本以及支持的 PCR bank 决定,默认是 SHA1,当然这个摘要也可以通过配置成默认优先 SM3,例子中没有 TPM 设备,所以这里值是 0。

接下来,我们再构造一个没有经过签名的可执行文件并执行:

su imatest
cd ~


echo 'int main(){}' > dummy.c
gcc -o dummy dummy.c

运行 dummy 可执行文件,提示没有权限,这是符合预期的,同样,如果文件的签名是错误的,没有通过签名验证,也是会被拒绝执行的。

# ./dummy
bash: ./dummy: Permission denied
# dmesg
audit: type=1800 audit(1631788187.296:8): pid=1426 uid=1001 auid=0 ses=4 op=appraise_data cause=IMA-signature-required comm="bash" name="/home/imatest/dummy" dev="vda2" ino=668226 res=0

我们看到,通过对这些软件栈的改造,可以平滑迁移到商密算法,并且完全基于商密算法构建出 IMA 的安全机制,而这些机制在以前都是完全且只能构建在国际标准的算法之上的。

当下的商密标准或多或少已经在基础软件库中有了支持,虽然一些基础的安全能力也可以在商密算法的基础上建立起来,但是还有部分空白领域仍然需要持续的开拓,以应对我国信息安全行业的安全可信。

期待下篇,我们在内核模块签名之上所做的商密化改造。

—— 完 ——

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

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

1.龙蜥社区助力中国联通完成核心业务CentOS试点替换

2.龙蜥社区成立智能调优KeenTune SIG,让Linux全栈调优简单起来

3.业界首个机密计算容器运行时—Inclavare Containers正式进入CNCF!

4.ASE 2021最新论文解读:Serverless Java 运行时探索|龙蜥技术

5.干货满满!龙蜥社区Meetup走进龙芯圆满结束,5大技术分享精彩回顾

标签: 24bc08集成电路ic

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台