詳解Linux內(nèi)核安全技術(shù)——磁盤加密技術(shù)概述和eCryptfs
一、概述
加密是最常見的數(shù)據(jù)安全保護(hù)技術(shù),在數(shù)據(jù)生命周期各階段均有應(yīng)用。從應(yīng)用場(chǎng)景和技術(shù)實(shí)現(xiàn)上,按加密對(duì)象、用戶是否感知、加密算法等維度,有多種分類及對(duì)應(yīng)方案,并在主流操作系統(tǒng)如Windows、Linux、Android中有廣泛應(yīng)用。
本文是Linux內(nèi)核安全技術(shù)系列第二篇,主要介紹磁盤加密技術(shù)及主流實(shí)現(xiàn)方案。首先介紹磁盤加密技術(shù)背景,包括應(yīng)用場(chǎng)景、威脅模型、技術(shù)路線分類等;其次介紹磁盤加密的兩種實(shí)現(xiàn)方案,即全盤加密FDE和文件系統(tǒng)加密FBE,重點(diǎn)介紹Linux系統(tǒng)和內(nèi)核主流FBE實(shí)現(xiàn)方案;最后以eCryptfs為例,詳細(xì)分析其原理和應(yīng)用。
Linux內(nèi)核安全技術(shù)系列第一篇:Linux內(nèi)核安全技術(shù)——開源演進(jìn)回顧
1.1、說明
數(shù)據(jù)在其生命周期各階段的信息安全風(fēng)險(xiǎn)有很多,如仿冒、篡改、泄漏、越權(quán)訪問、DoS拒絕訪問等,一些成熟方案通常能解決消減多種風(fēng)險(xiǎn)。本文主要介紹磁盤加密技術(shù),主要關(guān)注的是數(shù)據(jù)泄漏、機(jī)密性維度,其他維度風(fēng)險(xiǎn)和保護(hù)不過多涉及。
1.2、縮略語(yǔ)和術(shù)語(yǔ)
本文使用的縮略語(yǔ)和術(shù)語(yǔ)說明如下:

二、技術(shù)背景介紹
2.1、威脅模型
數(shù)據(jù)生命周期管理(Data Lifecycle Management)通常將數(shù)據(jù)劃分為生產(chǎn)、存儲(chǔ)、使用、分享、銷毀、歸檔幾個(gè)階段。而從信息安全保護(hù)維度,則一般將數(shù)據(jù)劃分為三種狀態(tài),即:Data in Use、Data in Motion/Transit、Data at Rest。


Data in Motion/Transit,即數(shù)據(jù)傳輸場(chǎng)景,是大家最熟悉、技術(shù)發(fā)展最成熟的安全場(chǎng)景。例如基于SSL/TLS協(xié)議的Https應(yīng)用,基于SSH協(xié)議的SCP/SFTP應(yīng)用等。這些技術(shù)對(duì)數(shù)據(jù)的安全保護(hù)不僅包括加密傳輸,也包含雙向身份認(rèn)證、完整性保護(hù)等。
Data in Use,即數(shù)據(jù)使用場(chǎng)景。此時(shí)數(shù)據(jù)緩存在系統(tǒng)DRAM、Cache、CPU Register中,一般明文存在。但在一些高安全場(chǎng)景下,為防止側(cè)信道攻擊(如Cold Boot Attack獲取DRAM中密鑰信息),業(yè)界也提出了Full Memory Encryption全內(nèi)存加密技術(shù)。如Intel的TME(Total Memory Encryption)、AMD的SME(Secure Memory Encryption)等。FME使能時(shí)系統(tǒng)DRAM數(shù)據(jù)全部為加密存儲(chǔ),CPU通過特定硬件加解密引擎分別在讀寫數(shù)據(jù)時(shí)做解密加密操作,加解密密鑰則一般每次boot時(shí)唯一生成。


