dm-crypt/加密非root文件系统

出自 Arch Linux 中文维基

以下是一些用 dm-crypt 加密輔助文件系統(例如非 root 文件系統)的例子。

總覽[編輯 | 編輯原始碼]

在不加密作業系統和程序文件時加密輔助文件系統,通常只用於保護敏感數據。這對於加密外部介質很有用,例如 USB 驅動器,從而使它可以安全地在不同電腦使用。也可以根據誰有權限訪問數據單獨加密數據集。

因為 dm-crypt 是一個塊級別加密層,它加密整個塊設備,分區loop 設備。加密文件系統級加密層的單文件,例如 eCryptfsEncFS。請見靜態數據加密獲取有關保護私隱數據的通用建議。

分區[編輯 | 編輯原始碼]

這個例子說的是對 /home 分區的加密,但是也可以應用到其他非根分區的、包含用戶數據的分區。

提示:你可能在一個分區上有某個用戶專用的 /home 目錄,或者是所有用戶共用這個分區作為 /home 目錄。

首先要保證分區是空的(上面沒有建立文件系統)。如果有文件系統,刪除這個分區並重新建立一個空的分區。然後對其安全擦除,參見 Dm-crypt/Drive preparation#Secure erasure of the hard disk drive.

接下來建立包含加密容器的分區。

建立 LUKS 頭:

# cryptsetup options luksFormat device

device 替換成之前建立的分區。參見 Dm-crypt/Device encryption#Encryption options for LUKS mode 來知道 options 可以寫什麼。

為了對加密分區進行操作,用設備映射器來解鎖它:

# cryptsetup open device name

解鎖分區之後,它會被映射成塊設備 /dev/mapper/name,現在要建立文件系統

# mkfs.fstype /dev/mapper/name

把文件系統掛載到 /home;或者如果它是某個用戶專用的的話,掛載到 /home/username,參見 #手動掛載和卸載

提示:卸載並掛載一次來確定映射沒有問題。

手動掛載和卸載[編輯 | 編輯原始碼]

掛載分區:

# cryptsetup open device name
# mount -t fstype /dev/mapper/name /mnt/home

卸載:

# umount /mnt/home
# cryptsetup close name
提示:GVFS 也可以掛載加密分區。用支持 gvfs 的文件管理器(比如 Thunar)掛載該分區的時候,密碼對話框就會彈出來。對於其他桌面環境,zulucryptAUR 也提供了圖形界面。

自動解鎖並掛載[編輯 | 編輯原始碼]

有三種不同方法來進行自動化解鎖分區並掛載文件系統。

啟動時解鎖[編輯 | 編輯原始碼]

配置 /etc/crypttab 文件,systemd 的自動解析會在啟動過程中自動解鎖。如果home分區是所有用戶一起用的(或者要自動掛載其他加密塊設備),這種方法是最推薦使用的。

詳細的設置例子請參考 Dm-crypt/System configuration#crypttabDm-crypt/System configuration#Mounting at boot time

用戶登錄時解鎖[編輯 | 編輯原始碼]

如果整個分區都是某個用戶專用的 home 目錄,則推薦使用 pam-exec

使用 pam_mount

文件容器[編輯 | 編輯原始碼]

Cryptsetup 對設備進行操作,因此使用文件容器使需要一個 loop 設備。但是 cryptsetup 可以在後台負責管理 loop 設備(請見 Gentoo:Custom_Initramfs#Encrypted_keyfile),用戶不需要手動調用 losetup

首先,用 dd 創建一個加密容器,並使用一個恰當的隨機數生成器:

$ dd if=/dev/urandom of=bigsecret.img bs=100M count=1 iflag=fullblock

這會創建 100 MB 的 bigsecret.img 文件。

確保沒有忽略 iflag=fullblock 選項,否則 dd 可能只會返回部分讀取。詳情請見 dd#Partial read[損壞的連結:無效的章節]

要想避免之後必須調整容器大小,確保使其大於要加密的文件的總大小,加上內部文件系統/元數據開銷和 LUKS header。如果你要使用 LUKS 模式,僅其元數據 header 就需要多達 16MB。創建一個小於 LUKS header (16MiB) 的文件會在打開設備時報錯 Requested offset is beyond real size of device bigsecret.img

接下來的操作和#分區中所述的一樣,但是要將 device 替換為 bigsecret.img

cryptsetup 會在後台尋找一個可用的 loop 設備並且將文件附加到設備上。在卸載之後,文件容器應該相應地關閉,cryptsetup 之後會分離使用的 loop 設備。

提示:帶有 dm-crypt 加密的容器是非常靈活的。請看看功能特性和 Tomb 的文檔。它提供了一個 dm-crypt 的腳本包裝用於快速靈活的處理。

使用 losetup 手動掛載和卸載[編輯 | 編輯原始碼]

首先找到一個未使用的 loop 設備,手動掛載帶有 LUKS 加密和 ext4 文件系統的文件容器:

# losetup --find

然後將文件容器附加到 loop 設備,例如 loop0:

# losetup /dev/loop0 bigsecret.img
注意: 如果報錯 /dev/loop0: No such file or directory,你需要先以 root 用戶執行命令 modprobe loop 加載內核模塊。最近(Kernel 3.2) loop 設備是按需創建的。以 root 用戶執行 losetup -f 命令請求新的 loop 設備。

現在執行普通的 cryptsetup 操作:

# cryptsetup open /dev/loop0 secret
# mount -t ext4 /dev/mapper/secret /mnt/secret

以相反的順序執行以正確卸載容器:

 # umount /mnt/secret
 # cryptsetup close secret

要想分離使用的 loop 設備:

 # losetup --detach /dev/loop0