みくにまるのブログ

意識低い系ブロガー、みくにまるが送るブログ。

Linuxで"luks"を使ってホームフォルダを暗号化する方法

ホームフォルダの暗号化、してますか?

Mintなどのインスール時にチェックしたから安心?
実は既存のディストリで使われているecryptfsでの暗号化はあまりセキュリティ上よくない(ログアウトしても丸見えなまま)
パフォーマンスも最悪です。

f:id:mikunimaru:20210605075223p:plain

The Cost Of Home Directory Encryption & LUKS Full Disk Encryption On Ubuntu 18.04 - Phoronix

 

そこでluksを使ってユーザーのホームディレクトリ用の暗号化パーティションを作成して
ログイン時にマウントさせましょう。

この方法なら万が一の故障の場合でも救出が容易でパフォーマンス上もメリットがあります。

 

早速ホームディレクトリの暗号化用のパーティションを作っていく

まずは適当にパーティションを作ってください。
どうせluksでフォーマットするのでファイルシステムは何でもいいです。

今回は仮に作ったパーティション/dev/sda4とします

 

パーティションを暗号化しておく

先程作ったパーティションを暗号化します。

ディストリビューションによってはパッケージが足りない場合があるので適宜インストールしてください。

作業はほぼrootで行うため、sudo suでルート化しておきましょう。

 

暗号化しながらフォーマットします

 cryptsetup luksFormat /dev/sda4

 この際に、パスフレーズはログイン用のパスワードと同一にしてください。

 

暗号化したパーティションを開きます

cryptsetup open /dev/sda4 user

 

暗号化したパーティションをフォーマットします

mkfs.btrfs /dev/mapper/user

今回の例ではBtrfsにしていますが、ファイルシステムは自由に設定してください

 

一旦アンマウントします

umount /mnt/user

 

ここからは対象となるユーザーとは別のユーザーで実行してください

 

既存のホームフォルダを退避させます(ここでは仮にuserとします)

mv  /home/user /home/user.bk

 

新たなホームフォルダを作ります

mkdir /home/user && chown -R user:user /home/user

 

一旦、上記のホームフォルダに暗号化パーティションをマウントしておきます

mount -t btrfs -o compress=zstd /dev/mapper/user /home/user

 

 念の為フォルダの権限を再度変更します

chown -R user:user /home/user

 

バックアップしたフォルダからデータをコピーします

sudo -u user rsync -ar /home/user.bk/ /home/user/

 

ログイン時に自動的にマウントするように設定しておく(ついでにログアウト時のアンマウントも設定する)

余談ですが、Arch wikiの情報が古いのでArch wikiを参考にすると失敗しました。(執筆時点)
以下は改良済みの方法です。

 

/etc/pam.d/system-loginを編集する

auth       include    system-auth
auth       optional   pam_exec.so expose_authtok /etc/pam_cryptsetup.sh

 

/etc/pam_cryptsetup.shに以下のスクリプトを作成

#!/usr/bin/env bash

CRYPT_USER="ユーザー名"
PARTITION="/dev/sda4" # 暗号化したパーティション
NAME="home-$CRYPT_USER"

if [[ "$PAM_USER" == "$CRYPT_USER" && ! -e "/dev/mapper/$NAME" ]]; then
/usr/bin/cryptsetup open "$PARTITION" "$NAME"
fi

 

上記のスクリプトに実行権限を付与

chmod +x /etc/pam_cryptsetup.sh

 

ユーザーのidを確認します

id user


今回はユーザー名に特殊文字があると失敗するので
念の為文字が問題ないか確認してエスケープしてください。

systemd-escape -p ユーザー名


/etc/systemd/home-ユーザー名.mountにサービスを作成(今回はユーザーのidが1000としています)
[Unit]
Requires=user@1000.service
Before=user@1000.service

[Mount]
Where=/home/ユーザー名
What=/dev/mapper/home-ユーザー名
Type=btrfs
Options=defaults,relatime,compress=zstd

[Install]
RequiredBy=user@1000.service

 

サービスを有効化します

systemctl enable /etc/systemd/home-ユーザー名.mount

 

/etc/systemd/system/cryptsetup-ユーザー名.serviceに以下を作成
[Unit]
DefaultDependencies=no
BindsTo=dev-暗号化したパーティション.device
After=dev-暗号化したパーティション.device
BindsTo=dev-mapper-home\x2dユーザー名.device
Requires=home-ユーザー名.mount
Before=home-ユーザー名.mount
Conflicts=umount.target
Before=umount.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutSec=0
ExecStop=/usr/bin/cryptsetup close home-ユーザー名

[Install]
RequiredBy=dev-mapper-home\x2dユーザー名.device

 

サービスを有効化します

 systemctl enable cryptsetup-ユーザー名.service

 

 

あとは再起動すれば完了!!!!