首页 理论教育 Linux内核安全模块:用户态工具

Linux内核安全模块:用户态工具

时间:2023-11-22 理论教育 版权反馈
【摘要】:后者要由用户态工具写入。前者可以由内核在进程访问文件时填入当时计算的结果,条件是内核启动时有参数“evm=fix”后者要由用户态工具写入。这个用户态工具是evmctl,当然用户也可以编写别的工具做同样的事情。签名都是本次系统启动之前的某个时刻生成的。

Linux内核安全模块:用户态工具

1.签名的生成

读到这里,不知读者有没有疑问:扩展属性security.evm和security.ima中的值是什么时候填入的?密钥是怎么产生的?又是什么时候载入内核的?

先说IMA,扩展属性security.ima的值有两种形式,一种是非加密哈希,另一种是数字签名。前者可以由内核在进程访问文件时填入当时的哈希值,条件是内核启动时有参数“ima_appraise=fix”。后者要由用户态工具写入。

再说evm,扩展属性security.evm的值有两种形式,一种是HMAC,另一种是数字签名。前者可以由内核在进程访问文件时填入当时计算的结果,条件是内核启动时有参数“evm=fix”后者要由用户态工具写入。这个用户态工具是evmctl,当然用户也可以编写别的工具做同样的事情。下面举几个例子。

计算哈希存入ima并且产生evm签名:

产生ima签名和evm签名:

产生ima签名:

也就是说,在数字签名的情况下,内核只掌握公钥,只能验证签名,不能生成签名。签名都是本次系统启动之前的某个时刻生成的。

2.密钥的生成

(1)evm-key

密钥的生成也需要用户态工具,首先是evm-key。在TPM硬件存在的情况下,“encrypted”密钥可以依托“trusted”密钥产生:(www.xing528.com)

第一条命令是让内核借助TPM产生一个类型为“trusted”,描述为“kmk”,长度为32B的密钥。第二条命令是让内核借助刚才产生的“kmk”密钥,产生一个类型为“encrypted”,描述为“evm-key”,长度为32B的密钥。

有TPM硬件时,内核才能产生类型为“trusted”的密钥。在没有TPM硬件时,“encrypted”密钥只能依托“user”密钥产生:

第一条命令让内核产生一个类型为“user”,描述为“kmk”,长度为32B,内容为自/dev/urandom读出的随机数的密钥。第二条命令是让内核借助刚才产生的“kmk”密钥,产生一个类型为“encrypted”,描述为“evm-key”,长度为32B的密钥。

(2)_ima和_evm

用户可以用openssl生成公私钥对,然后将公钥加载到内核中:

3.密钥加载

evm-key、用于数字签名的ima公钥和用于数字签名的evm公钥都要保存在内核中。它们需要在系统启动的早期被加载入内核。通常这样的工作在initramfs中完成。相应的命令可以是加载evm-key。假设有TPM硬件,使用trusted密钥作为encrypted密钥的后台支持,假设密钥相关的数据被存入/etc/keys/目录下的文件:

若没有TPM硬件,只能使用user密钥作为encrypted密钥的后台支持:

加载完evm-key后,要通知一下内核,内核evm子系统就可以用evm-key进行相关计算了。

两个公钥的加载类似,下面只列出一个:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