用 dm-crypt 建立 Linux 加密檔案系統

一個加密的檔案系統可以保障硬盤不受硬件層面的攻擊。任何人將硬盤弄到手後,依然要用蠻力猜測加密金鑰,構成奪取你資料的一個重大阻礙。

Windows 及 Mac OS X 各自提供了它們的標準加密檔案系統工具,但 Linux 當然提供了大量工具來完成這個工作。現時盛行的工具似乎是 dm-crypt。透過 cryptsetup 這個工具程式,dm-crypt 為 Linux 提供了一個頗為簡潔及易用的加密檔案系統工具。

此外,CentOS 5 包括了一個支援 LUKS 的改良版 dm-crypt。LUKS 是一個即將面世的標準,指定有關加密磁碟區的資訊如何放置在硬盤上。有關加密資料的中繼資料是放置在分割區的標頭,好讓它能兼容不同系統及支援多個用戶密碼。此外,GNOME 及 HAL 擁有處理 LUKS 磁碟區的支援,而且當帶有 LUKS 磁碟區的卸除式媒體被插入時,會自動要求輸入密碼。如果你不需要兼容較舊版的 CentOS 或未支援 LUKS 的系統,我們建議你使用 LUKS 的方案。這份文章內的範例亦有描述用來設置加密 LUKS 磁碟區的指令。

這裡有些腳本是採用了下面描述的方法,可將建立、卸下、及重新掛載 LUKS 加密檔案系統自動化。

所需套件

在開始之前,請確定所有必須的套件都已經安裝了:

然而,它們很可能都已經存在於你的系統上,除非你進行了一個極度基本的安裝。

建立初期檔案系統

我多數將檔案加密,而不是整個分割區,因此我將 dm-cryptlosetup 回路裝置管理工具合併。下面是用 Unix 指令殼的原始語言描述如何建立及掛載一個加密檔案系統。

# 建立一個適合你需要的空白檔案。這個範例將會建立一個 8GB 的稀疏
# 檔案,意即沒有真正的資料塊會被寫入。由於我們稍後將會強制分派資
# 料塊,現在做的並沒有意義,因為這些資料塊將會被重新寫入。
dd of=/path/to/secretfs bs=1G count=0 seek=8
# 限制檔案的存取權
chmod 600 /path/to/secretfs
# 將檔案與回路裝置掛鈎
losetup /dev/loop0 /path/to/secretfs
# 加密裝置內的資料。在這個例子裡,cryptsetup 會利用 Linux 的裝置
# 對映器來建立 /dev/mapper/secretfs。-y 這個選項指定你將會被問及
# 密碼兩次(有一次作檢查之用)。
cryptsetup -y create secretfs /dev/loop0
# 又或者,如果你想使用 LUKS,你應該使用以下兩個(與及額外的)指
# 令參數。首個指令將磁碟區初始化,並設定一條原始金鑰。第二個指令開
# 啟分割區並建立一個對映(在範例中是 /dev/mapper/secretfs)。
cryptsetup -y luksFormat /dev/loop0
cryptsetup luksOpen /dev/loop0 secretfs
# 檢查它的狀況(選擇性)
cryptsetup status secretfs
# 現在我們將新加密的裝置填滿零。這會強制分派資料塊。由於這些零已
# 被加密,它們對外就看似隨機的資料,即管有人將藏有加密檔案系統的
# 檔案弄到手上,要找尋被加密的資料塊差不多是沒可能。
dd if=/dev/zero of=/dev/mapper/secretfs
# 建立一個檔案系統及檢查它的狀況
mke2fs -j -O dir_index /dev/mapper/secretfs
tune2fs -l /dev/mapper/secretfs
# 將新檔案系統掛載在一個方便的位置
mkdir /mnt/cryptofs/secretfs
mount /dev/mapper/secretfs /mnt/cryptofs/secretfs

卸下及保障檔案系統

要手動地卸下及保障加密檔案系統,你基本上要反向執行尾部份的指令。

