如何使用DM-Crypt加密Linux文件系統(tǒng)?
譯文讀者經(jīng)常詢問我們的一個常見問題是,如何為Linux實施一種文件系統(tǒng)加密方法。在深入探討這個話題之前,我想要闡明兩點:
首先,很難在網(wǎng)上找到這方面足夠多的信息。于是,我會向大家介紹幾個好不容易找到的確實很棒的資源(實際上是幾篇教程)。
其次,明白這個問題的技術(shù)細(xì)節(jié)很重要。這也是我在本文中所要探討的,之后我會介紹如何實現(xiàn)加密,然后介紹其他資源。
人們時常說想要加密數(shù)據(jù),但是他們常常忽視了一個根本的方面:他們到底想對什么進(jìn)行加密?他們是想從軟件包里面對數(shù)據(jù)進(jìn)行加密,然后將該數(shù)據(jù)存儲到硬驅(qū)上的單個文件中?比如說,他們是想讓LibreOffice創(chuàng)建整個.odt文字處理文檔,對它進(jìn)行加密,然后將加密的結(jié)果作為單個文件寫入到文件系統(tǒng),就像下圖那樣?還是說他們想讓Linux在文件系統(tǒng)層面自行處理加密?
一種方法就是從軟件包里面加密數(shù)據(jù),然后將該數(shù)據(jù)存儲到硬驅(qū)上的單個文件中。或者Linux會在文件系統(tǒng)層面自行處理加密。
以Linux處理加密事務(wù)為例,LibreOffice除了讀取和寫入文件外,什么也不做,就像它目前所做的那樣。Linux會加密文件,然后將文件實際寫入到磁盤上,解密后回過頭來讀取文件。這是我在這里采取的方法,但是你還要提出另外許多問題。想要提出合適的問題,你就要明白塊存儲的工作原理。不妨先看一下塊存儲。
塊級存儲
操作系統(tǒng)處理本地驅(qū)動器時,操作系統(tǒng)使用filesystem軟件來格式化驅(qū)動器,然后讀取并寫入單個扇區(qū)。保存文件時,filesystem軟件弄清楚需要寫入的扇區(qū)。讀取文件時,filesystem會弄清楚數(shù)據(jù)在哪些扇區(qū)上,然后讀取那些扇區(qū),為你重構(gòu)文件。想管理文件,filesystem使用不同類型的索引,它將這些索引也存儲在磁盤上。不同的filesystem軟件使用不同的方式來組織數(shù)據(jù),還包括不同的安全機(jī)制;最終結(jié)果就是有了不同的文件系統(tǒng),比如ext4和NTFS。
底層細(xì)節(jié)
我們已交待清楚了塊級設(shè)備的工作原因,不妨考慮這個:操作系統(tǒng)使用其filesystem軟件,將數(shù)據(jù)扇區(qū)寫入到驅(qū)動器。filesystem軟件確定將數(shù)據(jù)扇區(qū)寫入到何處、如何組織它們,包括創(chuàng)建描述文件名稱、組織方式等信息的元數(shù)據(jù)。但是filesystem軟件為了執(zhí)行實際讀取并寫入到驅(qū)動器的操作,就需要有設(shè)備驅(qū)動程序來做實際控制設(shè)備本身的工作,如下圖的左邊所示(驅(qū)動程序在/dev目錄里面的文件系統(tǒng)層次結(jié)構(gòu)中已有表示)。
filesystem軟件能夠在寫入數(shù)據(jù)之前進(jìn)行加密。或者,位于filesystem軟件與設(shè)備驅(qū)動程序之間的某個軟件能進(jìn)行加密。
就在filesystem軟件與設(shè)備驅(qū)動程序之間的這個點,加密方面需要做出選擇:你是想讓filesystem軟件進(jìn)行加密,然后寫入數(shù)據(jù)呢?還是說,我們實際上將一個軟件嵌入到filesystem軟件與設(shè)備驅(qū)動程序之間怎么樣?這樣一來,filesystem會像平常那樣運轉(zhuǎn),但是當(dāng)它試圖訪問設(shè)備時,其調(diào)用改而由加密軟件來處理,如上圖的右邊所示。我們在本文中要采用這種方法。不過先不妨談?wù)摿硗鈳讉€問題。
順便說一下,如果你想看看設(shè)備驅(qū)動程序在Linux系統(tǒng)的/dev目錄中如何存在,可以參閱本文:http://www.linuxdevcenter.com/pub/a/linux/2007/07/05/devhelloworld-a-simple-introduction-to-device-drivers-under-linux.html?page=1。它包括編程方面,但是如果你不是編程員,就點擊到第2頁,向下滾動鼠標(biāo),找到標(biāo)為Hello, World! Using /dev/hello_world的章節(jié),閱讀第一段,上面作了具體細(xì)致的解釋。)
如果你想加密整個分區(qū),可以考慮加密整個驅(qū)動器。不過這里存在一個小問題。如果計算機(jī)從該驅(qū)動器啟動,驅(qū)動器就需要一個小小的分區(qū)專門用于存放啟動代碼。該啟動代碼是機(jī)器代碼,計算機(jī)讀入后執(zhí)行,才能啟動計算機(jī)。如果整個硬驅(qū)經(jīng)過了加密,包括這部分?jǐn)?shù)據(jù),計算機(jī)就需要某種方式來解讀數(shù)據(jù)。但是計算機(jī)還沒有裝入文件系統(tǒng),所以它沒法讀取解密它的程序。看到問題之所在了嗎?解密代碼需要在BIOS本身里面。但是大多數(shù)計算機(jī)沒有這種代碼。而這意味著啟動記錄其實無法被加密。不過人們已經(jīng)討論了解決這個問題的種種方法(參閱:http://www.linuxquestions.org/questions/linux-security-4/full-disk-encryption-on-boot-partition-626270/),比如把啟動代碼放在可移動USB驅(qū)動器上面。
遠(yuǎn)程驅(qū)動器
如果你的驅(qū)動器是遠(yuǎn)程驅(qū)動器,有幾種方法可以訪問數(shù)據(jù);這對于你了解可以使用哪種類型的加密很重要。兩種方法是:
•塊級存儲就像使用本地驅(qū)動器那樣,因而你的filesystem軟件可以讀取并直接寫入到遠(yuǎn)程磁盤上的扇區(qū)。
•文件級存儲,你的操作系統(tǒng)將文件發(fā)送到遠(yuǎn)程服務(wù)器,遠(yuǎn)程服務(wù)器有自己的操作系統(tǒng)和filesystem軟件;該遠(yuǎn)程服務(wù)器進(jìn)而將文件寫入到其磁盤上。
如果是文件級存儲,你在加密方面沒有太多的選擇。如果你想加密數(shù)據(jù),就需要在你的應(yīng)用程序中加密它,然后將數(shù)據(jù)發(fā)送到遠(yuǎn)程服務(wù)器上存儲起來。
但如果是塊級遠(yuǎn)程存儲,確實有幾個辦法。比如說,如果你使用云托管服務(wù),因而你能將不同的卷連接到分配的服務(wù)器,你通常可以使用塊級存儲。卷未必物理連接到你的托管服務(wù)器;不過,服務(wù)器可以訪問它們,好像它們就是本地卷那樣,并且格式化卷,讀取和寫入單個扇區(qū),就好像驅(qū)動器是本地掛載的。這意味著,如果是塊級遠(yuǎn)程存儲,你可以在文件系統(tǒng)層面執(zhí)行加密,就好像在本地計算機(jī)和本地驅(qū)動器上執(zhí)行加密那樣。
軟件
現(xiàn)在我們知道了想要完成的任務(wù);問題是,你該如何實現(xiàn)呢?事實上,Linux內(nèi)置了一個軟件包,使用我之前介紹的那種方法,即把軟件嵌入到filesystem軟件與設(shè)備驅(qū)動程序之間。該軟件名為dm-crypt。而dm-crypt可以加密數(shù)據(jù),然后使用一種名為LUKS的存儲格式,將數(shù)據(jù)寫入到存儲設(shè)備(通過設(shè)備驅(qū)動程序)上。
LUKS(Linux統(tǒng)一密鑰設(shè)置)是驅(qū)動器本身上面所用的格式,它實際上用來取代ext4之類的文件系統(tǒng)。dm-crypt系統(tǒng)位于filesystem軟件與設(shè)備驅(qū)動程序之間; filesystem軟件讀取和寫入ext4,而ext4數(shù)據(jù)通過dm-crypt加以推送,然后dm-crypt將數(shù)據(jù)以LUKS格式存儲到驅(qū)動器上。因而,實際上ext4或NTFS之類的文件系統(tǒng)就在經(jīng)過加密的LUKS格式的“上面”。
請注意:dm-crypt是子系統(tǒng)的名稱,你可以使用諸多工具來處理它。沒有名為dm-crypt的單個命令。你可以使用一些程序來管理dm-crypt:
•cryptsetup:這個命令行程序為你提供了底層訪問權(quán),以便管理創(chuàng)建dm-crypt管理的設(shè)備這一任務(wù)。
•cryptmount:這個程序提供了更多的功能特性,更易于使用一點,具體可參閱幾年前的這篇文章:http://www.enterprisenetworkingplanet.com/netsecur/article.php/3742191/Create-Encrypted-Volumes-With-Cryptmount-and-Linux.htm。
其他功能特性
dm-crypt系統(tǒng)的一個優(yōu)點在于,它沒必要直接處理磁盤驅(qū)動程序。相反,它可以將所有數(shù)據(jù)保存到單個文件中,而不是使用LUKS和整個磁盤分區(qū)。這就意味著,你可以讓dm-crypt創(chuàng)建單個文件,然后你可以在單個文件里面創(chuàng)建整個文件系統(tǒng)。之后,你可以將該單個文件作為單獨的驅(qū)動器來掛載,然后從任何軟件來訪問它,就像你對待其他任何驅(qū)動器那樣。
云驅(qū)動器
由于一些云服務(wù)提供商(比如亞馬遜網(wǎng)絡(luò)服務(wù))為你提供了全面的根訪問權(quán),可以訪問連接到你服務(wù)器的塊設(shè)備,你可以充分利用dm-crypt;可以用LUKS格式來格式化塊設(shè)備,然后將它準(zhǔn)備用于你的dm-crypt系統(tǒng);之后,你完全可以用ext4文件系統(tǒng)來格式化它。最終結(jié)果就是完全加密的驅(qū)動器駐留在云端,你可以自行管理這個驅(qū)動器。想不想試一試?這篇教程就介紹了使用cryptsetup程序來加密:http://silvexis.com/2011/11/26/encrypting-your-data-on-amazon-ec2/。
另外一些云服務(wù)提供商不像AWS那樣讓你可以直接訪問塊設(shè)備。比如說,Digital Ocean就不允許你直接訪問;不過你仍可以創(chuàng)建一個文件,安裝dm-crypt來使用那個文件,然后在文件里面創(chuàng)建一個所謂的“容器”,它代表了文件系統(tǒng)。實際上,這個過程與你在自己的本地機(jī)器上創(chuàng)建一個加密的容器文件如出一轍。這里有一篇出自Digital Ocean網(wǎng)站的教程:https://www.digitalocean.com/community/tutorials/how-to-use-dm-crypt-to-create-an-encrypted-volume-on-an-ubuntu-vps,介紹了創(chuàng)建dm-crypt LUKS容器文件。在該教程中要注意:就像使用塊設(shè)備那樣,你可以創(chuàng)建整個文件系統(tǒng)(比如ext4),不過在這里,該文件系統(tǒng)駐留在容器文件里面。
本地驅(qū)動器
而這就引出了我們?nèi)绾卧诒镜貙崿F(xiàn)這一切的話題。在亞馬遜上創(chuàng)建加密驅(qū)動器的上述教程涉及的步驟與在你自己的硬驅(qū)上本地創(chuàng)建加密驅(qū)動器一個樣。不過另一篇教程(https://www.howtoforge.com/tutorial/how-to-encrypt-a-linux-partition-with-dm-crypt-luks/)給出了逐步的說明,以便在你自己的硬驅(qū)上本地創(chuàng)建,它也使用cryptsetup。
如果你想創(chuàng)建一個本地容器驅(qū)動器,含有整個經(jīng)過加密的文件系統(tǒng),只要遵循上面Digital Ocean教程中的步驟即可。
或者,如果你想使用另一個程序cryptmount來加密整個分區(qū)或創(chuàng)建容器文件,請關(guān)注這篇教程:http://www.enterprisenetworkingplanet.com/netsecur/article.php/3742191/Create-Encrypted-Volumes-With-Cryptmount-and-Linux.htm。作者Carla Schroder給出了幾個明確的步驟。
結(jié)束語
就是這樣。想知道如何加密,重要的一點是先要完全了解你實際上試圖完成什么任務(wù):讓應(yīng)用程序加密和解密數(shù)據(jù),還是讓操作系統(tǒng)處理加密;是加密整個分區(qū),還是僅僅加密個別文件;是不是想創(chuàng)建保存加密文件的容器。之后,你可以遵照我在本文中給出鏈接的幾個教程中提到的步驟,順利完成加密。





















