Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.9.5. 可信和加密的密钥

可信和加密的密钥是利用内核密钥环服务的内核生成的可变长度对称密钥。密钥从未以未加密的形式显示在用户空间中,这意味着可以验证其完整性,这意味着它们可以被扩展验证模块(EVM)使用,以验证和确认正在运行的系统的完整性。用户级程序只能以加密 Blob 的形式访问密钥。
受信任的密钥需要硬件组件:受信任的平台模块 (TPM)芯片,它用于创建和加密密钥(密封)。TPM 使用 2048 位 RSA 密钥(称为存储根密钥(SRK))密封密钥
此外,也可以使用一组特定的 TPM 平台配置寄存器 (PCR)值密封可信密钥。PCR 包含一组完整性管理值,它们反映了 BIOS、引导装载程序和操作系统。这意味着PCR密封的密钥只能被 TPM 在加密的同一系统中解密。但是,一旦加载了 aPCR-sealed 可信密钥(添加至密钥环),并且验证其关联的PCR 值后,就可以使用新的(或将来)PCR 值进行更新,以便可以引导新的内核。单个密钥也可以保存为多个 blob,每个密钥都有不同的PCR值
加密密钥不需要 TPM,因为它们使用 kernelAES 加密,这使其比可信密钥快。加密的密钥是使用内核生成的随机数字创建的,并在导入到用户空间 Blob 时由主密钥加密。这个 master 密钥可以是可信密钥,也可以是用户密钥,这是它们的主要缺点 - 如果主密钥不是可信密钥,加密密钥就只像用于加密的用户密钥一样安全。

4.9.5.1. 使用密钥

在使用密钥执行任何操作前,请确保系统中载入了受信任和 加密的内核模块。在在不同的 RHEL 内核构架中载入内核模块时请考虑以下几点:
  • 对于具有 x86_64 架构的 RHEL 内核,将 TRUSTED_KEYSENCRYPTED_KEYS 代码构建为核心内核代码的一部分。因此,x86_64 系统用户可以使用这些密钥而无需载入 可信和 加密的密钥模块
  • 对于所有其他构架,需要先加载可信和 加密的内核模块,然后才能使用密钥执行任何操作。要载入内核模块,请执行以下命令:
    ~]# modprobe trusted encrypted-keys
可以使用 keyctl 实用程序创建、加载、导出和更新可信和加密的密钥。有关使用 keyctl 的详情,请参考 keyctl(1)
注意
要使用 TPM (如 创建和密封可信密钥),它需要启用并激活。这通常可以通过机器的 BIOS 中的设置或使用 tpm-tools 软件包中的 tpm_setactive 命令来实现。另外,需要安装 TrouSers 应用程序( trousers 软件包)和 tcsd 守护进程(这是 TrouSers 套件的一部分)以与 TPM 通信。
要使用 TPM 创建可信密钥,请使用以下语法执行 keyctl 命令:
~]$ keyctl add trusted name "new keylength [options]" keyring
使用以上语法,可以按如下方式构建一个示例命令:
~]$ keyctl add trusted kmk "new 32" @u
642500861
上例创建一个名为 kmk 的可信密钥,长度为 32 字节(256 位),并将其放置在用户密钥环(@u)中。密钥长度为 32 到 128 字节(256 到 1024 位)。使用 show 子命令列出内核密钥环的当前结构:
~]$ keyctl show
Session Keyring
       -3 --alswrv    500   500  keyring: _ses
 97833714 --alswrv    500    -1   \_ keyring: _uid.1000
642500861 --alswrv    500   500       \_ trusted: kmk
print 子命令会将加密的密钥输出到标准输出。要将密钥导出到用户空间 blob,请使用 pipe 子命令,如下所示:
~]$ keyctl pipe 642500861 > kmk.blob
要从用户空间 blob 加载可信密钥,请再次使用带有 blob 的 add 命令作为参数:
~]$ keyctl add trusted kmk "load `cat kmk.blob`" @u
268728824
然后,可以使用 TPM密封的可信密钥来创建安全加密密钥。以下命令语法用于生成加密的密钥:
~]$ keyctl add encrypted name "new [format] key-type:master-key-name keylength" keyring
根据上述语法,可以构建使用已创建的可信密钥生成加密密钥的命令,如下所示:
~]$ keyctl add encrypted encr-key "new trusted:kmk 32" @u
159771175
要在无法使用 TPM 的系统中创建加密密钥,请使用随机数字序列来生成用户密钥,然后用于密封实际加密的密钥。
~]$ keyctl add user kmk-user "`dd if=/dev/urandom bs=1 count=32 2>/dev/null`" @u
427069434
然后,使用 random-number 用户密钥生成加密的密钥:
~]$ keyctl add encrypted encr-key "new user:kmk-user 32" @u
1012412758
子命令列表可用于列出指定内核密钥环中的所有密钥
~]$ keyctl list @u
2 keys in keyring:
427069434: --alswrv  1000  1000 user: kmk-user
1012412758: --alswrv  1000  1000 encrypted: encr-key
重要
请记住,未由 master 可信密钥密封的加密密钥仅与用于加密它们的用户主密钥(随机数字密钥)一样安全。因此,主用户密钥应该尽可能安全加载,最好是在引导过程早期加载。