歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 如何使用DM-Crypt加密Linux文件系統?

如何使用DM-Crypt加密Linux文件系統?

日期:2017/2/28 13:59:29   编辑: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 給出了幾個明確的步驟。

結束語

就是這樣。想知道如何加密,重要的一點是先要完全了解你實際上試圖完成什麼任務:讓應用程序加密和解密數據,還是讓操作系統處理加密;是加密整個 分區,還是僅僅加密個別文件;是不是想創建保存加密文件的容器。之後,你可以遵照我在本文中給出鏈接的幾個教程中提到的步驟,順利完成加密。

Copyright © Linux教程網 All Rights Reserved