如何在現有的 Debian 12 系統上設定加密的交換分割區

在現有的 Debian 12 系統上加密交換分割區,對於防止記憶體頁、密碼、文件片段和其他臨時資料以明文形式寫入磁碟來說非常值得。對於不需要休眠的機器,Debian 文件中提供了一個簡單的設計方案:將交換分割區置於明文 dm-crypt 加密之後,並在每次啟動時產生新的隨機加密金鑰。

本指南採用這種設計。它假定係統為 Debian 12 “bookworm”,並已配置一個專用交換分區,並使用 systemd 作為初始化系統。命令範例刻意採用保守策略,因為區塊裝置路徑的錯誤可能會導致覆蓋錯誤的分割區。請先仔細閱讀決策點,然後替換為您自己的裝置標識符,而不是盲目複製範例值。

/etc/crypttabDebian 的 cryptsetup 文件專門介紹了加密交換分區,並建議先停用交換分區,然後使用 `cryptsetup` 命令將分區添加到 `dm-crypt` 目錄中/dev/urandom,切換/etc/fstab到映射的設備,最後重新啟用交換分區。請參閱Debian cryptsetup 的 README 檔案。 Debian 12 的crypttab(5) 手冊也記錄了 crypttab 欄位和普通的 dm-crypt 選項。

是否應該使用隨機密鑰加密交換?

當您需要加密交換分割區且不需要休眠功能時,請使用此功能。密鑰會在每次啟動時重新生成,因此關機後舊的交換分區內容將無法讀取。這正是大多數桌面和伺服器系統所需的安全性。

如果您依賴休眠、掛起到磁碟、混合睡眠或先掛後休眠等機制,請勿使用此配置。恢復操作需要下次啟動時解密相同的休眠鏡像。而使用新的隨機密鑰會使此操作無法實現。 Debian 明確指出,隨機密鑰交換不能用作恢復設備。 Debian 12 的systemd hibernate-resume 文件也表明,恢復操作依賴於持久性恢復設備。

如果需要休眠功能,請使用持久加密方案,例如採用 LUKS 協定的交換設備,並配備相應的解鎖和恢復配置。這是一種不同的設置,因此不在本指南的討論範圍之內。

你的交換空間是否已經受到磁碟加密保護?

在進行任何更改之前,請務必先進行檢查。如果您的交換邏輯磁碟區已經位於 LUKS 加密容器內,那麼新增另一個 dm-crypt 層可能幾乎沒有實際意義,反而會增加複雜性。

swapon --show
lsblk -o NAME,PATH,TYPE,FSTYPE,SIZE,MOUNTPOINTS,PARTUUID

查看設備swapon --show並追蹤其父設備lsblk。常見的未加密佈局可能/dev/sda3直接顯示為類型swap。而加密的 LVM 安裝則可能在crypto_LUKS父設備下顯示交換分割區。

Debian 12 終端示意圖,顯示了現有交換分區及其 PARTUUID 的 swapon、lsblk 和 blkid 輸出。
在進行任何變更之前,請先確定活動交換分區和穩定分區識別碼。此處顯示的設備名稱和識別碼僅為範例。

區分這一點很重要,因為本文討論的是轉換未加密的專用交換分割區。如果swapon --show報告的是交換文件,請使用針對交換文件的特定步驟。如果交換分割區已位於加密儲存中,請先確定是否真的需要第二層加密。

關閉交換分區前應該記錄哪些內容?

記錄分割區的確切路徑、大小和PARTUUID。 PARTUUID用於識別分割表條目,即使分割區內的交換簽章被加密資料取代後,PARTUUID 仍然有效。

例如:

sudo blkid /dev/sda3
ls -l /dev/disk/by-partuuid/

您可能會看到包含如下值的輸出:

PARTUUID="11111111-2222-3333-4444-555555555555"

在以下範例中,對應的穩定路徑為:

/dev/disk/by-partuuid/11111111-2222-3333-4444-555555555555

避免依賴/dev/sda3磁碟枚舉結果,因為磁碟枚舉結果可能會變更。此外,也避免使用舊的交換檔案系統 UUID 作為長期來源識別碼:加密交換設定會在映射的加密裝置上重新建立交換簽名,因此舊的原始交換 UUID 不再是底層分割區的正確持久標識。

