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

Link => https://wiki.centos.org/FrontPage
Link => https://wiki.centos.org/zh-tw/HowTos/EncryptedFilesystem


用 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 加密檔案系統自動化。

所需套件

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

cryptsetup(CentOS-5 是 cryptsetup-luks)
device-mapper
util-linux
然而,它們很可能都已經存在於你的系統上,除非你進行了一個極度基本的安裝。

建立初期檔案系統

我多數將檔案加密,而不是整個分割區,因此我將 dm-crypt 與 losetup 回路裝置管理工具合併。下面是用 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 得到一個不大有用的信息:

mount: you must specify the filesystem type
如果出現這個情況,請反覆用 cryptsetup 嘗試重新掛載那個檔案系統:


cryptsetup remove secretfs
cryptsetup create secretfs /dev/loop0
mount /dev/mapper/secretfs /mnt/cryptofs/secretfs
這點並不適用 LUKS 磁碟區,因為 cryptsetup 在 luksOpen 這一步將會提供有用的錯誤信息。

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

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


cryptsetup luksAddKey <裝置>
舉個例說,你使用 /dev/loop0 這個回路,你可以執行:


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

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

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


對映名稱        裝置名稱        密碼檔案路徑        選項
當然,你一般不會需要全部四欄:

LUKS 磁碟區會忽視選項欄內的多數選項,因為 LUKS 磁碟區在磁碟區標頭內已收錄了一切關於密碼、密碼長度、及散列的必須資訊。另外,
一般來說,你不會想將一個純文字的密碼檔儲存在根分割區內。你當然可以將它儲存在其它地方,但是 rc.sysinit 在開機的這一個階段多數只會以唯讀式掛載了根目錄。如果密碼欄並不存在,或者數值是 none,系統在開機時會要求你輸入密碼。
因此,如果你使用 LUKS 磁碟區,而且想系統在開機時詢問密碼,你只需頭兩欄。讓我們看一個簡短的範例:


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


/dev/mapper/cryptedHome       /home        ext3    defaults        1 2
有兩個選頁是不會被 LUKS 磁碟區所忽視的:

swap:當映像被設置後,這個磁碟區將會被格式化成為調換分割區。
tmp:這個磁碟區將會被格式化成為 ext2 檔案系統,並設定合適的權根作為暫存檔案用的檔案系統。
這兩個選項要求 /etc/fstab 內含有使用相關映像的記錄,而且這些選項都有破壞力。一個為加密調換分割區而設的記錄可能會看似:


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


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



留言

這個網誌中的熱門文章

Virtual Machine 中進行開發專案優點 => VM & Docker

Why not Python?

Linux OS Class [20170710] vmare new and resize command demo