Data at Rest,即數(shù)據(jù)(持久化)存儲(chǔ)場(chǎng)景。此時(shí)數(shù)據(jù)屬于inactive狀態(tài)未使用,存儲(chǔ)在磁盤等非易失性介質(zhì)。安全風(fēng)險(xiǎn)主要有非授權(quán)訪問、設(shè)備丟失導(dǎo)致數(shù)據(jù)泄漏等。常見保護(hù)方式包括物理/網(wǎng)絡(luò)層面的隔離和訪問控制、以及數(shù)據(jù)(落盤)加密。對(duì)于加密存儲(chǔ)的磁盤數(shù)據(jù),即使設(shè)備(如PC/手機(jī))丟失,攻擊者拆出硬盤或Flash器件,也只能讀取到器件中的密文,保證關(guān)鍵數(shù)據(jù)機(jī)密性。
2.2、技術(shù)路線
加密是防止數(shù)據(jù)泄漏、保證機(jī)密性的有效手段。按照不同維度,加密技術(shù)/方案可以有多種分類,簡(jiǎn)單匯總?cè)缦拢?/p>
需要說明的是,幾種維度不互斥,某一方案通常符合/采用多個(gè)特征/技術(shù)。例如本文要介紹的磁盤加密技術(shù)Disk Encryption,其加密對(duì)象一般是整個(gè)磁盤或文件系統(tǒng),但從數(shù)據(jù)狀態(tài)維度看屬于Data at Res Encryption技術(shù),從用戶感知維度看屬于透明加密技術(shù),從加密算法維度看采用對(duì)稱加密。
下面簡(jiǎn)單介紹幾個(gè)分類涉及的技術(shù)概念/術(shù)語(yǔ),詳情可查閱文末參考鏈接,及后續(xù)章節(jié)中的詳細(xì)分析。
Data at Rest Encryption
數(shù)據(jù)在at Rest狀態(tài)下保持加密的技術(shù),參考https://wiki.archlinux.org/title/Data-at-rest_encryption說明,加密對(duì)象一般為磁盤(塊設(shè)備)、文件系統(tǒng)目錄,加解密過程采用透明加密技術(shù)。

Transparent Encryption
透明加密,也稱作real-time encryption或on-the-fly encryption。特點(diǎn)是數(shù)據(jù)在使用過程中自動(dòng)完成加解密,無(wú)需用戶干預(yù)。

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ??


三、磁盤加密技術(shù)
如上節(jié)所述,Disk Encryption磁盤加密,目標(biāo)是保護(hù)數(shù)據(jù)at Rest狀態(tài)下的機(jī)密性,加密對(duì)象是整個(gè)磁盤/分區(qū)、或者文件系統(tǒng),采用實(shí)時(shí)加解密技術(shù)。更多介紹可參考https://en.wikipedia.org/wiki/Disk_encryption 。

磁盤加密技術(shù)從加密對(duì)象,軟硬件實(shí)現(xiàn)、文件系統(tǒng)特征等維度,也可以有多種分類。首先,根據(jù)加密對(duì)像是整個(gè)磁盤,還是文件系統(tǒng),可分為Full-Disk Encryption 和 Filesystem-Level Encryption(也稱為File-Based Encryption)兩大類。

3.1、FDE
Full-Disk Encryption全盤加密在實(shí)現(xiàn)上有硬件、軟件兩種方案。兩者核心原理類似,區(qū)別是加解密核心功能所在主體是軟件還是硬件,另外軟件方案一般不能真正加密整個(gè)硬盤(boot分區(qū)不加密),而硬件方案Hardware-based Full-Disk Encryption則具備整個(gè)硬盤加密能力。硬件FDE方案產(chǎn)品主要是Self Encryption Drive自加密硬盤,一般由存儲(chǔ)器件廠商、安全廠商提供。關(guān)于硬件FDE方案和SED產(chǎn)品技術(shù),可參閱文末Hardware-based Full Disk Encryption 和SED相關(guān)鏈接。



