私は以下の[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_systemd
を起動するsystemctl --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
別の解決策としては、sudoers
ファイルを編集して、問題のユーザーが/usr/lib/systemd/systemd-cryptsetup
NOPASSWD オプションを有効にしてルート権限で実行できるように権限を追加することが挙げられます。
次に、上記の (ユーザー固有の) サービス ファイルを次のように編集します。
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
直接付与するのではなく、ユーザーに代わって「アタッチ」および「デタッチ」手順を実行するスクリプトをいくつか作成することを強くお勧めします。そうしないと、このコマンドを実行するアクセス権を付与されたすべてのユーザーが、他の暗号化されたボリュームに干渉する可能性があります。
答え2
ディレクティブを使用してファイルを作成し、ディレクティブを使用してファイルを削除するType=oneshot
RemainAfterExit=yes
サービスをユーザー用に作成して有効にすることをお勧めします。例:ExecStart
ExecStop
ExecStart="/usr/bin/touch %h/.decrypt"
ExecStop="/usr/bin/rm %h/.decrypt"
次に、[email protected]
絶対パスを使用してシステム ユーザーのユニット ファイルを作成し、有効にすることができます。
PathExists="/home/user/.decrypt"
これにより、上記のユーザー サービスによって作成されたパスがチェックされ、[email protected]
ユニットが作成されるとアクティブ化され、削除されると非アクティブ化されるため、システム サービスとユーザー サービスの間接的な依存関係が確立されます。
もちろん、これを安全に動作させるには、ファイルが作成されるディレクトリはユーザーのみが書き込み可能である必要があることに注意してください。