dm-crypt/准备磁盘
在加密一個驅動器前,建議先用隨機的數據將設備內容覆寫來安全地擦除磁碟內容。要想避免加密攻擊或不必要的文件恢復,寫入的數據最好與之後 dm-crypt 寫入的數據難以區分。關於更深入的討論,請見靜態數據加密#準備磁碟。
安全擦除驅動器數據[編輯 | 編輯原始碼]
在決定使用何種方式安全擦除驅動器數據時,記住:如果驅動器要持續地作為加密設備使用,這只需要執行一次。
- 繼續操作前,請檢查您的先進格式化設備是否採用最佳邏輯扇區大小。
- 在數 TB 的設備上,填充加密驅動器的過程可能需要耗費一整天。為了不讓機器在操作過程中無法使用,從已經安裝在另一個驅動器上的系統中執行此操作,比在 Arch 安裝用的 live 系統中執行此操作要好。
- 對於固態硬碟,要想儘量減少快閃記憶體的緩存,可以考慮按 固態硬碟記憶單元清理 中的 優先 節執行。
通用方案[編輯 | 編輯原始碼]
關於如何擦除並準備好驅動器的詳細指導,參考安全地擦除磁碟數據。
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 --sector-size 4096 /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 bs=1M
dd: writing to 『/dev/mapper/to_be_wiped』: No space left on device
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
對每個塊設備的分區和其中的文件系統都要重複一次以上操作。舉個例子,設置 LUKS 上的 LVM 時,對每個邏輯卷都要執行這個操作。
dm-crypt 在安裝後擦除可用空間(通過重新加密)[編輯 | 編輯原始碼]
作為替代,對於想要在不重新安裝的情況下完全擦除可用空間的用戶,可以通過重新加密 LUKS 設備來達成。需要在每個 LUKS 設備上執行一次。但是請注意這個過程可能很慢(在桌面 HDD 上大約 50MB/s)。
擦除 LUKS header[編輯 | 編輯原始碼]
使用 LUKS 的分區由兩部分組成:標頭和加密數據。標頭包含密鑰和加密參數,如果沒有這些密鑰和參數,幾乎不可能恢復數據。如果創建新分區或停用硬碟,只需刪除該部分而無需擦除整個設備。注意事項參見本小節末。
要想擦除所有密鑰,使用下列命令:
# cryptsetup erase device
通過以下命令確保沒有激活的密鑰槽:
# cryptsetup luksDump device
此外,通過在密鑰被擦除後調用 wipefs 可以移除 LUKS header 本身以避免 cryptsetup
之後檢測到它:
# wipefs -a device
加密數據保留在原位。截至2020年,沒有已知的實用方法解密這些數據,但是在未來可能會有所不同。由用戶來衡量安全,隱私與正確擦除整個設備的時間。
在某些存儲介質(尤其是快閃記憶體介質)上,可能無法可靠地覆蓋數據。帶有密鑰的 LUKS 標頭可能會保存在作業系統無法訪問的位置(如驅動器緩存)。如果擔心出現這種情況,則必須使用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 的需求。
Boot 分區 (GRUB)[編輯 | 編輯原始碼]
請見 dm-crypt/Encrypting an entire system#Encrypted boot partition (GRUB).