硬件和軟件FDE方案核心原理及流程類似,統(tǒng)一抽象說明如下:
在初始化或創(chuàng)建FDE時(shí),會(huì)隨機(jī)生成一個(gè)磁盤數(shù)據(jù)加密DEK(Disk Encryption Key,用戶無(wú)感知),同時(shí)要求用戶輸入一個(gè)AK(Authentication Key)用來加密保護(hù)DEK。在使用時(shí),需用戶先輸入AK驗(yàn)證并解密DEK,之后操作系統(tǒng)才能使用DEK訪問加密磁盤上的數(shù)據(jù)。下圖是一個(gè)軟件FDE的描述。

由于需執(zhí)行特定程序展示UI提供用戶輸入AK并驗(yàn)證,故這部分啟動(dòng)代碼不能加密。因此引了入Pre-Boot Authentication 及PBA environment的概念。


在PBA實(shí)現(xiàn)上,硬件FDE方案(SED產(chǎn)品)一般出廠時(shí)內(nèi)嵌Pre-Boot environment(小的OS或bootloader),上電后先運(yùn)行Pre-Boot程序并驗(yàn)證AK,再進(jìn)行正常的加載引導(dǎo)等。
軟件FDE方案采用不加密boot分區(qū)的方式,一般在initial ramdisk集成PBA功能并完成驗(yàn)證。

軟件FDE方案發(fā)展歷史久,主流OS環(huán)境均有成熟方案,例如Windows下的BitLocker、Apple OS/X下的FileVault、以及Linux/UNIX生態(tài)下的dm-crypt/LUKS。另外也有不依賴操作系統(tǒng)的三方FDE方案,如TrueCrypt、VeraCrypt等。更多軟件FDE方案可以參考鏈接 https://en.wikipedia.org/wiki/Comparison_of_disk_encryption_software 及下圖。

對(duì)Linux下dm-crypt/LUKS方案感興趣的同學(xué)可以在Ubuntu虛擬機(jī)上測(cè)試研究。下面是幾個(gè)關(guān)鍵場(chǎng)景截圖:Ubuntu虛擬機(jī)安裝時(shí)使能磁盤加密配置、啟動(dòng)階段PBA驗(yàn)證、系統(tǒng)主分區(qū)sda5加密后的磁盤類型(可看到boot分區(qū)sda1未加密)。



3.2、FBE
File-Based Encryption,又稱Filesystem-Level Encryption,文件系統(tǒng)加密。相比于FBE,第二個(gè)名字更能體現(xiàn)方案基于文件系統(tǒng)的技術(shù)特點(diǎn)。而基于文件系統(tǒng)的特點(diǎn),一方面決定了只能由軟件實(shí)現(xiàn),另一方面決定了各方案差異也主要圍繞在文件系統(tǒng)。
常見FBE方案,一般分為Stackable cryptographic filesystem 和Native/General filesystem with encryption兩種。


第一種,新增一個(gè)加解密文件系統(tǒng),堆疊在現(xiàn)有存儲(chǔ)軟件棧的某一層。例如Linux內(nèi)核自v2.6.19開始支持,已很成熟穩(wěn)定的eCryptfs方案,就是在VFS -> Native FS層之間加入新加解密文件系統(tǒng)支持。類似還有基于用戶態(tài)文件系統(tǒng)FUSE的各種方案。
第二種,在現(xiàn)有文件系統(tǒng)中引入加解密功能。例如Linux內(nèi)核自v4.1支持的Ext4文件系統(tǒng)加密,自v4.2支持的F2FS文件系統(tǒng)加密,自v4.10后支持的UBIFS文件系統(tǒng)加密。需要說明的是,內(nèi)核中Ext4、F2FS、ubifs共用加解密功能模塊,即內(nèi)核fscrypt特性。另外,Android系統(tǒng)引入的FBE方案,底層內(nèi)核實(shí)現(xiàn)也是基于F2FS+fscrypt。
兩種類型及更多業(yè)界FBE實(shí)現(xiàn),可參考鏈接 https://en.wikipedia.org/wiki/List_of_cryptographic_file_systems 及下圖:


