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