前言#
自從發現自己隨時可能被中華人民共和國人民警察們搜查以來,我的加密偏執就復發了。我決定用 LUKS2 和 YubiKey 武裝我的電腦。可能的話,我還要把這枚 YubiKey 改造成易於摧毀。
不過,配置環境起碼要兩天左右,我手頭上的事太多了,中間還有一個半月在醫院度過,因此遲遲沒有動手。4 個月後,我終於有時間了。於是開幹。
準備工作#
我閱讀了幾篇文章:
結合兩者優劣,得出了自己的方案。事先在虛擬機裡嘗試了兩遍,最終得到了比較滿意的結果。
方案介紹#
本方案會使用 LUKS2 加密 EFI 分區以外的整個硬碟,使用 Unified Kernel Image 引導。引導 + 系統啟動只需要輸入一次密碼(使用 YubiKey 則可配置為不需要密碼,也可配置為 2FA)。EFI 分區中會存在一個 main.efi,裡面包含了 initramfs、microcode 和 kernel。會使用 sbctl 對它們進行簽名,從而支持 Secure Boot,最後,配置 YubiKey 用於解密 LUKS2。
本方案會使用 linux-zen 而非 linux 內核。
本方案不會使用 TPM。TPM 配置不當可能導致你的加密功虧一簣。1如確有需要,可參考 “準備工作” 一節中的第二篇文章。
儘管我會加入很多可能不必要的細節,但這只是因為我的神經多樣性,本文的性質仍然是筆記 / 手稿,不是操作說明。本文中的命令僅作示意,實際操作過程中可能會有所不同。
本文作於 2024 年 2 月 10 日。你閱讀這篇文章時,內容可能已經過時。我並不具備足夠的安全知識,本文的操作無法確保安全。
安裝系統#
此時你的 Secure Boot 應該在關閉狀態。我覺得不會有誰想在安裝系統時開啟 Secure Boot。
首先,遵循安裝指南,至安裝指南 #建立硬碟分區為止。
第一個分區會作為 EFI 分區,分 1G 或者 0.5G 即可,後續 UKI 會佔用~100MB。
剩下的空間全分給第二個分區,這將是你的加密分區。不再分一個 Swap 分區的原因是當前 btrfs 已經支持 swapfile,並且我 RAM 充足。
創建、掛載、格式化 LUKS2 容器,默認設置已經基本滿足需求:
cryptsetup luksFormat /dev/nvme0n1p2 時,會提示你輸入密碼。這時可以設置一個安裝時臨時使用的密碼,配置完 YubiKey 後再改。
臨時掛載 btrfs 根,創建 subvolume(子卷):
具體建多少子卷,建哪些,見仁見智。
然後,卸載根、掛載子卷和 ESP 分區:
設置鏡像站,安裝系統並 chroot:
此後,遵循安裝指南 #配置系統,對系統進行配置。配置好以後,別急著 umount 和重啟。你需要配置引導。
將它的 HOOKS 一欄配置為如下形式:
先不加入 plymouth 和 配置 ykfde(YubiKey),等引導成功後再加入。
創建 /etc/kernel/cmdline,寫入:
這將是你的內核參數,以後需要配置內核參數的話就改這裡。sbctl 會自動配置好 microcode。安裝 intel-ucode 或 amd-ucode 即可,無需額外在參數裡加上。
創建 /etc/crypttab.initramfs,寫入:
這一步是讓 initramfs 啟動時解密位於 /dev/nvme0n1p2 的 LUKS2 容器,並掛載到 /dev/mapper/system。
創建或編輯 /etc/vconsole.conf:
這將能解決 mkinitcpio 時的警告。
創建密鑰並生成 Unified Kernel Image,加入引導:
這次應該能啟動進入系統。啟動過程中會要求你輸入此前 cryptsetup luksFormat 時設置的密碼。
進入系統後,可以遵循如下步驟連接到無線網絡:
設置 NTP:
配置 YubiKey#
按照建議閱讀,配置好多用戶與桌面。
遵循 Yubikey#Challenge-response_2 配置 YubiKey(yubikey-full-disk-encryption),可以配置為 1FA 或 2FA。
重啟系統,確認 YubiKey 配置成功。
確定 YubiKey 可以運行後,記得通過 cryptsetup luksChangeKey /dev/nvme0n1p2 來修改此前臨時設置的密碼。改個強一點、最好你自己也記不住的,然後寫在紙上(最好用遇水能洇開的墨水),放在安全但又隨手可及的地方。
可以用如下命令生成:
配置 Plymouth#
想看 Plymouth 的話,此時也可以配置好。我的 Plymouth 在啟動時會出現方塊,原因是 initramfs 裡沒有字體,解決方法為在 mkinitcpio 時加入。照著下面的例子編輯 /etc/mkinitcpio.conf:
配置 Snapper#
Snapper 可以對你的 btrfs 進行定期快照與恢復。我使用圖形化的 Btrfs Assistant 配置,因此這裡沒什麼可以說的。
配置 Secure Boot#
此步操作不當可能導致你的數據丟失。
把這放到最後一步是因為它最麻煩,並且開了 Secure Boot 以後,從系統維護盤啟動進行修正會變得困難。
不使用 TPM 的前提下,配置 Secure Boot 的用處並不大,反而會帶來很多麻煩。但如果使用了 TPM(把密鑰寫入了 TPM),那麼不配置 Secure Boot 就會導致安全性下降。1我也是因為 Windows 那邊開了 Bitlocker(加密系統盤時,會把密鑰寫入 TPM)才想着配置 Secure Boot。
如果你的電腦有 Windows 系統,並且 Windows 系統盤開啟了 Bitlocker,那麼請備份並保管好恢復密鑰,下次啟動 Windows 時很可能會用到。
在 BIOS 界面,開啟 Secure Boot,並重置為 Setup Mode。重啟進入 Linux。使用如下命令將密鑰安裝進 Secure Boot:
如果你的 Secure Boot 沒被重置為 Setup Mode,那麼這一步會報錯。請勿強行寫入。
各參數說明:
| 參數 | 說明 |
|---|---|
-m | Microsoft,添加微軟密鑰,從而使 Windows 能夠啟動 |
-c | custom,添加自定義密鑰,從而使你的 Linux 能夠啟動 |
-f | firmware-builtin,添加固件內置密鑰 |
-t | tpm-eventlog,添加 TPM 事件日誌 |
sbctl 在此前 sbctl bundle ... -s /efi/main.efi 時,會將構建信息保存(-s 參數),並在每次 mkinitcpio 時自動更新。因此,你不需要手動更新。你也可以參考 sbctl 的手冊頁來獲得更多用法。例如,使用 sbctl 對 refind 或 systemd-boot 進行簽名。
當那一天來臨#
如果需要緊急銷毀密鑰,正確的步驟是:
- 找到前述寫有密碼的紙條,將其銷毀。
- 銷毀 YubiKey,確保其晶片(內部的矽片)破碎。如果你此前配置的是 1FA,那麼這步應當先做。 YubiKey 比較堅固,你可能要用些工具,或在平時就將它改造得易於摧毀。
這以後,就可以微笑著迎接破門而入的軍警憲特了。祝你不要有這一天。