Linuxで"luks"を使ってホームフォルダを暗号化する方法
ホームフォルダの暗号化、してますか?
Mintなどのインスール時にチェックしたから安心?
実は既存のディストリで使われているecryptfsでの暗号化はあまりセキュリティ上よくない(ログアウトしても丸見えなまま)
パフォーマンスも最悪です。
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
あとは再起動すれば完了!!!!