1. 如何安全地準備該系統?

如果尚未安裝 cryptsetup,請先安裝它,然後備份您將要編輯的兩個設定檔。

sudo apt update
sudo apt install cryptsetup
sudo cp -a /etc/crypttab /etc/crypttab.before-encrypted-swap 2>/dev/null || true
sudo cp -a /etc/fstab /etc/fstab.before-encrypted-swap

如果/etc/crypttab尚不存在,那也沒關係;在編輯配置時建立它。

接下來,確保系統在停用交換分區的短暫時間內有足夠的可用記憶體。然後,僅關閉要轉換的交換分割區。使用同一台設備比在swapoff -a具有多個交換區域的電腦上更安全:

sudo swapoff /dev/sda3
swapon --show
Debian 12 終端機示意圖,顯示已停用交換分割區並正在安裝 cryptsetup 軟體包。
在對目標交換分割區進行加密之前,請先將其停用。在具有多個交換分割區的系統中,請僅對目標交換分割區進行操作,而不是不必要地停用所有交換分割區。

mkswap此後請勿在原始分割區上執行任何操作。交換簽名應在加密的映射器設備上創建,而不是在未加密的底層分區上創建。

2. /etc/crypttab 檔案中應該包含哪些內容?

建立或編輯/etc/crypttab並新增一個加密交換映射條目。以下內容遵循 Debian cryptsetup 文件:

cswap /dev/disk/by-partuuid/11111111-2222-3333-4444-555555555555 /dev/urandom plain,cipher=aes-xts-plain64,size=256,swap

將範例中的 PARTUUID 替換為您系統中的 PARTUUID。

這些字段的含義是:

  • cswap是映射器名稱,正在建立/dev/mapper/cswap。
  • 第二個欄位是實際的底層交換分區。
  • /dev/urandom每次建立映射時都會提供一個新的隨機密鑰。
  • plain選擇普通的 dm-crypt 而不是持久的 LUKS 標頭。
  • cipher=aes-xts-plain64,size=256明確指定 plain-dm-crypt 參數,而不是依賴可能會改變的預設值。
  • swap告訴 cryptsetup 集成,此映射設備是交換設備,應該進行適當的初始化。
使用 GNU nano 在 Debian 12 上編輯 /etc/crypttab 文件,新增一個 cswap 映射,該映射使用穩定的 PARTUUID 路徑和 /dev/urandom。
crypttab 條目會在每次啟動時使用來自 /dev/urandom 的新金鑰建立一個名為 cswap 的暫時加密對應。

Debian 的 crypttab 手冊警告說,與 LUKS 不同,普通的 dm-crypt 不會在頭部儲存密碼、雜湊或金鑰長度等元資料。因此,明確記錄密碼和密鑰長度非常有用。手冊也記錄了discard安全隱患,但同時也指出了這一點;除非您已經評估過這種權衡,否則不要僅僅因為後端設備是 SSD 就添加此功能。

3. /etc/fstab 檔案做了哪些更改?

找到舊的未加密交換行/etc/fstab。它可能使用 UUID、裝置路徑或其他持久性識別碼。例如:

UUID=OLD-SWAP-UUID none swap sw 0 0

將其替換為已映射的加密設備:

/dev/mapper/cswap none swap sw 0 0

不要同時啟用這兩個分區。如果原始分割區和/dev/mapper/cswap交換分割區都啟用,則會失去加密分割區的意義,並可能導致啟動時分割區啟動混亂。

Debian 12 上的 GNU nano 圖示顯示了 /etc/fstab 文件,其中舊的原始交換分區條目已被停用,而 /dev/mapper/cswap 配置為交換分區。
fstab 應該指向加密的映射器設備,而不是原始的原始交換分區。

Debian 的fstab(5) 手冊定義了交換條目格式,而swapon(8)解釋如何啟動標記為交換的條目。

4. 重啟前如何啟動並驗證?

儲存這兩個檔案後,啟動加密映射,然後啟用交換分割區。 Debian 的 cryptsetup 文件使用了以下方法:

sudo cryptdisks_start cswap
sudo swapon -a

現在驗證所有三層:

