「Dm-crypt/ログイン時にマウント」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (カテゴリを修正) |
(情報を更新) |
||
5行目: | 5行目: | ||
{{Related articles end}} |
{{Related articles end}} |
||
− | [[PAM]] |
+ | [[PAM]] および [[systemd]] を設定して、所有者がログインしたときに [[dm-crypt]] 暗号化されたホーム パーティションを自動的にマウントし、ログアウト時にアンマウントするようにすることができます。 |
− | + | このチュートリアルでは、[[dm-crypt/root 以外のファイルシステムの暗号化]] で説明されているように、暗号化されたパーティションがすでに作成されていることを前提としています。 |
|
+ | {{Note| |
||
− | == 概要 == |
||
+ | * ユーザーアカウントと LUKS のパスワードは同じにする必要があります。 |
||
− | PAM の認証フェイズにユーザーのパスワードを保存して、カーネルのキーリングに配置します。次に、systemd サービスでキーリングを使って、systemd の {{ic|user@.service}} が実行される前に、自動的にパーティションの鍵を解除してマウントします。 |
||
+ | * すべての例で、{{ic|''username''}} をユーザー名に、{{ic|''1000''}} をユーザー ID に、{{ic|''PARTITION''}} を次のように置き換えます。暗号化されたパーティションのデバイスの名前。 |
||
+ | }} |
||
+ | == ログイン時にロックを解除する == |
||
− | ユーザーがログアウトしたとき、systemd は {{ic|user@.service}} が停止されるため、自動的にサービスも停止され、パーティションがアンマウントされて鍵がかけられます。 |
||
+ | ''pam_exec'' は、ログイン時にデバイスのロックを解除するために使用できます。{{ic|/etc/pam.d/system-login}} を編集し、{{ic|auth include system-auth}} の後に太字で強調された以下の行を追加します。 |
||
− | == ヘルパースクリプト == |
||
− | 3つのヘルパースクリプトが必要です: |
||
+ | {{hc|/etc/pam.d/system-login|2= |
||
− | === /usr/local/bin/savepass === |
||
+ | ... |
||
− | PAM によって提供されたパスワードをカーネルのキーリング (root ユーザー) に保存するスクリプト: |
||
− | {{hc|/usr/local/bin/savepass|<nowiki> |
||
− | #!/bin/sh |
||
− | exec keyctl padd user user:`id -u $PAM_USER` @u |
||
− | </nowiki>}} |
||
+ | auth include system-auth |
||
− | === /usr/local/bin/securemount === |
||
+ | '''auth optional pam_exec.so expose_authtok /etc/pam_cryptsetup.sh |
||
− | カーネルのキーリングから取得したキーを使って特定のデバイスの鍵を解除して、特定の場所にマウントするスクリプト: |
||
− | {{hc|/usr/local/bin/securemount|<nowiki> |
||
− | #!/bin/sh |
||
− | set -e |
||
− | KEYNAME=$1 |
||
− | DEVICE=$2 |
||
− | TARGET=$3 |
||
− | DEC_DEVICE_NAME=$(/usr/bin/systemd-escape -p `/usr/bin/realpath $DEVICE`) |
||
− | DEC_DEVICE=/dev/mapper/$DEC_DEVICE_NAME |
||
+ | ... |
||
− | /usr/bin/keyctl pipe `/usr/bin/keyctl request user $KEYNAME` | /usr/bin/cryptsetup open $DEVICE $DEC_DEVICE_NAME -d - |
||
+ | }} |
||
− | /usr/bin/mount $DEC_DEVICE $TARGET |
||
+ | |||
− | </nowiki>}} |
||
+ | 次に、前述のスクリプトを作成します。 |
||
+ | {{hc|/etc/pam_cryptsetup.sh|2= |
||
− | === /usr/local/bin/secureumount === |
||
− | 暗号化されたデバイスをアンマウントして閉じるスクリプト: |
||
− | {{hc|/usr/local/bin/secureumount|<nowiki> |
||
#!/bin/sh |
#!/bin/sh |
||
− | set -e |
||
− | TARGET=$1 |
||
− | DEC_DEVICE=$(cat /proc/mounts | grep " $TARGET " | cut -d " " -f 1) |
||
+ | CRYPT_USER="''username''" |
||
− | /usr/bin/umount $TARGET |
||
+ | PARTITION="/dev/sd''XY''" |
||
− | /usr/bin/cryptsetup close $DEC_DEVICE |
||
+ | NAME="home-$CRYPT_USER" |
||
− | </nowiki>}} |
||
+ | if [ "$PAM_USER" = "$CRYPT_USER" ] && [ ! -e "/dev/mapper/$NAME" ]; then |
||
− | == PAM の設定 == |
||
+ | /usr/bin/cryptsetup open "$PARTITION" "$NAME" |
||
− | {{ic|auth optional pam_permit.so}} の前に {{ic|auth optional pam_exec.so expose_authtok /usr/local/bin/savepass}} を追加してください: |
||
+ | fi |
||
+ | }} |
||
+ | スクリプトを [[ヘルプ:読み方#実行可能属性の付与|実行可能属性]] にします。 |
||
− | {{hc|/etc/pam.d/system-auth| |
||
− | #%PAM-1.0 |
||
+ | == 自動マウントとアンマウント == |
||
− | auth required pam_unix.so try_first_pass nullok |
||
− | '''auth optional pam_exec.so expose_authtok /usr/local/bin/savepass''' |
||
− | auth optional pam_permit.so |
||
− | auth required pam_env.so |
||
+ | ''systemd-logind'' は、ユーザーに対して少なくとも 1 つのセッションがアクティブである限り、{{ic|user@''1000''.service}} を維持します。最初のログイン成功後に自動的に開始され、最後のセッションからのログアウト後に停止されます。したがって、マップされたボリュームの {{man|5|systemd.mount}} ユニットを作成して [[有効化]] し、それを {{ic|user@''1000''.service}} に接続して、次のことを行い、自動的にマウントおよびアンマウントされるようにします。 |
||
− | account required pam_unix.so |
||
− | account optional pam_permit.so |
||
− | account required pam_time.so |
||
+ | {{hc|/etc/systemd/system/home-''username''.mount|2= |
||
− | password required pam_unix.so try_first_pass nullok sha512 shadow |
||
+ | [Unit] |
||
− | password optional pam_permit.so |
||
+ | Requires=user@''1000''.service |
||
+ | Before=user@''1000''.service |
||
+ | [Mount] |
||
− | session required pam_limits.so |
||
+ | Where=/home/''username'' |
||
− | session required pam_unix.so |
||
+ | What=/dev/mapper/home-''username'' |
||
− | session optional pam_permit.so |
||
+ | Type=btrfs |
||
+ | Options=defaults,relatime,compress=zstd |
||
+ | |||
+ | [Install] |
||
+ | RequiredBy=user@''1000''.service |
||
}} |
}} |
||
+ | == アンマウント後のロック == |
||
− | == systemd サービス == |
||
+ | |||
− | {{ic|/etc/systemd/system}} ディレクトリに新しいサービスファイルを作成してください。{{ic|123}} はユーザーの ID に、{{ic|/home/xyz}} はパーティションをマウントしたいパスに、{{ic|c139ae70\x2d5861\x2d4084\x2d84b1\x2d7d83f7bb7129}} と {{ic|c139ae70-5861-4084-84b1-7d83f7bb7129}} は暗号化したパーティションの UUID に置き換えてください。前者において {{ic|-}} 記号は全て {{ic|\x2d}} に置き換える必要があるので注意してください。 |
||
+ | アンマウント後もデバイスのロックは解除されたままで、パスワードを再入力せずにマウントすることができます。デバイスのロックが解除されたときに開始され ({{ic|1=BindsTo=dev-mapper-home\x2d''username''.device}})、デバイスがロック解除された後に停止するサービスを作成して [[有効化]] できます。アンマウント ({{ic|1=Requires,Before=home-''username''.mount}})、プロセス内でデバイスをロック中 ({{ic|1=ExecStop=cryptsetup close}}): |
||
− | {{hc|/etc/systemd/system/homedir@'''123'''.service|2= |
||
+ | |||
+ | {{hc|/etc/systemd/system/cryptsetup-''username''.service|2= |
||
[Unit] |
[Unit] |
||
− | Description=Home Directory for %I |
||
DefaultDependencies=no |
DefaultDependencies=no |
||
+ | BindsTo=dev-''PARTITION''.device |
||
+ | After=dev-''PARTITION''.device |
||
+ | BindsTo=dev-mapper-home\x2d''username''.device |
||
+ | Requires=home-''username''.mount |
||
+ | Before=home-''username''.mount |
||
Conflicts=umount.target |
Conflicts=umount.target |
||
− | IgnoreOnIsolate=true |
||
− | Before=user@%i.service |
||
− | Requires=user@%i.service |
||
− | BindsTo=dev-disk-by\x2duuid-'''c139ae70''\x2d''5861''\x2d''4084''\x2d''84b1''\x2d''7d83f7bb7129'''.device |
||
− | After=dev-disk-by\x2duuid-'''c139ae70''\x2d''5861''\x2d''4084''\x2d''84b1''\x2d''7d83f7bb7129'''.device |
||
Before=umount.target |
Before=umount.target |
||
92行目: | 81行目: | ||
RemainAfterExit=yes |
RemainAfterExit=yes |
||
TimeoutSec=0 |
TimeoutSec=0 |
||
+ | ExecStop=/usr/bin/cryptsetup close home-''username'' |
||
− | ExecStart=/usr/local/bin/securemount user:%i /dev/disk/by-uuid/'''c139ae70-5861-4084-84b1-7d83f7bb7129''' '''/home/xyz''' |
||
− | ExecStop=/usr/local/bin/secureumount '''/home/xyz''' |
||
[Install] |
[Install] |
||
− | RequiredBy= |
+ | RequiredBy=dev-mapper-home\x2d''username''.device |
}} |
}} |
||
+ | {{Note|{{ic|dev-''PARTITION''}} は、{{ic|systemd-escape -p /dev/''PARTITION''}} の結果です。}} |
||
− | 最後に、サービスを有効化してください: |
||
− | # systemctl enable homedir@123.service |
2023年11月2日 (木) 01:17時点における版
関連記事
PAM および systemd を設定して、所有者がログインしたときに dm-crypt 暗号化されたホーム パーティションを自動的にマウントし、ログアウト時にアンマウントするようにすることができます。
このチュートリアルでは、dm-crypt/root 以外のファイルシステムの暗号化 で説明されているように、暗号化されたパーティションがすでに作成されていることを前提としています。
ログイン時にロックを解除する
pam_exec は、ログイン時にデバイスのロックを解除するために使用できます。/etc/pam.d/system-login
を編集し、auth include system-auth
の後に太字で強調された以下の行を追加します。
/etc/pam.d/system-login
... auth include system-auth auth optional pam_exec.so expose_authtok /etc/pam_cryptsetup.sh ...
次に、前述のスクリプトを作成します。
/etc/pam_cryptsetup.sh
#!/bin/sh CRYPT_USER="username" PARTITION="/dev/sdXY" NAME="home-$CRYPT_USER" if [ "$PAM_USER" = "$CRYPT_USER" ] && [ ! -e "/dev/mapper/$NAME" ]; then /usr/bin/cryptsetup open "$PARTITION" "$NAME" fi
スクリプトを 実行可能属性 にします。
自動マウントとアンマウント
systemd-logind は、ユーザーに対して少なくとも 1 つのセッションがアクティブである限り、user@1000.service
を維持します。最初のログイン成功後に自動的に開始され、最後のセッションからのログアウト後に停止されます。したがって、マップされたボリュームの systemd.mount(5) ユニットを作成して 有効化 し、それを user@1000.service
に接続して、次のことを行い、自動的にマウントおよびアンマウントされるようにします。
/etc/systemd/system/home-username.mount
[Unit] Requires=user@1000.service Before=user@1000.service [Mount] Where=/home/username What=/dev/mapper/home-username Type=btrfs Options=defaults,relatime,compress=zstd [Install] RequiredBy=user@1000.service
アンマウント後のロック
アンマウント後もデバイスのロックは解除されたままで、パスワードを再入力せずにマウントすることができます。デバイスのロックが解除されたときに開始され (BindsTo=dev-mapper-home\x2dusername.device
)、デバイスがロック解除された後に停止するサービスを作成して 有効化 できます。アンマウント (Requires,Before=home-username.mount
)、プロセス内でデバイスをロック中 (ExecStop=cryptsetup close
):
/etc/systemd/system/cryptsetup-username.service
[Unit] DefaultDependencies=no BindsTo=dev-PARTITION.device After=dev-PARTITION.device BindsTo=dev-mapper-home\x2dusername.device Requires=home-username.mount Before=home-username.mount Conflicts=umount.target Before=umount.target [Service] Type=oneshot RemainAfterExit=yes TimeoutSec=0 ExecStop=/usr/bin/cryptsetup close home-username [Install] RequiredBy=dev-mapper-home\x2dusername.device