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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(カテゴリを修正)
(情報を更新)
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 の結果です。