USB ドライブ経由で起動時に LUKS ロックを自動的に解除するように Ubuntu 22.04 (ZFS) を構成する

USB ドライブ経由で起動時に LUKS ロックを自動的に解除するように Ubuntu 22.04 (ZFS) を構成する

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 を再度実行する必要があります。

  1. Ubuntu インストーラーを使用して、ZFS と暗号化を使用して Ubuntu 22.04 デスクトップをインストールします。後の手順で使用するために、暗号化パスフレーズを安全に記録してください。インストーラーで回復キーを設定しなかったので、回復キーを使用する場合にこれらの手順が機能するかどうかはわかりません。結果は人によって異なります。

  2. インストール後、USB ドライブをフォーマットし、ext4 標準を使用して新しいパーティションを作成します (Ubuntu のディスク ユーティリティを使用しました)。パーティションを「linux-key」と呼びます。

  3. USB ドライブがマウントされていることを確認します。「ファイル」アプリケーションを使用して、ファイル ウィンドウの左側の列に USB がマウントされていることを確認します。

  4. ターミナルを起動し、次のコマンドを入力してルートに切り替え、USB ドライブに切り替えます。

    sudo su
    cd /media/<yourusername>/linux-key
    ls -la
    
  5. 空のディレクトリ リストが表示され、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
    
  6. システムの LUKS パーティションを表示するには、次のように入力します。変更する必要があるデフォルトのパーティションは通常、/dev/zd0 です。以下のコマンドを実行するときに、それが表示されていることを確認します。

    $ blkid --match-token TYPE=crypto_LUKS -o device
    /dev/sdc2
    /dev/zd0
    
  7. 新しい暗号化キーファイルを作成します。

    dd if=/dev/urandom bs=1 count=256 > linux.key
    
  8. キーファイルが存在することを確認してください。リストにファイルが表示されます。

    $ ls -la
    -rw-rw-r--  1 root  root    256 Jan 25 15:10 linux.key
    
  9. パーティションで動作するようにキーファイルを設定し、インストーラーで以前に設定した復号化パスフレーズを入力します。

    cryptsetup luksAddKey /dev/zd0 linux.key
    
  10. キースロット 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
        ...
    
  11. キーファイルの権限を調整する

    chmod 400 linux.key
    
  12. 次に、initramfs スクリプト フォルダーに移動し、「zfs」というファイルを開きます。任意のテキスト エディターを使用できます。(nanoこの例では使用しています)

    cd /usr/share/initramfs-tools/scripts
    nano zfs
    
  13. 次の行を見つけて、次のテキストに置き換えます。

    この行を見つける

    echo "keystore-${pool} ${ks} none luks,discard" >> "${TABFILE}"
    

    これを置き換える

    echo "keystore-${pool} ${ks} none luks,discard,tries=10,keyscript=/scripts/usb-unlock" >> "${TABFILE}"
    
  14. ファイルを保存して閉じます。

  15. 同じディレクトリに「usb-unlock」という新しいファイルを作成します。

    nano usb-unlock
    
  16. この gist からスクリプトを貼り付けます - これは、「linux-key」という USB ドライブ パーティションをチェックし、linux.key というファイルを検索し、それを使用してパーティションの暗号化を解除しようとします。

  17. ファイルを保存して閉じます。

  18. usb-unlockスクリプトの権限を調整する

    chmod 755 usb-unlock
    
  19. スクリプトのディレクトリを一覧表示します。操作した 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
    
  20. 最後に、起動時にスクリプトが実行されるように initramfs を更新します。

    update-initramfs -u
    
  21. 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 のキーを何らかの方法で直接提供することができます。

関連情報