eCryptfs 文件系统的加密密钥

ECryptfs 是一个堆叠文件系统,它使用随机生成的文件加密密钥 (FEK) 透明地加密和解密每个文件。

每个 FEK 又使用文件加密密钥加密密钥 (FEKEK) 进行加密,FEKEK 可以位于内核空间,也可以位于用户空间,并由名为“ecryptfsd”的守护程序执行。在前一种情况下,操作由内核 CryptoAPI 使用从用户提示的密码派生的密钥(FEKEK)直接执行;在后一种情况下,FEK 由“ecryptfsd”借助外部库加密,以便支持其他机制,如公钥密码学、PKCS#11 和基于 TPM 的操作。

eCryptfs 定义的数据结构用于包含 FEK 解密所需的信息,称为身份验证令牌,目前可以存储在“user”类型的内核密钥中,由用户空间实用程序“mount.ecryptfs”插入到用户的会话特定密钥环中,该实用程序随“ecryptfs-utils”软件包一起提供。

为了与 eCryptfs 文件系统结合使用,引入了新的格式“ecryptfs”来扩展“encrypted”密钥类型。新引入格式的加密密钥在其有效负载中存储一个身份验证令牌,其中包含由内核随机生成的 FEKEK,并由父主密钥保护。

为了避免已知的明文攻击,通过命令“keyctl print”或“keyctl pipe”获得的数据 blob 不包含整体身份验证令牌(其内容是众所周知的),而只包含加密形式的 FEKEK。

eCryptfs 文件系统可以真正受益于使用加密密钥,因为所需的密钥可以由管理员安全地生成,并在引导时在解封“可信”密钥后提供,以便在受控环境中执行挂载。另一个优点是密钥不会暴露于恶意软件的威胁,因为它仅在内核级别以明文形式提供。

用法

keyctl add encrypted name "new ecryptfs key-type:master-key-name keylen" ring
keyctl add encrypted name "load hex_blob" ring
keyctl update keyid "update key-type:master-key-name"

哪里

name:= '<16 hexadecimal characters>'
key-type:= 'trusted' | 'user'
keylen:= 64

使用 eCryptfs 文件系统的加密密钥示例

使用格式“ecryptfs”创建一个长度为 64 字节的加密密钥 “1000100010001000”,并使用先前加载的用户密钥“test”保存它

$ keyctl add encrypted 1000100010001000 "new ecryptfs user:test 64" @u
19184530

$ keyctl print 19184530
ecryptfs user:test 64 490045d4bfe48c99f0d465fbbbb79e7500da954178e2de0697
dd85091f5450a0511219e9f7cd70dcd498038181466f78ac8d4c19504fcc72402bfc41c2
f253a41b7507ccaa4b2b03fff19a69d1cc0b16e71746473f023a95488b6edfd86f7fdd40
9d292e4bacded1258880122dd553a661

$ keyctl pipe 19184530 > ecryptfs.blob

使用创建的加密密钥 “1000100010001000” 将 eCryptfs 文件系统挂载到 ‘/secret’ 目录中

$ mount -i -t ecryptfs -oecryptfs_sig=1000100010001000,\
  ecryptfs_cipher=aes,ecryptfs_key_bytes=32 /secret /secret