如何在現有的 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 映射,該映射會在每次啟動時安全地重新建立。

留下評論

修正 SLES 系統升級期間出現的「無法分配記憶體」錯誤

修正 SLES 系統升級期間出現的「無法分配記憶體」錯誤

排查 SLES 升級過程中出現的「無法分配記憶體」問題。檢查 RAM、交換空間、OOM 日誌和進程限制,然後在不中斷軟體包事務的情況下進行復原。

修復 Harmonica OS 平板電腦的觸控螢幕校準問題:選擇合適的 Linux 修復方案

修復 Harmonica OS 平板電腦的觸控螢幕校準問題:選擇合適的 Linux 修復方案

追蹤 Harmonica OS (HamoniKR) 平板電腦的觸控偏移、旋轉和顯示對映問題。比較 X.Org 和 libinput 的修復方案,安全地進行測試,並了解何時校準無效。

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

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

使用 dm-crypt 對現有的 Debian 12 交換分割區進行加密,每次啟動時使用新的隨機金鑰,並設定 /etc/crypttab、/etc/fstab 和安全驗證步驟。

如何透過電子郵件警報監控Ubuntu上的SMART硬碟健康狀況

如何透過電子郵件警報監控Ubuntu上的SMART硬碟健康狀況

在 Ubuntu 系統上安裝 smartmontools,用於監控硬碟健康狀況並發送 SMART 郵件警報。檢查設備支援狀況、設定郵件發送、測試通知功能並檢查故障。

修正在 UEFI 系統上安裝 Debian 後出現的「找不到可啟動裝置」錯誤

修正在 UEFI 系統上安裝 Debian 後出現的「找不到可啟動裝置」錯誤

透過檢查安裝程式啟動模式、EFI 系統分割區、NVRAM 條目、GRUB EFI 檔案、安全啟動和韌體回退來修復 Debian UEFI 啟動失敗。

如何在 Ubuntu 桌面系統上設定 Btrfs 自動快照

如何在 Ubuntu 桌面系統上設定 Btrfs 自動快照

配置 Snapper 以在 Ubuntu 桌面上建立和清理定時產生的 Btrfs 快照。首先檢查子磁碟區佈局,啟用 systemd 定時器,並安全地驗證保留策略。

安全修復 SUSE Linux Enterprise LVM 精簡配置空間不足的問題

安全修復 SUSE Linux Enterprise LVM 精簡配置空間不足的問題

透過區分資料耗盡和元資料耗盡、擴展儲存、修復元資料和啟用自動擴展,診斷和恢復 SUSE Linux Enterprise 上的完整 LVM 精簡池。

Debian 12 CIS 加固指南:伺服器基線逐步指南

Debian 12 CIS 加固指南:伺服器基線逐步指南

使用安全的伺服器工作流程(包括更新、SSH、防火牆、AppArmor、稽核和驗證),對 Debian 12 Bookworm 進行強化,使其符合目前的 CIS 基準 v2.0.0 標準。

如何在 Gooroom OS 上安裝 Flatpak 和 Snap 應用

如何在 Gooroom OS 上安裝 Flatpak 和 Snap 應用

在 Gooroom OS 上安裝 Flatpak 和 Snap 應用,包括版本檢查、終端命令以及相容性、安全控制、更新和儲存的實際比較。

如何修正 GPG 錯誤:Ubuntu 中無法驗證以下簽名

如何修正 GPG 錯誤:Ubuntu 中無法驗證以下簽名

安全地修復 Ubuntu APT 簽章錯誤。無需停用軟體包驗證,即可識別 NO_​​PUBKEY、EXPKEYSIG、BADSIG、時脈和軟體來源設定問題。