和FDE方案相比,F(xiàn)BE有幾個(gè)顯著的特點(diǎn):
1、支持單獨(dú)的目錄或文件加密,方便靈活使用配置。只加密目標(biāo)對(duì)象,不加密整個(gè)磁盤,降低了系統(tǒng)加解密負(fù)載開銷。
2、支持不同目錄/文件使用不同加密密鑰。
3、加密目錄和非加密目錄并存(甚至一個(gè)加密目錄中加密和非加密文件也可以并存)。加密目錄文件的備份傳輸靈活方便。

更多FDE和FBE的詳細(xì)對(duì)比,以及Linux中FBE具體實(shí)現(xiàn),請(qǐng)參見后續(xù)章節(jié)。
3.2、FDE vs FBE
前面分析已經(jīng)知道,軟件FDE和FBE都是基于文件系統(tǒng),差別主要在文件系統(tǒng)實(shí)現(xiàn)差異,整理對(duì)比如下:

【說明】軟件FDE/FBE主要是指其加解密功能主體在軟件(文件系統(tǒng))實(shí)現(xiàn),并不意味著不使用硬件,相反為了提高性能,也會(huì)利用類似Crypto Engine等硬件引擎來加速。
從整個(gè)系統(tǒng)軟硬件架構(gòu)分析,可將硬件FDE、軟件FDE、以FBE實(shí)現(xiàn)和系統(tǒng)軟硬件架構(gòu)的關(guān)系位置描述如下圖:

上圖中,磁盤加密方案,越往上層實(shí)現(xiàn)用戶使用配置越靈活,但性能差;越往下層實(shí)現(xiàn)越不靈活,但對(duì)用戶越透明且性能越好。結(jié)合前文描述,將FDE和FBE兩種方案的差異對(duì)比整理如下:

3.3、Linux系統(tǒng)FBE
從Linux系統(tǒng)軟件架構(gòu)看,典型FDE和FBE實(shí)現(xiàn)方案分布如下圖,包括基于dm-crypt的軟件FDE方案、基于通用文件系統(tǒng)的fscrypt FBE方案、基于VFS的eCryptfs FBE方案,以及眾多基于FUSE的FBE方案。

前面章節(jié)已經(jīng)簡(jiǎn)單介紹過基于dm-crypt的FDE方案在ubuntu虛擬機(jī)上的驗(yàn)證情況,這里先簡(jiǎn)單介紹Linux系統(tǒng)和內(nèi)核的幾種軟件FBE實(shí)現(xiàn)方案和特點(diǎn),后續(xù)章節(jié)會(huì)以eCryptfs為例做詳細(xì)分析。
FUSE-Based
FUSE即Filesystem in Userspace,用戶態(tài)文件系統(tǒng)。FUSE設(shè)計(jì)初衷就是為方便用戶不修改編譯內(nèi)核的情況下,在user space實(shí)現(xiàn)定制文件系統(tǒng)。FUSE架構(gòu)原理和實(shí)現(xiàn)如下圖,內(nèi)核態(tài)FUSE和用戶態(tài)libfuse為App –> VFS -> 用戶文件系統(tǒng)鏈路服務(wù),用戶定制實(shí)現(xiàn)主要在User-Level Filesystem部分。

由于天然的靈活性,基于FUSE實(shí)現(xiàn)FBE的方案有很多,例如gocryptfs、EncFS、CryFS、securefs等。但是,F(xiàn)USE引入的多次系統(tǒng)調(diào)用和拷貝等開銷,也導(dǎo)致基于FUSE的FBE方案通常性能都不好。gocryptfs項(xiàng)目有一個(gè)stackable FBE各方案的對(duì)比分析(鏈接https://nuetzlich.net/gocryptfs/comparison/),該分析數(shù)據(jù)也驗(yàn)證說明了FUSE FBE方案的優(yōu)缺點(diǎn)。
首先是各種stackable FBE方案介紹和整體特點(diǎn),從數(shù)量上看,F(xiàn)USE FBE方案占據(jù)絕大多數(shù),非FUSE方案只有eCryptfs。


其次,相比于eCryptfs,F(xiàn)USE方案在性能上整體處于劣勢(shì)。盡管gocryptfs在順序讀寫上性能不錯(cuò),但在其他測(cè)試如解壓縮、MD5計(jì)算、目錄遞歸訪問/刪除等測(cè)試項(xiàng)上看,劣勢(shì)也比較明顯。這和我們?cè)?.2章節(jié)對(duì)比FDE和FBE、以及分析磁盤加密在軟件棧不同層級(jí)實(shí)現(xiàn)的效果差異是一致的。