swapon --show
sudo cryptsetup status cswap
lsblk -o NAME,TYPE,FSTYPE,SIZE,MOUNTPOINTS

正常情況下,交換分割區應該顯示在目標分割區上/dev/mapper/cswap,而不是直接顯示在原始分割區上。cryptsetup status cswap映射應該顯示為活動狀態。

如果cryptdisks_start您的系統安裝中缺少該軟體包,請勿隨意執行破壞性命令。請重新檢查該cryptsetup軟體包是否已安裝以及 crypttab 語法是否有效。您也可以在完成以下復原配置後,讓正常的 Debian 啟動程序建立對應。 Debian 12 使用 systemd 產生器將 crypttab 和 fstab 設定轉換為啟動時單元。

5. 您是否需要停用休眠恢復功能?

是的,如果該分割區配置為系統的復原設備。隨機密鑰無法解密使用先前密鑰寫入的休眠鏡像。 Debian 的加密交換分割區指令明確告知管理員,在將舊的復原交換分割區轉換為隨機金鑰加密交換分割區時,應停用復原功能。

檢查當前配置:

grep -R "^[[:space:]]*RESUME=" /etc/initramfs-tools/conf.d/ 2>/dev/null

如果它指的是您剛剛轉換的交換分區,請將 resume 設定為 none:

echo "RESUME=none" | sudo tee /etc/initramfs-tools/conf.d/resume
sudo update-initramfs -u

這裡就體現了這一點的update-initramfs -u重要性。僅僅因為啟動後交換分割區條目發生了變化,並不需要重建 initramfs;但當移除 initramfs 可能嘗試使用的舊的休眠復原目標時,則需要更新 initramfs。

重啟測試:如何證明設定有效?

只有在即時啟動成功且設定檔正確無誤後才重新啟動:

sudo reboot

系統恢復後,運作:

swapon --show
sudo cryptsetup status cswap
lsblk -o NAME,TYPE,FSTYPE,SIZE,MOUNTPOINTS
cat /proc/swaps

關鍵成功標準很簡單:

  • /dev/mapper/cswap已啟動為交換空間。
  • 原始備份分割區未直接列為活動交換分割區。
  • cryptsetup status cswap報告存在活躍的純 dm-crypt 映射。
  • 機器啟動時無需輸入交換密碼;隨機金鑰會自動產生。

您也可以重啟兩次並比較映射行為。這種設計的關鍵在於加密金鑰是臨時的;重新建立映射後,上次啟動的交換分區內容將無法恢復。

如果機器進入緊急模式怎麼辦?

最常見的原因是備份設備路徑錯誤、設定檔中存在拼字錯誤/etc/crypttab,或/etc/fstab存在指向舊原始交換分割區的行。啟動至復原模式或使用救援環境,以讀寫權限掛載根檔案系統,並在必要時恢復備份。

有用的檢查項目包括:

sudo cryptsetup status cswap
systemctl status systemd-cryptsetup@cswap.service
systemctl status dev-mapper-cswap.swap
journalctl -b -u systemd-cryptsetup@cswap.service

對於不常見的映射器名稱,單元名稱可能會採用不同的轉義方式,因此systemctl list-units '*cryptsetup*'如果確切的服務名稱不明顯,請使用這種方式。

如果丟棄SSD固態硬碟呢?

不要為了追求理論上的 SSD 效能而預設啟用 discard 功能。 Debian 的 crypttab 文件指出,透過加密裝置傳遞 discard 請求會帶來安全隱患。 Debian 的 swapon 手冊也類似地指出,discard 功能可能會在某些 SSD 上提升效能,但通常不會。如果確實需要啟用,請先評估您的儲存模型和威脅模型,然後再謹慎地啟用它。

如果根檔案系統未加密,加密交換分割區還有用嗎?

是的,但要了解其邊界。加密交換分區保護寫入交換分區的記憶體頁。它不會加密保存在未加密的根檔案系統或使用者主檔案系統上的檔案、shell 歷史記錄、應用程式快取、崩潰轉儲、臨時檔案或日誌。如果目標是全面防止磁碟被盜導致資料洩露,那麼全碟加密或檔案系統加密才是更徹底的控制方案。

