Ubuntu 22.04 を新規インストールし、インストーラーから ZFS+LUKS フルドライブ暗号化オプションを使用しました。
システムを起動するたびに復号化パスフレーズを入力する代わりに、USB キー (USB スティック上の LUKS ロック解除キー) が検出されると、起動時にドライブが自動的にロック解除されるように構成する方法を Web で探していました。
たくさんのガイドを見つけましたが、ZFS と LUKS の両方を使用する場合に 22.04 がドライブのパーティション構造を設定する方法には、それらの指示はどれも当てはまらないようです。
私が従っている最も近いガイドはここにあります: https://tqdev.com/2022-luks-with-usb-unlock
LUKS ドライブにキーを追加する必要がある時点 (手順 6) まではすべて順調に進んでいるように見えますが、2 つのドライブが LUKS ドライブとしてリストされているため、この状態になります。
root@bob-home-linux:~# sudo blkid --match-token TYPE=crypto_LUKS -o device
/dev/sdc2
/dev/zd0
ここからどう進めばいいのか分かりません!
答え1
更新: 2024年3月20日:Ubuntu がポイントリリース (例: 22.04.3 > 22.04.4) を実行すると、これらの変更はリセットされ、手順 13 と手順 20 を再度実行する必要があります。
Ubuntu インストーラーを使用して、ZFS と暗号化を使用して Ubuntu 22.04 デスクトップをインストールします。後の手順で使用するために、暗号化パスフレーズを安全に記録してください。インストーラーで回復キーを設定しなかったので、回復キーを使用する場合にこれらの手順が機能するかどうかはわかりません。結果は人によって異なります。
インストール後、USB ドライブをフォーマットし、ext4 標準を使用して新しいパーティションを作成します (Ubuntu のディスク ユーティリティを使用しました)。パーティションを「linux-key」と呼びます。
USB ドライブがマウントされていることを確認します。「ファイル」アプリケーションを使用して、ファイル ウィンドウの左側の列に USB がマウントされていることを確認します。
ターミナルを起動し、次のコマンドを入力してルートに切り替え、USB ドライブに切り替えます。
sudo su cd /media/<yourusername>/linux-key ls -la
空のディレクトリ リストが表示され、USB ドライブが空であることがわかります。
root@ubuntu:/media/bob/linux-key$ ls -la total 29 drwx------ 3 bob bob 4096 Jan 25 15:07 . drwxr-x---+ 3 root root 3 Jan 25 15:08 .. drwx------ 2 root root 16384 Jan 25 15:07 lost+found
システムの LUKS パーティションを表示するには、次のように入力します。変更する必要があるデフォルトのパーティションは通常、/dev/zd0 です。以下のコマンドを実行するときに、それが表示されていることを確認します。
$ blkid --match-token TYPE=crypto_LUKS -o device /dev/sdc2 /dev/zd0
新しい暗号化キーファイルを作成します。
dd if=/dev/urandom bs=1 count=256 > linux.key
キーファイルが存在することを確認してください。リストにファイルが表示されます。
$ ls -la -rw-rw-r-- 1 root root 256 Jan 25 15:10 linux.key
パーティションで動作するようにキーファイルを設定し、インストーラーで以前に設定した復号化パスフレーズを入力します。
cryptsetup luksAddKey /dev/zd0 linux.key
キースロット 1 にキーが挿入されていることを確認し、キーの挿入が成功したかどうかを確認します。
cryptsetup luksDump /dev/zd0;
... Area offset:32768 [bytes] Area length:258048 [bytes] Digest ID: 0 1: luks2 <------------- the key you just added Key: 512 bits Priority: normal Cipher: aes-xts-plain64 Cipher key: 512 bits PBKDF: argon2id ...
キーファイルの権限を調整する
chmod 400 linux.key
次に、initramfs スクリプト フォルダーに移動し、「zfs」というファイルを開きます。任意のテキスト エディターを使用できます。(
nano
この例では使用しています)cd /usr/share/initramfs-tools/scripts nano zfs
次の行を見つけて、次のテキストに置き換えます。
この行を見つける
echo "keystore-${pool} ${ks} none luks,discard" >> "${TABFILE}"
これを置き換える
echo "keystore-${pool} ${ks} none luks,discard,tries=10,keyscript=/scripts/usb-unlock" >> "${TABFILE}"
ファイルを保存して閉じます。
同じディレクトリに「usb-unlock」という新しいファイルを作成します。
nano usb-unlock
この gist からスクリプトを貼り付けます - これは、「linux-key」という USB ドライブ パーティションをチェックし、linux.key というファイルを検索し、それを使用してパーティションの暗号化を解除しようとします。
ファイルを保存して閉じます。
usb-unlockスクリプトの権限を調整する
chmod 755 usb-unlock
スクリプトのディレクトリを一覧表示します。操作した 2 つのファイルが、755 権限セットを持つ root ユーザーに属していることを確認します。
$ ls -la # you should see these files... -rwxr-xr-x 1 root root 550 Dec 22 20:38 usb-unlock -rwxr-xr-x 1 root root 31665 Dec 22 20:40 zfs
最後に、起動時にスクリプトが実行されるように initramfs を更新します。
update-initramfs -u
USB ドライブが挿入されていることを確認し、マシンを再起動します。挿入されている場合は、復号化パスフレーズを入力する必要はありません。挿入されていない場合は、スクリプトによってパスフレーズの入力が要求され、入力する必要があります。
答え2
それは initramfs に隠された「魔法」です。zfs-initramfs
正確にはパッケージ内です。
/usr/share/initramfs-tools/script/zfs を調べて、次の行を見つけます。
# Open and mount luks keystore for any pools using one
動作は次のようになります。
プール (例rpool
) をインポートすると、その中の暗号化されていないボリューム (zvol) は として使用できるようになります/dev/zvol/rpool/keystore
。
この zvol デバイスはまだ暗号化されています。
これらの luks 暗号化 zvols ( ) の crypttab エントリは、zfs list -t volume
起動時に /cryptroot/crypttab に即座に作成されます。
次に、それらのエントリのパスフレーズがユーザーから照会されます。
その後、デバイスのロックが解除され、暗号化されていない状態で にマウントされます/run/rpool/keystore
。
rpool 自体は暗号化されており、そのキーの場所はこの場所を指しているため、rpool のキーをロードしてブート プロセスを続行できます。
おそらく誰かがそれを適切に文書化する必要があります ;)
元の質問に関しては、initramfs の可能な拡張ポイントを使用して動作を微調整して/etc/initramfs-tools/scripts/local-*/
同じことを実行し、USB デバイスのパスフレーズを使用して zvol を自分でマウントするか、rpool のキーを何らかの方法で直接提供することができます。