Dm-crypt/ログイン時にマウント
関連記事
PAM と systemd を設定することで、ユーザーがログインしたときに 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\x2d7d83f7bb7129
と c139ae70-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