システム起動時の LUKS コンテナの復号化

みなさん、昼も夜もお疲れ様でした! この投稿は、LUKS データ暗号化を使用しており、Linux (Debian、Ubuntu) でディスクを復号化したい人にとって役立ちます。 ルートパーティションを復号化する段階。 そして、インターネット上でそのような情報を見つけることができませんでした。

最近では、シェルフ内のディスクの数が増加したため、/etc/crypttab を介したよく知られた方法を使用してディスクを復号化するという問題に遭遇しました。 個人的には、この方法の使用に関するいくつかの問題を強調します。それは、ファイルが読み取られているということです。 ルートパーティションをロード(マウント)した後でのみこれは、ZFS インポートに悪影響を及ぼします。特に、ZFS インポートが *_crypt デバイス上のパーティションから構築された場合、または mdadm RAID がパーティションから構築された場合にも影響します。 LUKS コンテナーで parted を使用できることは誰もが知っていますよね? また、まだ配列がない場合に他のサービスを早期に開始するという問題もありますが、 使用します すでに何かが必要です (クラスター化された Proxmox VE 5.x と ZFS over iSCSI を使用しています)。

ZFSoverISCSI について少しiSCSI は LIO 経由で機能します。実際、iscsi ターゲットが起動しても ZVOL デバイスが認識されない場合、構成からそれらのデバイスが削除されるだけで、ゲスト システムが起動できなくなります。 したがって、json ファイルのバックアップを復元するか、各 VM の識別子を持つデバイスを手動で追加する必要がありますが、そのようなマシンが数十台あり、各構成に複数のディスクがある場合、これは単純にひどいことになります。

そして、私が考える XNUMX 番目の質問は、復号化する方法です (これがこの記事の重要なポイントです)。 これについては以下で説明します。実際に見てみましょう。

ほとんどの場合、インターネットではキー ファイルが使用されます (コマンド - cryptsetup luksAddKey によってこの前のスロットに自己追加されます)。または、まれな例外として (ロシア語のインターネットでは情報がほとんどありません) - decrypt_derived スクリプトが使用されます。 /lib/cryptsetup/script/ にあります (もちろん、他の方法もありますが、私は記事の基礎となったこれら XNUMX つの方法を使用しました)。 また、再起動後にコンソールで追加のコマンドを追加することなく、すべてが一度に「起動」するように、完全に自律的に組み込まれるように努めました。 したがって、なぜ待つ必要があるのでしょうか? —

始めましょう!

Debian などのシステムが sda3_crypt 暗号パーティションにインストールされ、3 個のディスクが暗号化され、思う存分作成できる状態になっていると仮定します。 sdaXNUMX_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 を使用できることに注意してください。 主なことは、HDD / SSD デバイスに必要なドライバーが /etc/initramfs-tools/modules に追加されることです。 コマンドでどのドライバーが使用されているかを確認できます。 udevadm 情報 -a -n /dev/sdX | egrep '探し中|ドライバー'.

これで作業が完了し、すべてのファイルが配置されたので、実行します。 update-initramfs -u -k all -v、ロギング中 であってはならない スクリプトの実行エラー。 ディスクの数に応じて、再起動し、パスフレーズを入力し、少し待ちます。 次に、システムが起動し、起動の最終段階、つまりルート パーティションを「マウント」した後、partprobe コマンドが実行されます。LUKS デバイスおよびアレイ (ZFS であっても) 上に作成されたすべてのパーティションが検索され、取得されます。 mdadmさん、問題なく組み立てられます! そして、これらすべて ロードする前に コア サービスとこれらのディスク/アレイを必要とするサービス。

update1: どうやって 気づいた AEP、この方法は LUKS1 でのみ機能します。

出所: habr.com

コメントを追加します