更多關(guān)于FUSE FBE各方案的特點(diǎn),如文件內(nèi)容加密、文件名加密等,可參考上述對(duì)比鏈接或各方案主頁(yè),在此不詳細(xì)介紹。
eCryptfs
eCryptfs衍生于Cryptfs項(xiàng)目,早期方案和設(shè)計(jì)思想源自2005和2007的兩篇論文,即《eCryptfs: an enterprise-class cryptographic filesystem for Linux》和《eCryptfs: a Stacked Cryptographic Filesystem》。eCryptfs項(xiàng)目分為內(nèi)核部分和用戶態(tài)部分,內(nèi)核態(tài)代碼于v2.6.19版本合入社區(qū)主線,用戶態(tài)代碼在軟件包ecryptfs-utils中維護(hù)。
eCryptfs和上面介紹的FUSE方案一樣,也屬于stackable FBE類型,故不依賴于OS底層文件系統(tǒng)類型,可以堆疊在各種文件系統(tǒng)之上,靈活性很好。也支持對(duì)不同文件、目錄加密,以及文件名加密。
當(dāng)前eCryptfs項(xiàng)目開源社區(qū)活躍度不高,早期用戶/產(chǎn)品也在遷移,但其方案和設(shè)計(jì)原理仍然值得深入學(xué)習(xí)分析。詳細(xì)測(cè)試驗(yàn)證和原理分析請(qǐng)見第4章。

fscrypt
fscrypt是在內(nèi)核文件系統(tǒng)上實(shí)現(xiàn)的一個(gè)native FBE方案。fscrypt特性也包括內(nèi)核態(tài)和用戶態(tài)兩部分,內(nèi)核態(tài)部分是實(shí)現(xiàn)在fs/crypto目錄的公用加解密模塊,支持ext4、F2FS、UBIFS文件系統(tǒng)集成使用。用戶態(tài)工具fscrypt則實(shí)現(xiàn)各種命令行工具方便用戶使用。
fscrypt作為FBE方案,支持不同目錄/文件采用不同密鑰,對(duì)于metadata,fscrypt支持文件名filename加密,其他metadata如timestamp、size、attribute等不加密。fscrypt最大的應(yīng)用即Android 采用的FBE方案,結(jié)合F2FS文件系統(tǒng),對(duì)手機(jī)上的數(shù)據(jù)進(jìn)行data at rest encryption保護(hù)。本文受限于篇幅,不做詳細(xì)分析。

四、eCryptfs詳解
本章節(jié)我們先用簡(jiǎn)單用例驗(yàn)證eCryptfs加密效果特點(diǎn),使大家對(duì)方案有個(gè)整體感性認(rèn)識(shí),同時(shí)也會(huì)提供一個(gè)C版本用例作參考。其次對(duì)測(cè)試結(jié)果進(jìn)行初步分析,接著詳細(xì)分析eCryptfs方案架構(gòu)原理和核心機(jī)制,最后對(duì)關(guān)鍵業(yè)務(wù)流程代碼進(jìn)行簡(jiǎn)單梳理。
測(cè)試環(huán)境使用Ubuntu 20.04虛擬機(jī),因Ubuntu系統(tǒng)默認(rèn)打開eCryptfs內(nèi)核配置(CONFIG_ECRYPT_FS=y),只需apt安裝用戶態(tài)工具ecryptfs-utils即可。
4.1、測(cè)試用例
下圖是一個(gè)腳本基礎(chǔ)測(cè)試用例。先創(chuàng)建test目錄和文件hello,之后使用 mount -t ecryptfs方式對(duì)test目錄進(jìn)行加密,為避免命令行交互,將所有加密參數(shù)(passwd、cipher、key size等)通過命令行-o傳遞。加密后在test目錄創(chuàng)建新文件hello_encrypted。最后umount取消目錄加密。


