web-dev-qa-db-ja.com

次回の再起動時に暗号化されたファイルシステムを自動的に復号化するにはどうすればよいですか?

ゴール

次回システムを再起動したときに、LUKSで暗号化されたルートファイルパーティションとスワップパーティションを復号化する非インタラクティブな方法を探しています。これに加えて、再起動後にパスワードを元に戻す方法が必要です。これにより、再起動後に再度パスワード(または新しいパスワード)が必要になります。

システムはLVMを使用します。

システムでパスワードを入力したり、別のシステムを使用してロックを解除したりする必要はありません。一度だけロックを解除する必要があります。

暗号化されたパスワードを持っているので、ハードドライブに平文で保存してください。私はこの段階でセキュリティに関心がありません。

バックグラウンド

カスタムpreseedおよびキックスタートファイルを使用したUbuntuサーバーインストールに基づくUbuntuをデプロイするためのフローがあり、キックスタートは最初の再起動(および最初の再起動のみ)後に実行されるサービスをインストールしてから再起動します。このフローでLUKSディスク暗号化を実装しようとしていますが、非対話のままにする必要があるため、パスワードなしで初めて再起動できるようにする必要があります。

インストール中に設定されるパスワードは一時的なものであり、最初の再起動後に実行されるサービスによって変更されるため、最初のパスワードはクリアテキストで保存できます。

この質問を投稿する前に調べたこと

私はかなりのグーグルを使ってこれを試してみましたが、ほとんどのことはinitramfsファイルを交換するソリューションに向けられています。

これを使用してシステムをリモートでロック解除する方法を説明する複数のリソースを見つけましたが、対話なしでそれを行う必要があります。そのようなリソースの1つを次に示します。 https://hamy.io/post/0005/remote-unlocking-of-luks-encrypted-root-in-ubuntu-debian/

私が見つけたソリューションに最も近いものは、おそらくVPSソリューションに必要なものを達成する方法であるこのリソースですが、説明のない単なるコマンドの束であり、どのように適応: https://dradisframework.com/pro/support/guides/customization/auto-unlock-luks-encrypted-drive.html

ArchLinuxのこのリソースも見つけました https://wiki.archlinux.org/index.php/Dm-crypt/System_configuration#cryptkey 、カーネルパラメーターを追加しようとしましたが、運が良ければどちらか。 LUKSがこれらのカーネルパラメーターをサポートしていないためかどうかはわかりません。

7
Tobias

解決策はかなり単純なようで、 パーティションを自動復号化するようにLVMとLUKSを設定する方法?

どうやってそれをやったのか

私の/ bootパーティションは/ dev/sda1

解読したいLVMボリュームは/ dev/sda3

私はrootでしたが、すべてのコマンドにSudoを追加していない場合。

パスワード付きのキーファイルを作成することから始めます(擬似乱数を生成します)

dd if=/dev/urandom of=/boot/keyfile bs=1024 count=4

次に、rootに読み取り許可を設定し、他の人には何も設定しません

chmod 0400 /boot/keyfile

次に、キーファイルをロック解除キーとして追加します

cryptsetup -v luksAddKey /dev/sda3 /boot/keyfile

(暗号化パスワードを入力するように求められます)

/ bootパーティションのuuidを見つけます(これはルートである必要はありません)

ls -l /dev/disk/by-uuid/

これがどのように見えるかの例です(別のマシンからこれを取得したため、実際の出力ではありません)

test@test:~$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Jan 15 03:36 025c66a2-c683-42c5-b17c-322c2188fe3f -> ../../sda2
lrwxrwxrwx 1 root root 10 Jan 15 03:36 9e7a7336-3b81-4bbe-9f1a-d43415df1ccb -> ../../sda1

次に、お気に入りのエディターで/ etc/crypttabを編集します

nano /etc/crypttab

コンテンツは次のようになります(これも別のマシンのものです)

sda3_crypt UUID=025c66a2-c683-42c5-b17c-322c2188fe3f none luks,discard

やりたいことは、none/ dev/disk/by-uuid/[/ bootパーティションのuuid]に置き換えますかおよびdiscardkeyscript =/lib/cryptsetup/scripts/passdevに置き換えたい

結果は次のようになります

sda3_crypt UUID=025c66a2-c683-42c5-b17c-322c2188fe3f /dev/disk/by-uuid/9e7a7336-3b81-4bbe-9f1a-d43415df1ccb luks,keyscript=/lib/cryptsetup/scripts/passdev

ファイルを保存し、initramfsの更新に進みます

update-initramfs -u

これで、再起動できます。

reboot

もう一度削除するには(必要に応じて)

最初に、システムへのキーが2つしかないことを確認します(元のキーファイルと新しいキーファイル)

cryptsetup luksDump /dev/sda3 | grep BLED

これは次のような出力を生成します

Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

キースロット1のキー(キーファイル)を削除するには

cryptsetup luksKillSlot /dev/sda3 1

次に、暗号化パスワード(キーファイル内のパスワードではなく、元のパスワード)を入力するように求められます

次に、実際のキーファイルを削除します

rm /boot/keyfile

Initramfsを再度更新します

update-initramfs -u

これで、再起動するとパスワードの再入力が求められます。できました。

reboot
7
Tobias