eCryptfs 文件系统的加密密钥¶
eCryptfs 是一种堆叠文件系统,它使用随机生成的文件加密密钥(FEK)透明地加密和解密每个文件。
每个 FEK 又通过文件加密密钥加密密钥(FEKEK)进行加密,此操作可以在内核空间执行,也可以在用户空间通过一个名为 'ecryptfsd' 的守护进程执行。在前一种情况下,操作由内核 CryptoAPI 使用从用户输入的密码短语派生出的密钥(FEKEK)直接执行;在后一种情况下,FEK 由 'ecryptfsd' 借助外部库加密,以支持其他机制,例如公钥加密、PKCS#11 和基于 TPM 的操作。
eCryptfs 定义的用于包含 FEK 解密所需信息的数据结构称为认证令牌,目前可以存储在 'user' 类型的内核密钥中,由随 'ecryptfs-utils' 包提供的用户空间工具 'mount.ecryptfs' 插入到用户的会话专用密钥环中。
‘encrypted’ 密钥类型已通过引入新格式 'ecryptfs' 进行了扩展,以便与 eCryptfs 文件系统配合使用。新引入的加密密钥格式在其有效载荷中存储了一个认证令牌,其中包含由内核随机生成并受父主密钥保护的 FEKEK。
为了避免已知明文攻击,通过命令 'keyctl print' 或 'keyctl pipe' 获取的数据块不包含整个认证令牌(其内容是众所周知的),而只包含加密形式的 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 文件系统一起使用的示例
创建一个长度为 64 字节,格式为 'ecryptfs' 的加密密钥“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