2021-05-12 14:32:11
如何使用DM-Crypt加密Linux檔案系統?
讀者經常詢問我們的一個常見問題是,如何為 Linux 實施一種檔案系統加密方法。在深入探討這個話題之前,我想要闡明兩點:
首先,很難在網上找到這方面足夠多的資訊。於是,我會向大家介紹幾個好不容易找到的確實很棒的資源(實際上是幾篇教學)。
其次,明白這個問題的技術細節很重要。這也是我在本文中所要探討的,之後我會介紹如何實現加密,然後介紹其他資源。
人們時常說想要加密資料,但是他們常常忽視了一個根本的方面:他們到底想對什麼進行加密?他們是想從軟體包裡面對資料進行加密,然後將該資料儲存到硬驅上的單個檔案中?比如說,他們是想讓 LibreOffice 建立整個 .odt 文書處理文件,對它進行加密,然後將加密的結果作為單個檔案寫入到檔案系統,就像下圖那樣?還是說他們想讓 Linux 在檔案系統層面自行處理加密?
一種方法就是從軟體包裡面加密資料,然後將該資料儲存到硬驅上的單個檔案中。或者 Linux 會在檔案系統層面自行處理加密。
以 Linux 處理加密事務為例, LibreOffice 除了讀取和寫入檔案外,什麼也不做,就像它目前所做的那樣。 Linux 會加密檔案,然後將檔案實際寫入到磁碟上,解密後回過頭來讀取檔案。這是我在這裡採取的方法,但是你還要提出另外許多問題。想要提出合適的問題,你就要明白塊儲存的工作原理。不妨先看一下塊儲存。
Linux塊裝置加密之dm-crypt分析 http://www.linuxidc.com/Linux/2011-03/33797.htm
教你如何利用dm-crypt給Ubuntu系統檔案加密 http://www.linuxidc.com/Linux/2008-12/17878.htm
塊級儲存
作業系統處理本地驅動器時,作業系統使用 filesystem 軟體來格式化驅動器,然後讀取並寫入單個磁區。儲存檔案時, filesystem 軟體弄清楚需要寫入的磁區。讀取檔案時, filesystem 會弄清楚資料在哪些磁區上,然後讀取那些磁區,為你重構檔案。想管理檔案, filesystem 使用不同型別的索引,它將這些索引也儲存在磁碟上。不同的 filesystem 軟體使用不同的方式來組織資料,還包括不同的安全機制;最終結果就是有了不同的檔案系統,比如 ext4 和 NTFS 。
底層細節
我們已交待清楚了塊級裝置的工作原因,不妨考慮這個:作業系統使用其 filesystem 軟體,將資料磁區寫入到驅動器。 filesystem 軟體確定將資料磁區寫入到何處、如何組織它們,包括建立描述檔名稱、組織方式等資訊的後設資料。但是 filesystem 軟體為了執行實際讀取並寫入到驅動器的操作,就需要有裝置驅動程式來做實際控制裝置本身的工作,如下圖的左邊所示(驅動程式在 /dev 目錄裡面的檔案系統層次結構中已有表示)。
filesystem 軟體能夠在寫入資料之前進行加密。或者,位於 filesystem 軟體與裝置驅動程式之間的某個軟體能進行加密。
就在 filesystem 軟體與裝置驅動程式之間的這個點,加密方面需要做出選擇:你是想讓 filesystem 軟體進行加密,然後寫入資料呢?還是說,我們實際上將一個軟體嵌入到 filesystem 軟體與裝置驅動程式之間怎麼樣?這樣一來, filesystem 會像平常那樣運轉,但是當它試圖存取裝置時,其呼叫改而由加密軟體來處理,如上圖的右邊所示。我們在本文中要採用這種方法。不過先不妨談論另外幾個問題。
順便說一下,如果你想看看裝置驅動程式在 Linux 系統的 /dev 目錄中如何存在,可以參閱本文: http://www.linuxdevcenter.com/pub/a/linux/2007/07/05/devhelloworld-a-simple-introduction-to-device-drivers-under-linux.html?page=1 。它包括程式設計方面,但是如果你不是程式設計員,就點選到第 2 頁,向下捲動滑鼠,找到標為 Hello, World! Using /dev/hello_world 的章節,閱讀第一段,上面作了具體細緻的解釋。)
如果你想加密整個分割區,可以考慮加密整個驅動器。不過這裡存在一個小問題。如果計算機從該驅動器啟動,驅動器就需要一個小小的分割區 專門用於存放啟動程式碼。該啟動程式碼是機器程式碼,計算機讀入後執行,才能啟動計算機。如果整個硬驅經過了加密,包括這部分資料,計算機就需要某種方式來解讀 資料。但是計算機還沒有裝入檔案系統,所以它沒法讀取解密它的程式。看到問題之所在了嗎?解密程式碼需要在 BIOS 本身裡面。但是大多數計算機沒有這種程式碼。而這意味著啟動記錄其實無法被加密。不過人們已經討論了解決這個問題的種種方法(參閱: http://www.linuxquestions.org/questions/linux-security-4/full-disk-encryption-on-boot-partition-626270/ ),比如把啟動程式碼放在可移動 USB 驅動器上面。
遠端驅動器
如果你的驅動器是遠端驅動器,有幾種方法可以存取資料;這對於你了解可以使用哪種型別的加密很重要。兩種方法是:
• 塊級儲存 就像使用本地驅動器那樣,因而你的 filesystem 軟體可以讀取並直接寫入到遠端磁碟上的磁區。
• 檔案級儲存 ,你的作業系統將檔案傳送到遠端伺服器,遠端伺服器有自己的作業系統和 filesystem 軟體;該遠端伺服器進而將檔案寫入到其磁碟上。
如果是檔案級儲存,你在加密方面沒有太多的選擇。如果你想加密資料,就需要在你的應用程式中加密它,然後將資料傳送到遠端伺服器上儲存起來。
但如果是塊級遠端儲存,確實有幾個辦法。比如說,如果你使用雲託管服務,因而你能將不同的捲連線到分配的伺服器,你通常可以使用塊級儲存。卷未必 物理連線到你的託管伺服器;不過,伺服器可以存取它們,好像它們就是本地捲那樣,並且格式化卷,讀取和寫入單個磁區,就好像驅動器是本地掛載的。這意味 著,如果是塊級遠端儲存,你可以在檔案系統層面執行加密,就好像在本地計算機和本地驅動器上執行加密那樣。
軟體
現在我們知道了想要完成的任務;問題是,你該如何實現呢?事實上, Linux 內建了一個軟體包,使用我之前介紹的那種方法,即把軟體嵌入到 filesystem 軟體與裝置驅動程式之間。該軟體名為 dm-crypt 。而 dm-crypt 可以加密資料,然後使用一種名為 LUKS 的儲存格式,將資料寫入到儲存裝置(通過裝置驅動程式)上。
LUKS ( Linux 統一金鑰設定)是驅動器本身上面所用的格式,它實際上用來取代 ext4 之類的檔案系統。 dm-crypt 系統位於 filesystem 軟體與裝置驅動程式之間; filesystem 軟體讀取和寫入 ext4 ,而 ext4 資料通過 dm-crypt 加以推播,然後 dm-crypt 將資料以 LUKS 格式儲存到驅動器上。因而,實際上 ext4 或 NTFS 之類的檔案系統就在經過加密的 LUKS 格式的“上面”。
請注意: dm-crypt 是子系統的名稱,你可以使用諸多工具來處理它。沒有名為 dm-crypt 的單個命令。你可以使用一些程式來管理 dm-crypt :
• cryptsetup : 這個命令列程式為你提供了底層存取權,以便管理建立 dm-crypt 管理的裝置這一任務。
• cryptmount : 這個程式提供了更多的功能特性,更易於使用一點,具體可參閱幾年前的這篇文章: http://www.enterprisenetworkingplanet.com/netsecur/article.php/3742191/Create-Encrypted-Volumes-With-Cryptmount-and-Linux.htm 。
其他功能特性
dm-crypt 系統的一個優點在於,它沒必要直接處理磁碟驅動程式。相反,它可以將所有資料儲存到單個檔案中,而不是使用 LUKS 和整個磁碟分割區。這就意味著,你可以讓 dm-crypt 建立單個檔案,然後你可以在單個檔案裡面建立整個檔案系統。之後,你可以將該單個檔案作為單獨的驅動器來掛載,然後從任何軟體來存取它,就像你對待其他任何驅動器那樣。
雲驅動器
由於一些雲服務提供商(比如亞馬遜網路服務)為你提供了全面的根存取權,可以存取連線到你伺服器的塊裝置,你可以充分利用 dm-crypt ;可以用 LUKS 格式來格式化塊裝置,然後將它準備用於你的 dm-crypt 系統;之後,你完全可以用 ext4 檔案系統來格式化它。最終結果就是完全加密的驅動器駐留在雲端,你可以自行管理這個驅動器。想不想試一試?這篇教學就介紹了使用 cryptsetup 程式來加密: http://silvexis.com/2011/11/26/encrypting-your-data-on-amazon-ec2/ 。
另外一些雲服務提供商不像 AWS 那樣讓你可以直接存取塊裝置。比如說, Digital Ocean 就不允許你直接存取;不過你仍可以建立一個檔案,安裝 dm-crypt 來使用那個檔案,然後在檔案裡面建立一個所謂的“容器”,它代表了檔案系統。實際上,這個過程與你在自己的本地機器上建立一個加密的容器檔案如出一轍。這裡有一篇出自 Digital Ocean 網站的教學: https://www.digitalocean.com/community/tutorials/how-to-use-dm-crypt-to-create-an-encrypted-volume-on-an-ubuntu-vps ,介紹了建立 dm-crypt LUKS 容器檔案。在該教學中要注意:就像使用塊裝置那樣,你可以建立整個檔案系統(比如 ext4 ),不過在這裡,該檔案系統駐留在容器檔案裡面。
本地驅動器
而這就引出了我們如何在本地實現這一切的話題。在亞馬遜上建立加密驅動器的上述教學涉及的步驟與在你自己的硬驅上本地建立加密驅動器一個樣。不過另一篇教學( https://www.howtoforge.com/tutorial/how-to-encrypt-a-linux-partition-with-dm-crypt-luks/ )給出了逐步的說明,以便在你自己的硬驅上本地建立,它也使用 cryptsetup 。
如果你想建立一個本地容器驅動器,含有整個經過加密的檔案系統,只要遵循上面 Digital Ocean 教學中的步驟即可。
或者,如果你想使用另一個程式 cryptmount 來加密整個分割區或建立容器檔案,請關注這篇教學: http://www.enterprisenetworkingplanet.com/netsecur/article.php/3742191/Create-Encrypted-Volumes-With-Cryptmount-and-Linux.htm 。作者 Carla Schroder 給出了幾個明確的步驟。
結束語
就是這樣。想知道如何加密,重要的一點是先要完全了解你實際上試圖完成什麼任務:讓應用程式加密和解密資料,還是讓作業系統處理加密;是加密整個 分割區,還是僅僅加密個別檔案;是不是想建立儲存加密檔案的容器。之後,你可以遵照我在本文中給出連結的幾個教學中提到的步驟,順利完成加密。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2015-08/121027.htm
相關文章