私のシステムには2つの暗号化されたディスクがあります。
- raspbianstretchルートパーティションの暗号化が含まれています。
- 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 = 0
1で始まり、繰り返すたびに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回だけ試行します。 。これが真であるかどうかをテストする暗号化されたシステムシステムがないか、またはどこかでコードを誤って読み取っただけです。