在系統啟動時解密 LUKS 容器

大家早安晚安! 這篇文章將對那些使用 LUKS 數據加密並希望在 Linux(Debian,Ubuntu)下解密磁盤的人有用 解密根分區的階段. 我在互聯網上找不到這樣的信息。

最近,隨著上架磁盤數量的增加,我遇到了通過/etc/crypttab使用比眾所周知的方法解密磁盤的問題。 就個人而言,我強調了使用此方法的一些問題,即正在讀取文件 僅在加載(掛載)根分區後,這會對 ZFS 導入產生負面影響,特別是如果它們是從 *_crypt 設備上的分區構建的,或者也是從分區構建的 mdadm raids。 我們都知道您可以在 LUKS 容器上使用 parted,對嗎? 還有其他服務提前啟動的問題,當還沒有數組的時候,但是 使用 我已經需要一些東西(我在 iSCSI 上使用集群 Proxmox VE 5.x 和 ZFS)。

關於 ZFSoverISCSI 的一些信息iSCSI 通過 LIO 為我工作,事實上,當 iSCSI 目標啟動並且沒有看到 ZVOL 設備時,它只是將它們從配置中刪除,從而阻止客戶系統啟動。 因此,要么恢復 json 文件備份,要么手動添加具有每個 VM 標識符的設備,當有幾十台這樣的機器並且每個配置都有超過 1 個磁盤時,這簡直太糟糕了。

而我要考慮的第二個問題是如何解密(這是本文的重點)。 我們將在下面討論這個,切入!

大多數情況下,互聯網上使用密鑰文件(在此之前通過命令自行添加到插槽中 - cryptsetup luksAddKey),或者在極少數情況下(在俄語互聯網上信息很少) - decrypt_derived 腳本,位於/lib/cryptsetup/script/(當然還有其他方式,不過我用的是這兩個,構成本文的基礎)。 我還努力在重新啟動後實現完全自主包含,而無需在控制台中添加任何其他命令,這樣一切都會立即為我“飛起來”。 因此,為什麼要等待? —

讓我們開始吧!

讓我們假設一個系統,如 Debian,安裝在 sda3_crypt 加密分區和十幾個磁盤上,準備好根據您的喜好進行加密和創建。 我們有一個密碼短語(passphrase)來解鎖 sda3_crypt,正是從這個分區,我們將從正在運行(解密)的系統上的密碼中刪除“散列”並將其添加到其餘磁盤。 一切都是基本的,在我們執行的控制台中:

/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdX

其中 X 是我們的磁盤、分區等。

使用我們的密碼短語中的“散列”加密磁盤後,您需要找出 UUID 或 ID - 取決於誰習慣了什麼和什麼。 我們分別從 /dev/disk/by-uuid 和 by-id 中獲取數據。

下一步是為我們需要的功能準備文件和迷你腳本,讓我們繼續:

cp -p /usr/share/initramfs-tools/hooks/cryptroot /etc/initramfs-tools/hooks/
cp -p /usr/share/initramfs-tools/scripts/local-top/cryptroot /etc/initramfs-tools/scripts/local-top/

далее

touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decrypt

../解密的內容

#!/bin/sh

cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"

далее

touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopy

../partcopy 的內容

#!/bin/sh

cp -p /sbin/partprobe "$DESTDIR/bin/partprobe"
cp -p /lib/x86_64-linux-gnu/libparted.so.2 "$DESTDIR/lib/x86_64-linux-gnu/libparted.so.2"
cp -p /lib/x86_64-linux-gnu/libreadline.so.7 "$DESTDIR/lib/x86_64-linux-gnu/libreadline.so.7"

多一點

touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobe

內容../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

最後,在 update-initramfs 之前,您需要編輯 /etc/initramfs-tools/scripts/local-top/cryptroot 文件,從 ~360 行開始,下面的代碼片段


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                
                message "cryptsetup ($crypttarget): set up successfully"
                break

並把它帶到這個表格

已編輯


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                

                /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-uuid/ *CRYPT_MAP*
                /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-id/ *CRYPT_MAP*

                message "cryptsetup ($crypttarget): set up successfully"
                break

請注意,此處可以使用 UUID 或 ID。 主要是在 /etc/initramfs-tools/modules 中添加了 HDD / SSD 設備必要的驅動程序。 您可以通過命令找出正在使用哪個驅動程序 udevadm 信息 -a -n /dev/sdX | egrep 'looking|DRIVER'.

現在我們已經完成並且所有文件都已就位,運行 更新-initramfs -u -k all -v, 在記錄中 必須不 我們腳本的執行錯誤。 我們重新啟動,輸入密碼並稍等片刻,具體取決於磁盤數量。 接下來,系統將啟動,在啟動的最後階段,即“掛載”根分區之後,將執行 partprobe 命令——它將查找並拾取 LUKS 設備和任何陣列上創建的所有分區,無論是 ZFS 還是mdadm,將毫無問題地組裝! 而這一切 加載前 需要這些磁盤/陣列的核心服務和服務。

update1: 如何 注意到 AEP, 此方法僅適用於 LUKS1。

來源: www.habr.com

添加評論