dm-crypt/准备磁盘
在加密一個驅動器前,建議先用隨機的數據將磁盤內容覆寫來安全地擦除磁盤內容。要想避免加密攻擊或不必要的文件恢復,寫入的數據最好與之後 dm-crypt 寫入的數據難以區分。關於更深入的討論,請見靜態數據加密#準備磁盤。
安全擦除硬盤驅動器數據[編輯 | 編輯原始碼]
在決定使用何種方式安全擦除硬盤驅動器數據時,記住如果驅動器作為加密驅動器使用,這只需要執行一次。
- 在數 TB 的磁盤上,填充加密驅動器的過程可能需要耗費一整天。為了不讓機器在操作過程中無法使用,從已經安裝在另一個驅動器上的系統中執行此操作,比在 Arch 安裝用的 live 系統中執行此操作要好。
- 對於固態硬盤,要想儘量減少閃存的 cache artifacts,可以考慮按 固態硬盤記憶單元清理 中的 prior 節執行。
通用方案[編輯 | 編輯原始碼]
關於如何擦除並準備好驅動器的詳細指導,參考 安全地擦除磁盤數據 。
dm-crypt 專用方案[編輯 | 編輯原始碼]
下面兩個方案專門用於 dm-crypt ,之所以提到它們是因為它們很快而且可以在分區設置後執行。
cryptsetup 常見疑問(item 2.19 "How can I wipe a device with crypto-grade randomness?")提到了一個非常簡單的操作可以使用一個已存在的 dm-crypt 卷,像一個簡單的偽隨機數生成器生成隨機數據來擦除一個底層塊設備上所有可訪問的空閒空間。而且據說這可以避免使用方式的暴露。這是因為加密數據實際上與隨機數據難以區分。
dm-crypt 擦除空磁盤或分區[編輯 | 編輯原始碼]
首先,在待加密分區(使用 sdXY
的格式)裡或在待加密的整個設備(使用 sdX
的格式)創建一個臨時的加密容器。將使用的密鑰從標準 aes-cbc 更改為 aes-xts 可能更好,因為它可能有顯著的速度優勢(通過 cryptsetup benchmark
檢查):
# cryptsetup open --type plain -d /dev/urandom /dev/<block-device> to_be_wiped
你可以驗證一下它是否存在:
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 1.8T 0 disk └─to_be_wiped 252:0 0 1.8T 0 crypt
用0擦除容器。不需要使用 if=/dev/urandom
因為加密密鑰已經將數據變成隨機的了。
# dd if=/dev/zero of=/dev/mapper/to_be_wiped status=progress
dd: writing to 『/dev/mapper/to_be_wiped』: No space left on device
- 使用帶用
bs=
參數的 dd 命令,例如bs=1M
,在增加操作的磁盤數據吞吐量時很常用。 - 要想對操作進行檢查,在創建擦除容器前將分區清零。在執行擦除命令後
blockdev --getsize64 /dev/mapper/container
可以作為 root 獲取準確的容器大小。在容器被關閉後 od 可以用於檢查擦除操作是否覆蓋了被清零的分區。舉個例子,執行命令# od -j $((containersize - blocksize)) /dev/nvme0n1
來從頭至尾檢查擦除是否執行。
最後,關閉臨時的容器:
# cryptsetup close to_be_wiped
在加密整個系統時,下一步是#分區。如果只是加密一個分區,繼續按照加密非 root 文件系統#分區執行。
dm-crypt 在安裝後擦除可用空間[編輯 | 編輯原始碼]
在安裝前沒時間執行擦除步驟的用戶,即使在加密系統已啟動,文件系統已掛載的情況下也可以做到類似的效果。但請注意相關文件系統是否有保留空間,例如,對於 root 用戶,或即使是 root 用戶執行的擦除操作也會被限制的其他磁盤配額機制:底層塊設備的一些部分可能完全不會寫入。
要想執行擦除操作,通過在加密容器寫入一個文件來臨時填充分區的剩餘可用空間:
# dd if=/dev/zero of=/file/in/container status=progress
dd: writing to 『/file/in/container』: No space left on device
緩存同步到磁盤,然後刪除文件來回收可用空間。
# sync # rm /file/in/container
對每個塊設備的分區和其中的文件系統都要重複一次以上操作。舉個例子,設置 LVM on LUKS 時,對每個邏輯卷都要執行這個操作。
dm-crypt 在安裝後擦除可用空間(通過重新加密)[編輯 | 編輯原始碼]
作為替代,對於想要在不重新安裝的情況下完全擦除可用空間的用戶,可以通過重新加密 LUKS 設備來達成。需要在每個 LUKS 設備上執行一次。但是請注意這個過程可能很慢(在桌面 HDD 上大約 50MB/s)。
擦除 LUKS header[編輯 | 編輯原始碼]
Wipe LUKS header[編輯 | 編輯原始碼]
使用 LUKS 的分區包括兩個部分: header 和加密數據。header 包含密鑰,沒有這些密鑰幾乎不可能恢復數據。創建一個新分區或停用驅動器可能足夠在不擦除整個設備的情況下去除那個部分。有關注意事項,請參閱本節底部的注釋。
要想擦除所有密鑰,使用下列命令:
# cryptsetup erase device
通過以下命令確保沒有激活的密鑰槽:
# cryptsetup luksDump device
此外,通過在密鑰被擦除後調用 wipefs 可以移除 LUKS header 本身以避免 cryptsetup
之後檢測到它:
# wipefs -a device
加密數據保留在原味,其保護也只有使用的加密。截至2020年,沒有已知的實用方法訪問這些數據,但是在未來可能會有所不同。由用戶來衡量安全,隱私與正確擦除整個磁盤的時間。
在一些存儲介質上,尤其是基於閃存的,可能無法可靠地覆寫數據。帶有密鑰的 LUKS header 可能保留在操作系統無法訪問的位置。如果擔心這個,必須使用 ATA 安全擦除。這個操作將會擦除設備上的所有塊,包括軟件不可見的。詳情請見 cryptsetup FAQ 5.19。
分區[編輯 | 編輯原始碼]
這一節只有在加密整個系統才需要。在驅動器被安全地覆寫後,必須慎重地選擇一個恰當的分區方案,考慮到 dm-crypt 的要求,以及各種選擇對最終系統管理的影響。
值得注意的是,從現在起在幾乎所有情況下都必須有一個用於 /boot
的單獨保持未加密分區,因為引導加載器需要訪問用於加載 initramfs/encryption 模塊的 /boot
路徑,以此加載剩餘的系統(詳情請見 mkinitcpio)。如果這會產生安全問題,請見 dm-crypt/Specialties#保護未加密的 boot 分區 。
另一個需要考慮的重要因素是如何處理交換區和系統暫停,請見 dm-crypt/Swap 加密 。
物理分區[編輯 | 編輯原始碼]
在最簡單的情況下,加密層可以直接基於物理分區;對於如何創建物理分區,請見分區。就像在未加密系統中,一個 root 分區就足夠了,此外還需要一個上述的 /boot
分區。使用這個方法可以選擇哪些分區加密,哪些分區不加密,無論涉及的磁盤數量多少,都可以正常工作。之後還可以添加或移除分區,但是調整分區的大小會被分區所基於的磁盤限制。最後請注意每個加密分區的開啟都需要單獨的密鑰,即使這可以通過使用 crypttab
文件在啟動時自動化,請見 Dm-crypt/System configuration#crypttab。
堆疊塊設備[編輯 | 編輯原始碼]
如果需要更高的靈活性,dm-crypt 可以和其他例如 LVM 和 RAID的堆疊塊設備共存。加密容器可以位於其他堆疊塊設備的之下或基於其他堆疊塊設備上:
- 如果 LVM/RAID 設備創建在加密層上,那麼在同一加密分區中可以自由地添加,移除文件系統和調整文件系統大小,所有的存儲設備都只需要一個密鑰或密碼。因為加密層基於物理分區,但是這樣就不能使用 LVM 和 RAID 跨越多個磁盤的能力。
- 如果加密層創建在 LVM/RAID 設備上,它之後依然有可能重組文件系統,但是複雜性會提高,因為加密層需要相應地調整。而且,每個加密設備的打開都需要一個密鑰或密碼。不過這是在跨越多個磁盤上創建加密文件系統的唯一選擇。
Btrfs 子卷[編輯 | 編輯原始碼]
Btrfs 的內建子卷功能可以和 dm-crypt 一起使用,如果不需要其他文件系統,則完全取代對 LVM 的需求。但請注意在 linux 5.0 之前的版本, swap 文件是不支持的。所以如果想在版本小於 5.0 的 linux 內核中使用 swap,就需要一個 加密 swap 分區 。另見 Dm-crypt/Encrypting an entire system#Btrfs subvolumes with swap。
Boot 分區 (GRUB)[編輯 | 編輯原始碼]
請見 dm-crypt/Encrypting an entire system#Encrypted boot partition (GRUB).