🦔

USBディスクの一部を暗号化してみました。

2022/11/04に公開

#cryptsetup #luks #crypttab #fstab #ManjaroLinux
2022/11/03

VentoyでISOイメージを起動できるようにしているのですが、Ventoyインストール時に、USBディスクの後半領域に少し余裕を空けているので、その部分を暗号化してみました。

Ventoyをインストールしたデバイスがsdbの場合、
sdb1 Ventoy 起動したいISOイメージをコピーするところ
sdb2 VTOEFI Ventoyのシステムファイルが格納されているところ
sdb3 ここに新たにパーティションを追加して、暗号化します。

主な手順

  1. パーティションの追加
  2. UUIDの確認
  3. キーファイルの作成
  4. 暗号化
  5. 自動マウント設定

パーティションの追加

Ventoyインストール後に、後半に余裕を空けていた領域にパーティションを追加します。
Gpartedなどで後半の空き領域に新規パーティションを追加します。
Filesystemは、未フォーマットでいいです。

UUIDの確認

あとで、/etc/crypttabにUSBディスクをUUIDで指定するために、メモしておきます。

lsblk -f /dev/sdb

出力例

NAME      FSTYPE      FSVER LABEL   UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sdb                                                                             
├─sdb1 exfat  1.0   Ventoy  515C-7C2C                             212.8G     0% /run/media/USERNAME/Ventoy
└─sdb2 vfat   FAT16 VTOYEFI 7CDB-00D9                               4.6M    85% /run/media/USERNAME/VTOYEFI
└─sdb3                      uuid-uuid-uuid-...

キーファイルの作成

暗号化はパスフレーズを入力する方式とキーファイルで復号化する方式の2タイプあります。
今回はキーファイルで暗号化します。

sudo dd bs=512 count=4 if=/dev/urandom of=/etc/mykeyfile
sudo chmod 0400 /etc/mykeyfile

mykeyfileはランダムな文字列です。
人間が覚えにくい推測されにくい文字列を生成させます。
これを適切なデバイスにバックアップしておいてください。
紛失すると復号化できなくなります。

暗号化

USBディスクに作った新しいパーティションを暗号化用にフォーマットします。
/dev/sdb3の部分は適宜、自分の環境に合わせてください。

sudo cryptsetup luksFormat /dev/sdb3 --key-file /etc/mykeyfile

適当な名前で開きます。

sudo cryptsetup luksOpen /dev/sdb3 encrypted_usb --key-file /etc/mykeyfile
ls /dev/mapper

ファイルシステムの作成

sudo mkfs -t ext4 /dev/mapper/encrypted_usb

手動でファイルシステムのマウントのテストを行います。

mkdir -p ~/mount-test
sudo mount /dev/mapper/encrypted_usb ~/mount-test

所有者を一般ユーザーに変更します。

sudo chown -R $USER:$USER ~/mount-test

テスト終了。閉じます。

sudo umount  ~/mount-test
sudo cryptsetup luksClose encrypted_usb

自動マウント設定

USBディスクが差し込まれていたら、自動的に暗号化パーティションをマウントするように設定します。

/etc/crypttab

encrypted_usb	UUID=uuid-uuid-uuid-...	/etc/mykeyfile	nofail,noauto

/etc/fstab

/dev/mapper/encrypted_usb	/home/USERNAME/encrypted_usb	ext4	defaults,noauto,nofail	0	2

crypttabにUUIDを明記して、起動時には必ずしもUSBディスクが接続されていないので、nofail,noautoを指定しておきます。
uuidの文字列の前に”UUID=”を、お忘れなく。
fstabも基本的には同じで、マウントさせたいフォルダの場所を指定しましょう。

上記の2つのファイルを設定して、再起動を行えば、自動でマウントされるかと思います。

再起動してみると、system-cryptsetup-generatorによって、追加されているサービスが、うまく動いているか確認してみましょう。

systemctl status systemd-cryptsetup@encrypted_usb.service 
journalctl -xeu systemd-cryptsetup@encrypted_usb.service

以上で、一応完了です。
今回は、暗号化のパラメータをデフォルト値で行いました。
次のコマンドでキーファイルの数なども確認できるようです。
キーファイルは紛失に備えると複数のほうが、いいのかな?

sudo cryptsetup luksDump /dev/sdb3
lsblk -f /dev/sdb3

出力例

NAME            FSTYPE      FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sdb3            crypto_LUKS 2           fb754562-d2e9-4b1b-844f-93a0f759cbaf                
└─encrypted_usb ext4        1.0         87d1187a-b65d-484a-bd30-a552ae6b0030   18.5G     0% /home/USERNAME/encrypted_usb

試しにfstabの設定を外してみたら、/run/media/USERNAME以下に自動でUUID名でマウントされていました。パーティションにラベルを設定しておくと、/run/media/USERNAME/ラベル名でマウントされるみたいです。
system-cryptsetup-generatorで適切に設定されていると、そうなるのかな?

NAME            FSTYPE      FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sdb3            crypto_LUKS 2           fb754562-d2e9-4b1b-844f-93a0f759cbaf                
└─encrypted_usb ext4        1.0         87d1187a-b65d-484a-bd30-a552ae6b0030   18.5G     0% /run/media/USERNAME/87d1187a-b65d-484a-bd30-a552ae6b0030

これでキーファイルでUSBディスクの一部パーティションを暗号化できました。
問題なく動作してくれているようです。
キーファイルは適切にバックアップしておきましょう。

参考サイト
dm-crypt/デバイスの暗号化 - ArchWiki

Discussion