dm-crypt/加密非root文件系统
以下是一些用 dm-crypt 加密輔助(secondary)文件系統(即,非根文件系統)的例子。
加密輔助文件系統不會對作業系統、程序文件進行加密,因此通常只用於單獨保護敏感數據。對於USB驅動器等外部介質,進行加密可確保在不同計算機上使用時,數據安全不受威脅。此外,也可按照數據訪問人員將數據分類,分別使用不同的密鑰加密。
dm-crypt 是塊級別加密層,其將加密整個塊設備(例如,分區和迴環設備)。
若要加密單個文件,需要使用文件系統層級的加密。例如使用eCryptfs 或 EncFS。有關保護隱私數據的更多信息,參見靜態數據加密。
本例介紹的是對 /home 分區的加密,但相關方法也可以應用到其它包含用戶數據的非根分區。
/home目錄單獨分配一個分區,也可以所有用戶的/home目錄共享一個分區。下文假定用於/home目錄的分區已經創建。若該分區曾用於其它用途,因而包含了數據,可能需要使用dm-crypt專用方案安全擦除分區。注意,只擦除一個分區,而不擦除整個磁碟,可能仍會洩露一些數據。
建立 LUKS 頭:
# cryptsetup options luksFormat device
device應對應已創建的分區。options的取值參見Dm-crypt/設備加密#LUKS_模式的加密選項。
使用設備映射器對設備進行解密,以對加密的分區進行操作:
# cryptsetup open device name
分區解密之後,會被映射成塊設備 /dev/mapper/name。之後,建立文件系統:
# mkfs.fstype /dev/mapper/name
若所有用戶共享/home目錄,則可將創建好的文件系統掛載到/home;若該文件系統是某個用戶專用的,則掛載到/home/username。參見 #手動掛載和卸載。
掛載分區:
# cryptsetup open device name # mount /dev/mapper/name /mnt/home
卸載:
# umount /mnt/home # cryptsetup close name
有三種不同方法來自動化解鎖分區並掛載文件系統。
配置 /etc/crypttab 文件,systemd會在系統啟動過程中自動解析該文件,並以此解密相應設備。若要掛載所有用戶共用的home分區,或要自動掛載其它加密的塊設備,推薦使用本方法。
可參考Dm-crypt/系統配置#crypttab。此外,Dm-crypt/系統配置#在啟動時掛載中提供了示例配置。
Cryptsetup 對設備進行操作。因此,若要使用文件容器,需要配置迴環設備。好在,在後台,cryptsetup可自動管理迴環設備(請見 Gentoo:Custom_Initramfs#Encrypted_keyfile),無需手動調用 losetup。
$ dd if=/dev/urandom of=bigsecret.img bs=100M count=1 iflag=fullblock
這會創建大小為 100 MiB 的 bigsecret.img 文件。
注意,不要遺漏iflag=fullblock選項。否則,可能出現「部分讀」問題。詳見dd#Partial_read:_copied_data_is_smaller_than_requested。
要避免之後調整容器大小的麻煩,在創建文件容器時,確保其大小大於要加密的文件的總大小、文件系統內部數據/元數據開銷和LUKS頭的總和。若使用LUKS,則僅其元數據就可能需要多達16MiB的空間。創建一個小於 LUKS頭(16MiB)大小的文件容器會在打開設備時報錯Requested offset is beyond real size of device bigsecret.img。
之後的操作和#分區中的相同,但要將 device 替換為 bigsecret.img。
cryptsetup 會自動尋找可用的迴環設備設備並將文件附加到設備上。在卸載之後,文件容器應該相應地關閉,cryptsetup之後會分離使用的迴環設備。
首先,查找未使用的迴環設備:
# losetup --find
然後,將文件容器附加到迴環設備,例如,要附加到loop0:
# losetup /dev/loop0 bigsecret.img
/dev/loop0: No such file or directory錯誤,需要先以 root 用戶執行命令modprobe loop以加載內核模塊。較新的內核中(內核版本3.2及更高),迴環設備是按需創建的。可通過以 root 用戶執行 losetup -f 命令請求創建新的迴環設備。之後,按照常規方式進行cryptsetup設置即可:
# cryptsetup open /dev/loop0 secret # mount -t ext4 /dev/mapper/secret /mnt/secret
卸載容器時,需要以相反的順序執行對應的操作:
# umount /mnt/secret # cryptsetup close secret
若要分離使用的迴環設備:
# losetup --detach /dev/loop0