最終檢查清單

  • 確認目標是專用的未加密交換分區,而不是交換文件,並且尚未受到加密父設備的保護。
  • 記錄一個穩定的分區路徑,例如/dev/disk/by-partuuid/...:
  • 在配置 dm-crypt 之前,請停用原始交換。
  • 向 . 新增一個 random-key plain-dm-crypt 條目/etc/crypttab。
  • /etc/fstab僅指向/dev/mapper/cswap。
  • 重啟前請啟動映射並進行驗證。
  • 如果舊的交換分區是恢復設備,則設定RESUME=none並運行update-initramfs -u。
  • 重新啟動後,確認只有加密映射器作為交換分割區處於活動狀態。

對於不支援休眠的 Debian 12 系統,這種方法可以保持配置簡潔,並避免儲存持久交換金鑰。關鍵決策並非“我應該運行哪個加密命令?”,而是隨機金鑰交換是否符合您的電源管理要求。一旦確定了這一點,剩下的就是將原始交換分區受控遷移到 dm-crypt 映射,該映射會在每次啟動時安全地重新建立。

留下評論

如何在Linux系統上使用Cameractrls更改網路攝影機設置

如何在Linux系統上使用Cameractrls更改網路攝影機設置

使用 Cameractrls 在 Linux 上變更網路攝影機設定:調整曝光、色彩、減少閃爍和其他支援的控件,然後檢查相容的視訊模式。

如何在 Linux 上安裝 PhpStorm:工具箱、Tar.gz、Snap 和 AUR

如何在 Linux 上安裝 PhpStorm:工具箱、Tar.gz、Snap 和 AUR

在 Linux 系統上,您可以使用 JetBrains Toolbox 或獨立的 tar.gz 壓縮套件安裝 PhpStorm,此外還有 Snap 和 Arch AUR 版本可供選擇。 Java 已預先安裝。

如何在 Linux 系統上將 CD-ROM 備份為 ISO 文件

如何在 Linux 系統上將 CD-ROM 備份為 ISO 文件

在 Linux 上使用 GNOME Disks 或 dd 建立 CD-ROM ISO。識別光碟機,監控複製過程,驗證鏡像,並了解何時損壞的光碟或音訊光碟需要其他工具。

如何在 XFCE 4 上設定雙面板

如何在 XFCE 4 上設定雙面板

為每個顯示器建立一個單獨的 XFCE 4 面板,將第二個面板指派給正確的輸出,調整其位置和大小,並新增所需的啟動器和狀態項目。

如何在Linux上安裝Cisco Packet Tracer

如何在Linux上安裝Cisco Packet Tracer

下載適用於 Ubuntu 64 位元系統的 Cisco Packet Tracer 9.0.1,使用 APT 安裝 DEB 軟體包,在終端機中接受許可協議,然後登入以啟動實驗環境。

如何在Linux系統下使用GIMP摳圖

如何在Linux系統下使用GIMP摳圖

在 Linux 系統上使用 GIMP 去除照片背景:描繪主體,刪除選定的背景,保持透明度,並匯出可重複使用的 PNG 檔案。

免費下載 FlightGear:官方安裝指南

免費下載 FlightGear:官方安裝指南

從官方網站免費下載 FlightGear。比較 Windows、macOS 和 Linux 版本的軟體包,安裝資料文件,即可開始您的首次飛行。

Google Tasks桌面應用程式:如何在電腦上使用

Google Tasks桌面應用程式:如何在電腦上使用

在瀏覽器中開啟 Google Tasks,新增 Chrome 捷徑或應用程式啟動,並透過行事曆和 Gmail 管理有日期的待辦事項。

OKSampler:一款免費、簡單的鍵盤節拍音樂採樣器

OKSampler:一款免費、簡單的鍵盤節拍音樂採樣器

OKSampler 可以將 MP3 片段對應到鍵盤按鍵,並支援音訊循環播放。了解這款經典免費軟體的功能、其舊功能的缺失以及下載前需要檢查的事項。

如何在 Linux 系統上安裝 Wireshark:Ubuntu、Fedora、Arch 等

如何在 Linux 系統上安裝 Wireshark:Ubuntu、Fedora、Arch 等

使用目前軟體包命令在 Ubuntu、Debian、Fedora、Arch 或 openSUSE 上安裝 Wireshark,然後安全地配置即時資料包擷取。