インストール時にLUKSパーティションにパスワードが必要ないのはなぜですか?

インストール時にLUKSパーティションにパスワードが必要ないのはなぜですか?

私のシステムには2つの暗号化されたディスクがあります。

  1. raspbianstretchルートパーティションの暗号化が含まれています。
  2. usb-cryptは外部USBディスクです。このディスクには LVM が使用されます。

どちらのディスクも同じパスワードで保護されていますが、「cryptsetup luksDump」によるとマスターキーは異なります。両方のディスクはキーファイルとして構成されていません(LUKSコンテナごとに1つのキースロットのみが使用されます)。

システムが起動すると、「crypt」パスワードを入力するように求められますが、usb-cryptはパスワードを入力せずに自動的にマウントされます。注:暗号化されていないルートパーティションで起動しましたが、この設定を有効にすると、起動中にusb-cryptのパスワードを求めるメッセージが表示されました。

詳細な設定は次のとおりです。

$ sudo dmsetup ls --target crypt
crypt   (254, 0)
usb-crypt       (254, 1)

$ sudo cat /etc/fstab
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mapper/crypt  /            ext4    defaults,noatime  0       1
# ...
UUID=b9fb061f-0877-4d2c-bd3c-9c155b8f88a5       /mountpoint       ext4            rw,auto                 0       0

$ sudo cat /etc/crypttab 
# <target name> <source device>         <key file>      <options>
crypt   /dev/mmcblk0p2  none    luks
usb-crypt       UUID=31fb8df7-6148-4408-90a2-93b8ec752fa0       none    luks

パスワードを一度だけ入力すると便利ですが、このような動作を見て驚きました。私は両方のパスワードを尋ねると予想しました。

両方のディスクで同じパスワードを使用することに関連する可能性はありますか?それとも、USBフラッシュドライブのマスターキーが「crypt」暗号化されたルートパーティションのどこかに自動的に保存されますか?誰かがここで何が起こっているのかを説明し、関連するログファイルなどのヒントを提供できる場合は非常に感謝します。

よろしくお願いします!

ベストアンサー1

パスワードを要求する初期化スクリプトが実行する操作によって異なります。

もしそうなら、systemdそれは機能だけかもしれません。systemd-ask-password責任を負うキャッシュ機能が付属しています。

https://www.freedesktop.org/software/systemd/man/systemd-ask-password.html

--accept-cached

    If passed, accept cached passwords, i.e. passwords previously entered.

--multiple

    When used in conjunction with --accept-cached accept multiple passwords.
    This will output one password per line.

このようにして、最初にすでに入力したパスワードを試し、それがうまくいかない場合にのみ別のパスワードを要求します。

このアイデアの欠点は、LUKSでパスワードを確認するのにCPU時間が1秒かかるため、LUKSコンテナが多いと、この試みが遅くなる可能性があることです。しかし、ほとんどの人は1つまたは2つのパスワードしか持っておらず、実際に同じパスワードを使用することがよくあります。

実際、この問題を担当するソースコードが見つからないため、上記は単なる推測であり、この機能を無効にするオプションがあるかどうかはわかりません。


責任があると思われるコードを見つけ、Githubで確認してください

tries = 01で始まり、繰り返すたびに1ずつ増加するforループがあります。tries

ループはifを呼び出しget_password()bool accept_cachedそれをtrueに設定しますtries == 0 && !arg_verify。したがって、ループの最初の反復ですでにキャッシュされている場合にのみ、キャッシュされたパスワードを返します。これがうまくいかない場合、次の反復はfalseにtries == 1設定され、accept_cachedその後に試みる他のパスワードを求めるメッセージが表示されます。

パスワードリストがに転送されますattach_luks_or_plain()。これは最初の反復で以前にキャッシュされたパスワードになり、すべての後続の反復で単一の新しいパスワードになるため、以前に試行したパスワードを再試行しません(同じパスワードを入力しない限り)。

パスワードプレーンテキストをメモリに保存すると、パスワードリストがとして宣言されるため、_cleanup_strv_free_erase_ char **passwords = NULL;少なくともクリーンアップなどの音はある時点で正しく処理されます。

キーは常にメモリのどこかにあり、その周囲には方法がありません。 cryptを使用するにはマスターキーが必要で、コンテナが開いている限り常にキーを表示できますdmsetup table --showkeys


通常arg_tries = 3、有効なパスワードを入力するために3回試行しますが、複数のコンテナがあり、キャッシュされたパスワードが機能しない場合、キャッシュされたパスワードの試行はすでに最初の試行としてカウントされ、パスワード入力を2回だけ試行します。 。これが真であるかどうかをテストする暗号化されたシステムシステムがないか、またはどこかでコードを誤って読み取っただけです。

おすすめ記事