内核引入了数据类型“key_type”来表示密钥类型,其中有若干函数指针。下面简要叙述一下主要的集中密钥类型。
1.钥匙环(keyring)
顾名思义,钥匙环就是将密钥串在一起的地方。它和文件系统的目录有些类似,钥匙环可以包含若干密钥,当然这些密钥也可以是另一个钥匙环。但是,和目录相比它有两点不同。一是寻找一个密钥时,需要配合参数type,也就是说,不同类型的密钥在不同的名字空间中。比如一个类型为“trusted”的密钥和一个类型为“user”的密钥可以同名(严格地说,不是名字,是描述——description),不会引起冲突。二是,一个密钥可以链接到多个钥匙环,这和目录类似。不同的是,文件在不同的目录中可以有不同的名字,而密钥在不同的钥匙环中,其名字/描述总是一样的。
keyring使用类型为assoc_array的keys成员,非keyring使用payload。
密钥挂在钥匙环上,钥匙环可以再挂在另一个钥匙环上。似乎完美了。但是用户态进程要找一个钥匙,该从哪一个钥匙环开始呢?还拿文件系统类比,文件系统有一个根目录“/”,根目录是文件查找的起点。钥匙环也类似,只不过比文件系统复杂。钥匙环有若干个特殊的ID,供用户态进程查找,见表16-1。
表16-1 特殊的keyring
每个线程有一个自己的钥匙环,每个进程有一个自己的钥匙环。不太好理解的是会话(session)。会话概念的引入和登录(login)过程有关,用户登录系统,就是启动了一次会话,这次登录的进程,及其后续子孙进程共享同一个会话id。现在通过字符终端(tty)登录Linux还是这样的情况。简言之,一个会话就是一组进程,它们共享一些资源,比如会话钥匙环。用户ID对应的钥匙环和组ID对应的钥匙环,脱离进程而存在。用户会话钥匙环主要用在登录程序,用户登录系统,输入用户名和口令,登录程序启动新进程(一般是一个shell),同时启动一个新会话,这个新进程的会话钥匙环就先设置为此次登录的用户的用户会话钥匙环。剩下两个钥匙环和request_key操作相关,后面再介绍。
2.user
user类型的密钥由用户态进程创建,并且一般是用户态进程使用此种类型密钥。
3.logon
logon类型和user类型很相似,主要的区别在于进程可以写入logon类型密钥的负载,但是不能读出logon类型密钥的负载。logon类型密钥的负载存储的是用户名和口令。内核中的一些子系统,比如cifs,会使用这些信息。
4.asymmetric
这种类型对应非对称密钥,非对称密钥有两个密钥:公钥和私钥。公钥存储在payload成员中,私钥存储在type_data中。
5.encrypted(www.xing528.com)
这种类型的密钥之所以命名为encrypted,原因是用户态进程只能读到加密后的密钥数据,因此用户态进程是无法使用这种密钥的。这种密钥是由内核中的程序使用的,如ecryptfs和IMA。用来加密encrypted密钥数据的密钥有两种,一种是前面提到的user类型的密钥,另一种是后面要提到的trusted类型的密钥。
回顾一下,内核中的密钥,是由用户态进程动态创建的。这里,encrypted类型的密钥的设计初衷就是不允许用户态进程接触到明文存储的密钥数据,那么,用户态进程又该怎么创建这种密钥呢?答案是,创建这种密钥时的payload是一个字符串,其中包含一个指令,内核根据该指令来创建密钥。指令的语法是:
(1)"new[format]key-type:master-key-name keylen"
创建密钥,密钥的长度是“keylen”,使用类型为“key-type”,名字(description)为“master-key-name”的密钥作为此次创建的密钥的加密密钥。
format有两种形式:default和ecryptfs。看来encrypted类型的密钥和ecryptfs有很强的联系。加密密钥的类型可以是trusted或者user。
(2)"load hex_blob"
根据hex_blob的值来创建密钥。hex_blob是一个hex字符串,字符串本身是有格式的,其中包含用于加密的密钥的类型和名字、哈希校验值及加密后的密钥数据。一般用法是创建一个encrypted密钥,将其内容读出导入一个文件,在每次系统启动时根据文件内容创建密钥。例如下面这个在12.2.5节中列举过的例子:
(3)"update key-type:master-key-name"
改变用于加密密钥的密钥。用户修改密钥的负载(payload),负载字符串是上面这个格式时,encrypted类型的密钥的加密密钥就会被更改。
6.trusted
这种类型的密钥和TPM相关。由TPM硬件生成一个密钥,并存储在TPM硬件中。同encrypted类型,创建密钥时的payload是一个指令字符串。语法是:
(1)"new keylen[options]"
(2)"load hex_blob[pcrlock=pcrnum]"
这部分语法和encrypted类型密钥类似。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。