從第一個(gè)測(cè)試用例可以觀察到的現(xiàn)象/特性有:
1、執(zhí)行mount,寫入hello_encrypted文件內(nèi)容后可以正確訪問,但umount后則為密文。說明eCryptfs作為堆疊加密文件系統(tǒng),是通過mount/unmount操作來開關(guān)使能的。功能打開時(shí),用戶讀寫操作是感知不到數(shù)據(jù)加解密過程的,即透明加密。
2、hello文件內(nèi)容在mount前寫入,在mount前后都能正確訪問(用例只測(cè)了讀操作,實(shí)際寫也可以)。說明eCryptfs支持非加密文件和加密文件在一個(gè)目錄內(nèi)混合存儲(chǔ),并能正確訪問(實(shí)際操作強(qiáng)烈不建議,見下個(gè)用例)。
3、對(duì)于加密文件hello_encrypted,明文狀態(tài)下長(zhǎng)度為16 Bytes,加密狀態(tài)下為12KB,變化比較明顯。
如果對(duì)上述測(cè)試用例稍加改動(dòng),調(diào)整mount -t ecryptfs參數(shù),如改變passwd,取消no_sig_cache=y配置,打開文件名加密參數(shù)即ecryptfs_enable_filename_crypto=y,測(cè)試效果如下圖:

從第二個(gè)改動(dòng)后的用例可以觀察到的現(xiàn)象/特性有 :4、ecryptfs支持文件名加密。因?yàn)槲募用苊荑€FNEK未在參數(shù)中指定,mount helper會(huì)提示/默認(rèn)使用文件內(nèi)容加密密鑰(即圖中fnek_sig和fs_sig相同,需說明的是加密密鑰并非參數(shù)中的passwd,后續(xù)架構(gòu)和密鑰管理章節(jié)會(huì)說明)。5、雖然ecryptfs_passthrough特性仍打開,即允許加密和非加密文件共存,但與上一個(gè)用例效果不同。啟動(dòng)文件名加密并mount后,未加密文件hello無(wú)法在test中顯示,umount后又可正常訪問。兩個(gè)用例中passthrough特性在不同參數(shù)下表現(xiàn)不同,因此實(shí)際應(yīng)用中,強(qiáng)烈不建議加密和非加密文件在一個(gè)目錄混存。


另外補(bǔ)充一個(gè)現(xiàn)象/特性:
6、umount后,即加密的test目錄是可以直接傳輸/拷貝到其他主機(jī)/網(wǎng)絡(luò)進(jìn)行存儲(chǔ)備份的。其他用戶使用時(shí),只需用相同參數(shù)重新mount即可正確訪問。
關(guān)于用例中mount -t ecryptfs命令的相關(guān)參數(shù)匯總?cè)缦?,詳情可參考man ecryptfs手冊(cè)及ecryptfs-utils源碼。部分參數(shù)和意義會(huì)在架構(gòu)分析和密鑰管理章節(jié)進(jìn)一步說明。
需要說明的是,上述腳本用例的功能基本都可以用ecryptfs-utils提供接口API實(shí)現(xiàn)。下面是作者實(shí)現(xiàn)的一個(gè)C用例的部分代碼參考。因?yàn)镃程序需引用ecryptfs.h頭文件并使用相關(guān)API函數(shù),需要安裝libecryptfs-dev軟件包,并在編譯時(shí)指定-lecryptfs鏈接對(duì)應(yīng)庫(kù)文件。
C用例中需要注意的是,mount操作前必須進(jìn)行ecryptfs_add_passphrase_key_to_keyring,即將passphrase轉(zhuǎn)換成對(duì)應(yīng)的key(實(shí)際為FEKEK,見后續(xù)分析),并注冊(cè)到內(nèi)核keyring,同時(shí)返回一個(gè)key_sig給用戶后續(xù)使用。

4.2、結(jié)果分析
從上節(jié)測(cè)試結(jié)果中,匯總相關(guān)測(cè)試項(xiàng)以及eCryptfs效果特性如下表,需要說明的有兩點(diǎn):

