TPM 2.0实例探索2 —— LUKS磁盘加密(3)

接前文:TPM 2.0实例探索2 —— LUKS磁盘加密(2)

本文大部分内容参考:

Code Sample: Protecting secret data and keys using Intel® Platform…

二、LUKS磁盘加密实例

3. 将密码存储于TPM的LUKS

由于自动挂载需要在运行时提供一个口令(密码)或密钥以执行cryptsetup命令而无需用户交互,它必须在某种程度上是明确的。一个方法被需要以在运行时加密口令或密钥直到它被需要以解密卷。此种方法也保护磁盘与其安装到的系统相分离的情况。这个方法是TPM。

改进的解决方案包括以下两步:

  1. 密封口令或密钥文件到TPM中。
  2. 解密存于内存中的秘密并将其传递给cryptsetup。

关于涉及到的TPM相关的命令详情,请参阅:

https://github.com/tpm2-software/tpm2-tools/blob/master/man/

TPM 2.0实例探索2 —— LUKS磁盘加密(3)

Create and persist a sealing object and use it to seal a random byte sequence as the disk key:

创建一个密封对象并将其持久化,然后使用它去密封一个随机字节序列作为磁盘密钥。各步骤如下:

(1)创建主对象

tpm2_createprimary -Q --hierarchy=o --key-context=prim.ctx

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_createprimary -C o -c prim.ctx
name-alg:
  value: sha256
  raw: 0xb
attributes:
  value: fixedtpm|fixedparent|sensitivedataorigin|userwithauth|restricted|decrypt
  raw: 0x30072
type:
  value: rsa
  raw: 0x1
exponent: 65537
bits: 2048
scheme:
  value: null
  raw: 0x10
scheme-halg:
  value: (null)
  raw: 0x0
sym-alg:
  value: aes
  raw: 0x6
sym-mode:
  value: cfb
  raw: 0x43
sym-keybits: 128
rsa: bc1e9cc4713b036b158d10fe255cf04552efc53350a7c33efe1583c6224f22a38ffcbcf75209f23f510b4b3a6bb5956a4f43ac607f0b14d9c995e73b13bb7dde4ada49cf97eaa414aa0c34082a32bc79e25145d87b3e4bf95752c194c016605fffa919a646446b1c72c0fbef3b87f9eee7a255a7246ffa006006c6306556f56719ede8635b8073b0fd232095338a946bcbd7a2dc3c28deaf3bda0f05803807b537167db319ec5dfeb6ec70a7d0decebabbadaaa706512bc0da942824150e3feed25cb7bf83d56c11b6b54060c4a93b2a847c539ede710caf25a74e8f05d7115474f80bf07f63c5bc4558688ee87ae1a310611538fabbf86886a6bdf54f53e9bd

(2)创建加密密钥

dd if=/dev/urandom bs=1 count=32 status=none

实际命令及结果如下:

$ dd if=/dev/urandom of=disk2.key bs=1 count=32
输入了 32+0 块记录
输出了 32+0 块记录
32 字节已复制,0.00315624 s,10.1 kB/s

如果加了“status=none”参数,则结果如下:

$ dd if=/dev/urandom of=disk3.key bs=1 count=32 status=none
$ 

(3)创建对象

tpm2_create --hash-algorithm=sha256 --public=seal.pub --private=seal.priv --sealing-input=- --parent-context=prim.ctx

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_create -g sha256 -u seal.pub -r seal.priv -i disk2.key -C prim.ctx
$ sudo /usr/local/bin/tpm2_create -g sha256 -u seal.pub -r seal.priv -i disk2.key -C prim.ctx
name-alg:
  value: sha256
  raw: 0xb
attributes:
  value: fixedtpm|fixedparent|userwithauth
  raw: 0x52
type:
  value: keyedhash
  raw: 0x8
algorithm: 
  value: null
  raw: 0x10
keyedhash: 9e6abe1d1ec7da09e6f47b4f1d97a2a274ffb2ef98d52ef844b04463239fefbc

注:步骤(2)、(3)可以合为一步:

dd if=/dev/urandom bs=1 count=32 status=none | tpm2_create --hash-algorithm=sha256 --public=seal.pub --private=seal.priv --sealing-input=- --parent-context=prim.ctx

(4)将公钥加载到TPM中

tpm2_load -Q --parent-context=prim.ctx --public=seal.pub --private=seal.priv --name=seal.name --key-context=seal.ctx

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_load -C prim.ctx -u seal.pub -r seal.priv -n seal.name -c seal.ctx

(5)将密钥从易失性空间移存到非易失性空间中

tpm2_evictcontrol --hierarchy=o --object-context=seal.ctx 0x81010002

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_evictcontrol -C o -c seal.ctx 0x81010002
persistent-handle: 0x81010002
action: persisted

Install the new key in place of the old one, and delete the old key created previously:

用新的密钥替换旧的密钥,并且删除之前创建的旧密钥。各步骤如下:

(1)替换旧的密钥

tpm2_unseal -Q --object-context=0x81010002 | sudo cryptsetup --key-file=disk.key luksChangeKey enc.disk

 实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_unseal --object-context=0x81010002 | cryptsetup --key-file=disk.key luksChangeKey enc.disk
$ 

(2)删除旧密钥

$ shred disk.key

销毁数据的方式分为擦除消除销毁级别。我们日常用的rm命令相当于是擦除,执行了删除操作,数据实际上还是存在磁盘上的。shred是一条终端命令,重复覆盖指定的文件,以使即使非常昂贵的硬件探测也难以恢复数据。shred命令删除一个文件之后,文件中的数据会被多次随机覆写,相当于执行的是清除级别的销毁数据操作。shred命令执行后文件系统会在原来的位置覆盖指定的数据。传统的文件系统符合此条件,但许多现代的文件系统都不符合条件。以下是会令shred 无效或不担保一定有效的文件系统的。比如有冗余镜像的Raid系统;不时进行快照记录的文件系统,像Network Applicance 的NFS 服务器等。shred命令只能清除文件,不能清除目录。

(3)擦除旧密钥

$ rm disk.key

(4)将enc.disk虚拟成块设备

$ sudo losetup /dev/loop0 enc.disk

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0    50M  0 loop 
nvme0n1     259:0    0 476.9G  0 disk 
├─nvme0n1p1 259:1    0   511M  0 part /boot
├─nvme0n1p2 259:2    0   4.9G  0 part 
├─nvme0n1p3 259:3    0  19.5G  0 part 
├─nvme0n1p4 259:4    0  19.5G  0 part /
└─nvme0n1p5 259:5    0 432.5G  0 part /var
                                      /usr/local
                                      /opt
                                      /home
                                      /data

(5)使用保存于TPM中的密钥加密enc.disk

tpm2_unseal -Q --object-context=0x81010002 | sudo cryptsetup --key-file=- luksOpen /dev/loop0 enc_volume

实际命令及结果如下:

$ sudo /usr/local/bin/tpm2_unseal -c 0x81010002 | sudo cryptsetup --key-file=- luksOpen /dev/loop0 enc_volume
此口令无可用的密钥。

(6)查看加密磁盘映射分区

未完待续。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年2月23日 上午11:45
下一篇 2023年2月23日 上午11:47