LUKS2 + TPM + UKI .efi + SecureBoot
以下都以Manjaro Linux (Arch Linux)為主
Yuan Chiu [email protected]
我平常會隨時帶筆電外出,而且筆電硬碟裡面有放敏感資料(個人證件、公司機密...等等)
硬碟加密+綁定這台電腦開機
而且條件達成就會預設啟用
反觀Linux...... 太自由導致規格太亂,很少有Linux發行版願意好好處理 (Manjaro正常安裝流程只處理到LUKS1)
先問問有多少教學文都是叫你關SecureBoot就沒事了...
Linux... 都手動處理了,請自己好好保管好,保險一點就多設第二、第三種解鎖途徑。
絕對絕對!!!不要拿TPM當作解鎖的唯一途徑!!! (每升級動到Linux核心、或BIOS升級,都有可能讓TPM自動解鎖失效)
從需求面來講,一開始只會先花力氣處理TPM,最後在補流程漏洞的時候,才順便的把SecureBoot處理好
開機流程: BIOS → GRUB → 載入Linux過程詢問LUKS解鎖密碼 → 進入作業系統詢問登入密碼 → 進入桌面環境!!
就使用體感來說:只需輸入一次密碼,還可以彈性用方便的指紋/人臉認證,又能兼顧資料安全!
要用TPM綁定,只能用LUKS2
但GRUB只完整支援到LUKS1...
對策:
Manjaro Linux正常安裝流程中,有開啟硬碟加密選項,那安裝程式就會用LUKS1的方式處理。
LUKS1啟動方式:
BIOS → 載入GRUB過程中詢問LUKS解鎖密碼 → 進入GRUB選單 → 載入Linux核心 → 進入作業系統
(但無法綁定TPM自動解鎖,每次開機都得輸入兩次密碼。我那時筆電鍵盤還有點壞,造成密碼輸入很難過)
至於本次採用的LUKS2方式,會變成:
BIOS → 無加密進入GRUB選單 → 載入Linux核心過程中詢問LUKS密碼 → 進入作業系統
需求上的主要目的:確認就是這一台電腦!!
私鑰在TPM晶片內無法匯出,無法被偽造
可以設定PCR來決定嚴格程度
現代電腦應該都有TPM晶片
PCR 7: 只會檢查SecureBoot開關。
PCR 4+5+7 (我現在在用的)
sudo systemd-cryptenroll /dev/nvme1n1p3 --wipe-slot=tpm2 --tpm2-device=auto --tpm2-pcrs=4+5+7
查看目前LUKS的認證途徑
sudo systemd-cryptenroll /dev/nvme1n1p3
以原生luks的查詢指令
sudo cryptsetup luksDump /dev/nvme1n1p3
然後又因為TPM環境條件成立而觸發LUKS自動解鎖 等於 LUKS認證 + 作業系統登入認證都被繞過了...
/etc/systemd/system.conf
rescue.service
/etc/shadow
init=/bin/bash
所以只能用鎖死cmdline的方式來處理
至於你可能會想問:鎖死cmdline後,若系統壞掉臨時需要下cmdline臨時開機的話不就...? 後面會詳述
針對更前面的環節:
UKI會將 Linux initramfs + vmlinuz + ucode整個打包,合併成一個 .efi 映像檔
順便讓我抱怨一下,SecureBoot真的是個很廢的東西...
Secure Boot: enabled (deployed)
/etc/kernel/cmdline
GRUB_CMDLINE_LINUX_DEFAULT
/etc/crypttab
openssl req -newkey ...
sbsign --key /usr/share/secureboot/keys/MOK.key --cert /usr/share/secureboot/keys/MOK.crt --output <來源.efi路徑> <產出.efi路徑>
sudo efibootmgr --unicode --disk /dev/nvme1n1p1 --part 1 --create --label "Manjaro-6.12" --loader /EFI/Linux/manjaro-6.12-x86_64.efi
/etc/grub.d/40_custom
menuentry "Manjaro Linux (UKI linux-6.12.28-1)" --class manjaro { insmod fat insmod chain search --no-floppy --set=root --fs-uuid 11E4-A147 chainloader /EFI/Linux/linux-6.12.28-1-MANJARO-bdf473ff6a384cf7b761270259c00933-rolling.efi }
可以使用我調好的腳本, 這個腳本的項目設計,是盡量比照傳統的風格 預設項目+Advanvced options子選單,並以版號順序排序。
使用方式:將09_uki複製到 /etc/grub.d/ 裡面, 之後在update-grub的時候就會自動搜尋 /boot/efi/EFI/Linux 裡面的所有 .efi 檔。
09_uki
/etc/grub.d/
/boot/efi/EFI/Linux
不過因為我的需求只有Manjaro,名稱的部份是直接寫死的,請自行依需求修改。如果有人可以再優化,歡迎PR給我!!
要注意!update-grub執行順序必須是在掛上mkinitcpio/dracut產完.efi檔之後!不然會因為抓不到.efi檔案而沒編入進選單。
UKI .efi 基本上就是把cmdline完全封死!不接受任何外來開機參數!
/etc/grub.d/10_linux
* 由shim軟體來管理你的簽名憑證,要在shim MOK Manager界面把你的簽名加入。
html: true
