ログイン時にユーザーごとにLUKS暗号化デバイスのパスワードを復号化する方法は?

ログイン時にユーザーごとにLUKS暗号化デバイスのパスワードを復号化する方法は?

[email protected]次のサービスを作成しましたsystemd

[Unit]
Description=Cryptography Setup for '%I'
After=cryptsetup-pre.target
After=dev-mapper-%i.device
Before=cryptsetup.target
Before=umount.target
BindsTo=dev-mapper-%i.device
BindsTo=dev-mapper-%i.luks.device
Conflicts=umount.target
DefaultDependencies=no
IgnoreOnIsolate=true
RequiresMountsFor=/home

[Service]
ExecStart=/usr/lib/systemd/systemd-cryptsetup attach '%I.luks' '/dev/mapper/%I' '%h/%I/secret.key' 'luks,header=%h/%I/header'
ExecStop=/usr/lib/systemd/systemd-cryptsetup detach '%I.luks'
KillMode=none
RemainAfterExit=yes
TimeoutSec=0
Type=oneshot

[Install]
WantedBy=default.target

アイデアは、サービスを有効にした特定のユーザーに対してのみ特定のLUKS暗号化xxxデバイスを復号化することです。たとえば、次のようになります。xxx.luks

systemctl --user enable luks@xxx

残念ながらテストさえ

systemctl --user start luks@xxx

1実際の理由を指定せずに常に終了コードを返すため、失敗します。権限に問題がある可能性があることは明らかです。手動でトリガーするには、たとえばを使用するcryptsetup luksOpen ...にはケースを持ち上げる必要があると確信していますsudo。実際に発行したら

sudo systemctl start luks@xxx

それは魅力のように動作します。

sudo systemctl enable luks@xxx

開始段階に適用可能です。

メモ:
これらのシステム全体のインストールでは、もちろん、%hサービスは特定のユーザーの実際のホームディレクトリに置き換えて変更する必要があります。これは醜く、とにかく究極の目的を崩すことです。

pam_mountこれで、どちらがユーザーごとに同様のインストールを実行できるかがわかりました(分離されたLUKSヘッダーをサポートせず、実際に望ましくないデバイスをマウントするため使用できません)pam_systemdsystemctl --userできる権限を取得する方法は明らかです。

しかし、故障の症状は

systemctl --user enable luks@xxx

テスト結果より悪かった。

systemctl --user start luks@xxx

(終了コードのみが返されます1。)つまり、特定のユーザーが文句を言うため、ログインすらできません。

Failed to create bus connection: No such file or directory

なぜなら、XDG_RUNTIME_DIRこれはDBUS_SESSION_BUS_ADDRESSもはや設定されていませんが、サービスによって設定される必要があるからですsystemd-logind.service。明らかに、luks@xxx初期化プロセス全体が何らかの形で破損しているようですが、ログに情報がないため、正確な理由がわかりません。したがって、現在の権限の欠如について疑問が残っています。

教育的なアドバイスを楽しみにしています。ありがとうございます。

ベストアンサー1

別の回避策は、NOPASSWDオプションを有効にしたときにroot権限で実行できるsudoersように、関連ユーザーの権限を追加するようにファイルを編集することです。/usr/lib/systemd/systemd-cryptsetup

その後、上記の(ユーザー別)サービスファイルを編集して次の内容を読むことができます。

ExecStart=/usr/bin/sudo /usr/lib/systemd/systemd-cryptsetup attach '%I.luks' '/dev/mapper/%I' '%h/%I/secret.key' 'luks,header=%h/%I/header'
ExecStop=/usr/bin/sudo /usr/lib/systemd/systemd-cryptsetup detach '%I.luks'

有効にする必要があるかどうかわかりません。!必要この仕事のために

修正する:

セキュリティを強化するために、特にマルチユーザーシステムでは、sudoアクセス権を直接付与するのではなく、ユーザーに代わって「接続」および「分離」ステップを実行するいくつかのスクリプトを生成することをお勧めします。/usr/lib/systemd/systemd-cryptsetupそうしないと、この実行権限を持つすべてのユーザーにとって、コマンドは他の暗号化ボリュームを妨げる可能性があります。

おすすめ記事