データドライブをLUKSで暗号化する


やること

  • フルディスク暗号化したい
  • TPM2で自動ロック解除したい
  • 秋葉原でジャンクの1TB HDDを2台買ってきたのででかいデータドライブにしたい

1TB x 2のHDDをLUKSで暗号化してBtrfs

GPTパーティションテーブルを使用します
各ディスクGPTパーティションテーブルを作成し、ディスクサイズいっぱいに1つのパーティションを作成します

LUKSを設定

crtyptsetup luksFormatでLUKSヘッダーを作成します

Terminal window
sudo cryptsetup -v luksFormat /dev/sdg1
[sudo: authenticate] Password:
警告!!
========
/dev/sdg1 のデータを上書きします。戻せません。
よろしいですか? ('yes' を大文字で入力してください): YES
/dev/sdg1 のパスフレーズを入力してください:
同じパスフレーズを入力してください:
キースロット 0 が作成されました。
コマンド成功。
sudo cryptsetup -v luksFormat /dev/sdh1
警告!!
========
/dev/sdh1 のデータを上書きします。戻せません。
よろしいですか? ('yes' を大文字で入力してください): YES
/dev/sdh1 のパスフレーズを入力してください:
同じパスフレーズを入力してください:
データデバイスのおかしな(bogus) optimal-io サイズ (33553920 バイト) は無視します。
キースロット 0 が作成されました。
コマンド成功。

以下のコマンドでLUKSデバイスをマッパーとして開きます

Terminal window
sudo cryptsetup open /dev/sdg1 data-raid1
/dev/sdg1 のパスフレーズを入力してください:
sudo cryptsetup open /dev/sdh1 data-raid2
/dev/sdh1 のパスフレーズを入力してください:

Btrfsを設定

btrfsのデータ領域をRAID0ではなくsingleモードでフォーマットします。
RAID0でもRAID1でもなくsingleモードにすると、ファイルごとに異なるディスクに分散して保存されるようになります。(たぶん)

Terminal window
sudo mkfs.btrfs -f /dev/mapper/data-raid1 /dev/mapper/data-raid2
btrfs-progs v6.17
See https://btrfs.readthedocs.io for more information.
Label: (null)
UUID: 32d0260a-55ea-48a4-8992-7f42edef2f93
Node size: 16384
Sector size: 4096 (CPU page size: 4096)
Filesystem size: 1.82TiB
Block group profiles:
Data: single 8.00MiB
Metadata: RAID1 1.00GiB
System: RAID1 8.00MiB
SSD detected: no
Zoned device: no
Features: extref, skinny-metadata, no-holes, free-space-tree
Checksum: crc32c
Number of devices: 2
Devices:
ID SIZE PATH
1 931.50GiB /dev/mapper/data-raid1
2 931.50GiB /dev/mapper/data-raid2

TPM2で自動ロック解除を設定

systemd-cryptenrollコマンドを使用して、LUKSデバイスにTPM2トークンを登録します

TPM2で自動ロック解除はSecure Bootが無効でも利用できますが、Secure Bootが無効の場合はどのような変更をハードウェアに加えてもPCR7が変更されないため、セキュリティ的にはあまり意味がありません。

Terminal window
sudo systemd-cryptenroll --tpm2-device=list
PATH DEVICE DRIVER
/dev/tpmrm0 MSFT0101:00 tpm_crb
sudo systemd-cryptenroll --tpm2-device=auto /dev/sdg1
🔐 Please enter current passphrase for disk /dev/sdg1: •••••••••••••••
New TPM2 token enrolled as key slot 1.
sudo systemd-cryptenroll /dev/sdg1
SLOT TYPE
0 password
1 tpm2
sudo systemd-cryptenroll --tpm2-device=auto /dev/sdh1
🔐 Please enter current passphrase for disk /dev/sdh1: •••••••••••••••
New TPM2 token enrolled as key slot 1.

自動マウントを設定

/etc/crypttabにLUKSデバイスの設定を追加します

❯ sudo cat /etc/crypttab
# Configuration for encrypted block devices.
# See crypttab(5) for details.
# NOTE: Do not list your root (/) partition here, it must be set up
# beforehand by the initramfs (/etc/mkinitcpio.conf).
# <name> <device> <password> <options>
# home UUID=b8ad5c18-f445-495d-9095-c9ec4f9d2f37 /etc/mypassword1
# data1 /dev/sda3 /etc/mypassword2
# data2 /dev/sda5 /etc/cryptfs.key
# swap /dev/sdx4 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,size=256
# vol /dev/sdb7 none
data-raid1 UUID=9aacc6ed-932b-4ff3-b057-fb80e672ba1a none tpm2-device=auto
data-raid2 UUID=0b17f127-0fc3-45c7-915e-089391fb050e none tpm2-device=auto

fstabに自動マウントの設定を追加します
先程デバイスを2つに跨がってBtrfsをフォーマットしましたが、どちらか1つの任意のデバイスを指定すればBtrfsが他のデバイスも探索してマウントしてくれます

❯ sudo cat /etc/fstab
/dev/mapper/data-raid1 /mnt/enc-data-raid btrfs compress-force=zstd 0 0

まとめ

いかがでしたか?

これはUSB接続のHDDで試しましたが、TPM2で自動ロック解除ができたのでよかったです。