一是對(duì)test目錄重復(fù)mount且每次使用不同密鑰的效果。從下圖用例看,對(duì)應(yīng)passwd mount后生成的文件,只能在該mount context中正確訪問。這個(gè)用例僅為簡(jiǎn)單說明,在參數(shù)變化情況下,例如文件名加密,情況可能更復(fù)雜和不確定,因此也不建議使用。

二是文件加密后大小變化問題,這個(gè)原因在于eCryptfs的方案本身設(shè)計(jì)。下圖是eCryptfs明文和密文的映射關(guān)系及論文中的說明,分別出自2006年設(shè)計(jì)文檔《eCryptfs v0.1 Design Document》和2007年論文《eCryptfs: a Stacked Cryptographic Filesystem》。從中可看出加密文件格式會(huì)多增加一個(gè)header信息(預(yù)留一個(gè)page)。對(duì)于文件內(nèi)容則是按頁(yè)分塊加密。為了綜合性能考慮,故使文件大小做到page對(duì)齊,最小12KB。



從方案設(shè)計(jì)和文件格式看,加密對(duì)于小文件來說損耗有點(diǎn)大,文件越大影響越小。下圖是分別用4M、40M、400M文件測(cè)試對(duì)比結(jié)果,不論源文件大小,加密后的文件size增加8KB。

4.3、整體架構(gòu)
eCryptfs整體架構(gòu)如下圖,主要是內(nèi)核模塊eCryptfs以及用戶態(tài)進(jìn)程ecryptfsd。ecryptfsd進(jìn)程只在使用key type為openssl模式時(shí)需要,使用passphrase模式(如上述測(cè)試用例)時(shí)不需要。ecryptfs-utils可作為用戶態(tài)輔助工具或C接口編程參考。
應(yīng)用程序發(fā)起系統(tǒng)調(diào)用時(shí)先經(jīng)過VFS,判斷目錄類型為eCryptfs時(shí)調(diào)用eCryptfs模塊的注冊(cè)函數(shù)。之后eCryptfs根據(jù)mount session中保存的key signature參數(shù)從keyring中找到對(duì)應(yīng)密鑰(FEKEK),再調(diào)用crypto模塊API完成文件加解密。


eCryptfs核心加解密機(jī)制如下圖,主要特點(diǎn)歸納如下:1、FEK(File Encryption Key)唯一,即每個(gè)文件的加密密鑰均不同,是隨文件創(chuàng)建時(shí)生成的一個(gè)隨機(jī)數(shù)。2、每個(gè)文件的FEK經(jīng)過FEKEK(File Encryption Key Encryption Key)加密保護(hù),加密后FEK稱為EFEK(Encrypted File Encryption Key),并保存在eCryptfs加密文件的header信息中(如前述page 0區(qū)域)。3、passphrase模式下,F(xiàn)EKEK是基于用戶passphrase_passwd派生而來,派生方式是hash計(jì)算(參考代碼分析章節(jié))。4、文件內(nèi)容按照page大?。―ata Extent)進(jìn)行塊加密。
核心過程可簡(jiǎn)單描述為:
1、新文件加密時(shí),生成隨機(jī)數(shù)FEK,對(duì)文件內(nèi)容進(jìn)行分塊加密并存儲(chǔ)。根據(jù)用戶傳遞的key_sig參數(shù)從keyring找到對(duì)應(yīng)的FEKEK,用FEKEK加密FEK,生成EFEK并保存在文件header中。
2、解密時(shí),同樣根絕key_sig找到FEKEK,用FEKEK解密EFEK后得到FEK,再用FEK解密文件內(nèi)容。

