dm-crypt/加密非root文件系统
以下是一些用 dm-crypt 加密輔助文件系統(例如非 root 文件系統)的例子。
總覽[編輯 | 編輯原始碼]
在不加密作業系統和程序文件時加密輔助文件系統,通常只用於保護敏感數據。這對於加密外部介質很有用,例如 USB 驅動器,從而使它可以安全地在不同電腦使用。也可以根據誰有權限訪問數據單獨加密數據集。
因為 dm-crypt 是一個塊級別加密層,它加密整個塊設備,分區和loop 設備。加密文件系統級加密層的單文件,例如 eCryptfs 或 EncFS。請見靜態數據加密獲取有關保護私隱數據的通用建議。
分區[編輯 | 編輯原始碼]
這個例子說的是對 /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
自動解鎖並掛載[編輯 | 編輯原始碼]
有三種不同方法來進行自動化解鎖分區並掛載文件系統。
啟動時解鎖[編輯 | 編輯原始碼]
配置 /etc/crypttab
文件,systemd 的自動解析會在啟動過程中自動解鎖。如果home分區是所有用戶一起用的(或者要自動掛載其他加密塊設備),這種方法是最推薦使用的。
詳細的設置例子請參考 Dm-crypt/System configuration#crypttab 和 Dm-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 設備。
使用 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