「Dm-crypt/ログイン時にマウント」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) カテゴリを修正 |
Kusanaginoturugi (トーク | 投稿記録) カテゴリの修正 |
||
| (2人の利用者による、間の4版が非表示) | |||
| 1行目: | 1行目: | ||
[[Category:デ |
[[Category:保存データ暗号化]] |
||
[[en:Dm-crypt/Mounting at login]] |
[[en:Dm-crypt/Mounting at login]] |
||
[[es:Dm-crypt (Español)/Mounting at login]] |
|||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|pam_mount}} |
{{Related|pam_mount}} |
||
{{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=ExecStop=cryptsetup close}})、デバイスがアンマウントされた後に終了する ({{ic|1=Requires,Before=home-''username''.mount}}) ようなサービスを作成して[[有効化]]することができます: |
|||
{{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行目: | 82行目: | ||
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 |
|||
2024年6月8日 (土) 13:48時点における最新版
関連記事
PAM および systemd を設定して、所有者がログインしたときに dm-crypt 暗号化されたホーム パーティションを自動的にマウントし、ログアウト時にアンマウントするようにすることができます。
このチュートリアルでは、dm-crypt/root 以外のファイルシステムの暗号化 で説明されているように、暗号化されたパーティションがすでに作成されていることを前提としています。
- ユーザーアカウントと LUKS のパスワードは同じにする必要があります。
- すべての例で、
usernameをユーザー名に、1000をユーザー ID に、PARTITIONを次のように置き換えます。暗号化されたパーティションのデバイスの名前。
ログイン時にロックを解除する
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)、その途中でデバイスをロックし (ExecStop=cryptsetup close)、デバイスがアンマウントされた後に終了する (Requires,Before=home-username.mount) ようなサービスを作成して有効化することができます:
/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
dev-PARTITION は、systemd-escape -p /dev/PARTITION の出力結果です。