4.4、密鑰管理
從上節(jié)中我們了解到eCryptfs中核心機(jī)制中主要有兩個(gè)KEY,即FEKEK和FEK,前者和用戶輸入passphrase_passwd有關(guān),后者是每個(gè)文件唯一的隨機(jī)數(shù)。下面結(jié)合ecryptfs-utils源碼,分別介紹這兩個(gè)KEY的生成過程。
1、用戶passphrase_passwd 到 FEKEK的轉(zhuǎn)換
從C測(cè)試用例中看到,opt參數(shù)只有key_sig信息,并不指定FEKEK。且mount操作前提是已添加對(duì)應(yīng)key(FEKEK)到內(nèi)核keyring。腳本命令實(shí)際是mount helper協(xié)助(隱式)完成了添加keyring的操作。
核心函數(shù)即C用例中調(diào)用的ecryptfs_add_passphrase_key_to_key_ring,這個(gè)函數(shù)的調(diào)用關(guān)系如下圖:

首先ecryptfs_generate_passphrase_auth_tok會(huì)根據(jù)用戶輸入的passphrases信息、salt信息(參數(shù)指定,ecryptfs-utils有一個(gè)默認(rèn)值ECRYPTFS_DEFAULT_SALT如下圖),在generate_passphrase_sig函數(shù)中進(jìn)行hash計(jì)算,并將結(jié)果記錄在變量fekek中,然后對(duì)fekek再進(jìn)行一次hash計(jì)算,結(jié)果記錄為passphrase_sig/auth_token_sig,并返回給用戶后續(xù)使用(key_sig)。
generate_payload則為每一次session創(chuàng)建一個(gè)auth_tok結(jié)構(gòu)體,記錄更多加解密相關(guān)信息。





最后調(diào)用ecryptfs_add_auth_tok_to_keyring中,將對(duì)應(yīng)FEKEK、key_sig、salt等信息都添加到keyring。至此就完成了從passphrase_passwd到FEKEK的轉(zhuǎn)換和內(nèi)核keyring添加。

2、FEK的生成過程
FEK作為文件內(nèi)容加密key,是每個(gè)文件唯一的隨機(jī)數(shù)。生成時(shí)機(jī)是在create系統(tǒng)調(diào)用階段,具體是在內(nèi)核函數(shù)ecryptfs_new_file_context 和 ecryptfs_generate_new_key中完成,代碼見下。


4.5、代碼分析
本節(jié)將eCryptfs方案核心過程的代碼調(diào)用關(guān)系進(jìn)行了簡(jiǎn)單梳理并羅列,供讀者參考和對(duì)照閱讀,不做詳細(xì)分析。
1、Mount過程關(guān)鍵函數(shù)調(diào)用。
從mount_crypt_stat關(guān)鍵結(jié)構(gòu)體,以及tokens結(jié)構(gòu)體中可看出,mount opt只接受key signature信息。

2、Create過程關(guān)鍵函數(shù)調(diào)用。
create過程中創(chuàng)建新文件,此時(shí)ecryptfs_crypt_stat結(jié)構(gòu)體中保存了每個(gè)文件的加密參數(shù)信息。
3、open過程關(guān)鍵函數(shù)調(diào)用。

4、read & write過程關(guān)鍵函數(shù)調(diào)用。
五、總結(jié)
本文首先介紹了磁盤加密技術(shù)背景,包括威脅模型,技術(shù)路線和特點(diǎn),隨后根據(jù)加密對(duì)象差異,分別介紹了FDE和FBE兩種磁盤加密方案,包括軟硬件實(shí)現(xiàn)、文件系統(tǒng)實(shí)現(xiàn)差異等,并做了對(duì)比分析。最后重點(diǎn)介紹了Linux系統(tǒng)中典型FBE方案及特點(diǎn),并以eCryptfs為例進(jìn)行了詳細(xì)分析。
希望能幫助讀者對(duì)磁盤加密技術(shù)概念、FDE和FBE區(qū)別、業(yè)界FBE方案特點(diǎn)、以及FBE實(shí)現(xiàn)關(guān)鍵技術(shù)能有進(jìn)一步了解。受限于篇幅,很多技術(shù)細(xì)節(jié)和方案無(wú)法再深入展開,如fscrypt。希望在后續(xù)文章中能結(jié)合Android FBE對(duì)fscrypt做進(jìn)一步分享。
原文作者:內(nèi)核工匠
