コンテンツにスキップ

「Dm-crypt/ログイン時にマウント」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
カテゴリを修正
Kgx (トーク | 投稿記録)
情報を更新
5行目: 5行目:
{{Related articles end}}
{{Related articles end}}


[[PAM]] [[systemd]] を設定することでユーザーがログインしたときに [[dm-crypt]] 暗号化されたホームパーティションを自動的にマウントし、ログアウトしたときにアンマウントさせることができます。
[[PAM]] および [[systemd]] を設定して所有者がログインしたときに [[dm-crypt]] 暗号化されたホーム パーティションを自動的にマウントし、ログアウトにアンマウントするようにすることができます。


以下では [[dm-crypt/root 以外のファイルシステムの暗号化]] を前提して説明します。
このチュートリアルでは[[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=user@%i.service
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 以外のファイルシステムの暗号化 で説明されているように、暗号化されたパーティションがすでに作成されていることを前提としています。

ノート
  • ユーザーアカウントと 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)、デバイスがロック解除された後に停止するサービスを作成して 有効化 できます。アンマウント (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
ノート dev-PARTITION は、systemd-escape -p /dev/PARTITION の結果です。