Dm-crypt/ログイン時にマウント

提供: ArchWiki
2020年4月29日 (水) 12:10時点におけるHiromi-mi (トーク | 投稿記録)による版 (文言の微調整, 不要なDISPLAYTITLEの削除)
ナビゲーションに移動 検索に移動

関連記事

PAMsystemd を設定することで、ユーザーがログインしたときに dm-crypt で暗号化されたホームパーティションを自動的にマウントして、ログアウトしたときにアンマウントさせることができます。

以下では dm-crypt/root 以外のファイルシステムの暗号化 を前提にして説明します。

概要

PAM の認証フェイズにユーザーのパスワードを保存して、カーネルのキーリングに配置します。次に、systemd サービスでキーリングを使って、systemd の user@.service が実行される前に、自動的にパーティションの鍵を解除してマウントします。

ユーザーがログアウトしたとき、systemd は user@.service が停止されるため、自動的にサービスも停止され、パーティションがアンマウントされて鍵がかけられます。

ヘルパースクリプト

3つのヘルパースクリプトが必要です:

/usr/local/bin/savepass

PAM によって提供されたパスワードをカーネルのキーリング (root ユーザー) に保存するスクリプト:

/usr/local/bin/savepass
#!/bin/sh
exec keyctl padd user user:`id -u $PAM_USER` @u

/usr/local/bin/securemount

カーネルのキーリングから取得したキーを使って特定のデバイスの鍵を解除して、特定の場所にマウントするスクリプト:

/usr/local/bin/securemount
#!/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

/usr/local/bin/secureumount

暗号化されたデバイスをアンマウントして閉じるスクリプト:

/usr/local/bin/secureumount
#!/bin/sh
set -e
TARGET=$1
DEC_DEVICE=$(cat /proc/mounts | grep " $TARGET " | cut -d " " -f 1)

/usr/bin/umount $TARGET
/usr/bin/cryptsetup close $DEC_DEVICE

PAM の設定

auth optional pam_permit.so の前に auth optional pam_exec.so expose_authtok /usr/local/bin/savepass を追加してください:

/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

account   required  pam_unix.so
account   optional  pam_permit.so
account   required  pam_time.so

password  required  pam_unix.so     try_first_pass nullok sha512 shadow
password  optional  pam_permit.so

session   required  pam_limits.so
session   required  pam_unix.so
session   optional  pam_permit.so

systemd サービス

/etc/systemd/system ディレクトリに新しいサービスファイルを作成してください。123 はユーザーの ID に、/home/xyz はパーティションをマウントしたいパスに、c139ae70\x2d5861\x2d4084\x2d84b1\x2d7d83f7bb7129c139ae70-5861-4084-84b1-7d83f7bb7129 は暗号化したパーティションの UUID に置き換えてください。前者において - 記号は全て \x2d に置き換える必要があるので注意してください。

/etc/systemd/system/homedir@123.service
[Unit]
Description=Home Directory for %I
DefaultDependencies=no
Conflicts=umount.target
IgnoreOnIsolate=true
Before=user@%i.service
Requires=user@%i.service
BindsTo=dev-disk-by\x2duuid-c139ae70\x2d5861\x2d4084\x2d84b1\x2d7d83f7bb7129.device
After=dev-disk-by\x2duuid-c139ae70\x2d5861\x2d4084\x2d84b1\x2d7d83f7bb7129.device
Before=umount.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutSec=0
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]
RequiredBy=user@%i.service

最後に、サービスを有効化してください:

# systemctl enable homedir@123.service