北雁云依

北雁云依

She / Her 博客:https://blog.yunyi.beiyan.us
github
twitter
mastodon
tg_channel

LUKS2 YubiKey 全盤加密手稿

前言#

自從發現自己隨時可能被中華人民共和國人民警察們搜查以來,我的加密偏執就復發了。我決定用 LUKS2 和 YubiKey 武裝我的電腦。可能的話,我還要把這枚 YubiKey 改造成易於摧毀。

不過,配置環境起碼要兩天左右,我手頭上的事太多了,中間還有一個半月在醫院度過,因此遲遲沒有動手。4 個月後,我終於有時間了。於是開幹。

準備工作#

我閱讀了幾篇文章:

結合兩者優劣,得出了自己的方案。事先在虛擬機裡嘗試了兩遍,最終得到了比較滿意的結果。

方案介紹#

本方案會使用 LUKS2 加密 EFI 分區以外的整個硬碟,使用 Unified Kernel Image 引導。引導 + 系統啟動只需要輸入一次密碼(使用 YubiKey 則可配置為不需要密碼,也可配置為 2FA)。EFI 分區中會存在一個 main.efi,裡面包含了 initramfsmicrocodekernel。會使用 sbctl 對它們進行簽名,從而支持 Secure Boot,最後,配置 YubiKey 用於解密 LUKS2

本方案會使用 linux-zen 而非 linux 內核。

本方案不會使用 TPMTPM 配置不當可能導致你的加密功虧一簣。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-ucodeamd-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,那麼這一步會報錯。請勿強行寫入

各參數說明:

參數說明
-mMicrosoft,添加微軟密鑰,從而使 Windows 能夠啟動
-ccustom,添加自定義密鑰,從而使你的 Linux 能夠啟動
-ffirmware-builtin,添加固件內置密鑰
-ttpm-eventlog,添加 TPM 事件日誌

sbctl 在此前 sbctl bundle ... -s /efi/main.efi 時,會將構建信息保存(-s 參數),並在每次 mkinitcpio 時自動更新。因此,你不需要手動更新。你也可以參考 sbctl 的手冊頁來獲得更多用法。例如,使用 sbctlrefindsystemd-boot 進行簽名。

當那一天來臨#

如果需要緊急銷毀密鑰,正確的步驟是:

  • 找到前述寫有密碼的紙條,將其銷毀。
  • 銷毀 YubiKey,確保其晶片(內部的矽片)破碎。如果你此前配置的是 1FA,那麼這步應當先做。 YubiKey 比較堅固,你可能要用些工具,或在平時就將它改造得易於摧毀。

這以後,就可以微笑著迎接破門而入的軍警憲特了。祝你不要有這一天。


Footnotes#

  1. 可以參考這篇文章備份鏈接)和這篇文章備份鏈接)。如果不想 TPM 變成突破口,就不要把密鑰丟 TPM 裡。 2

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。