# 卸下檔案系統
umount /mnt/cryptofs/secretfs
# 移除裝置對映
cryptsetup remove secretfs
# 或者,如果是一個 LUKS 磁碟區
cryptsetup luksClose secretfs
# 將檔案與回路裝置脫鈎
losetup -d /dev/loop0

重新掛載加密檔案系統

一旦你已經建立了一個加密檔案系統,重新掛載它的程序是相對地簡單:

# 將檔案與回路裝置掛鈎
losetup /dev/loop0 /path/to/secretfs
# 將對映裝置加密。你將會被問及密碼
cryptsetup create secretfs /dev/loop0
# 或者,如果是一個 LUKS 磁碟區
cryptsetup luksOpen /dev/loop0 secretfs
# 掛載檔案系統
mount /dev/mapper/secretfs /mnt/cryptofs/secretfs

請注意,就算你打錯了密碼,cryptsetup不會提供有用的錯誤信息。你只會從 mount 得到一個不大有用的信息:

如果出現這個情況,請反覆用 cryptsetup 嘗試重新掛載那個檔案系統:

cryptsetup remove secretfs
cryptsetup create secretfs /dev/loop0
mount /dev/mapper/secretfs /mnt/cryptofs/secretfs

這點並不適用 LUKS 磁碟區,因為 cryptsetupluksOpen 這一步將會提供有用的錯誤信息。

在一個 LUKS 磁碟區內加入額外的金鑰

如上面所提及,LUKS 這個格式容許使用多條金鑰。意思是你可以加入多於一條用來開啟加密裝置的金鑰。要新增金鑰,你只須:

cryptsetup luksAddKey <裝置>

舉個例說,你使用 /dev/loop0 這個回路,你可以執行:

cryptsetup luksAddKey /dev/loop0

cryptsetup 要求你輸入現有的密碼兩次。之後,你將會被問及新的密碼兩次。當這一步完成後,你便可以使用現有的金鑰,或者新增的金鑰來開啟這個磁碟區。

在系統開機時設置加密磁碟區

有些時候你或許會想在系統開機時設置加密磁碟區,例如為一台筆記型電腦設置一個加密了的 home 分割區。在 CentOS 5 上,這件事情可以透過 /etc/crypttab 輕易地完成。/etc/crypttab 描述那些須要在開機時建立對映的加密磁碟區及分割區。記錄是以新行分隔,而當中包含了以下資料欄:

對映名稱        裝置名稱        密碼檔案路徑        選項

當然,你一般不會需要全部四欄:

因此,如果你使用 LUKS 磁碟區,而且想系統在開機時詢問密碼,你只需頭兩欄。讓我們看一個簡短的範例:

cryptedHome        /dev/sdc5

這個做會為 /dev/sdc5 上的加密磁碟區建立一個名叫 cryptedHome 的對映,而這個加密磁碟區先前是用 crypsetup luksFormat /dev/sdc5 來建立的。如果你亦在加密磁碟區上建立了一個檔案系統,你可以在 /etc/fstab 內新增一個記錄,好讓檔案系統在開機時被掛載:

/dev/mapper/cryptedHome       /home        ext3    defaults        1 2

有兩個選頁是不會被 LUKS 磁碟區所忽視的:

這兩個選項要求 /etc/fstab 內含有使用相關映像的記錄,而且這些選項都有破壞力。一個為加密調換分割區而設的記錄可能會看似:

cryptedSwap        /dev/sda2        none        swap

或者如果你不想在每次開機時為調換分割區輸入密碼:

cryptedSwap        /dev/sda2        /dev/urandom        swap

請注意,如果 /dev/sd2 已經是一個 LUKS 分割區,這個方法並不可行,因為 LUKS 分割區須要非隨機的金鑰。

Translation of revision 13

zh-tw/HowTos/EncryptedFilesystem (last edited 2010-03-08 08:59:46 by TimothyLee)