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


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

[Ventoy](https://www.ventoy.net/en/index.html)で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で指定するために、メモしておきます。
```sh
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タイプあります。
今回はキーファイルで暗号化します。
```sh
sudo mkdir -p /etc/cryptsetup-keys.d/

sudo dd bs=512 count=4 if=/dev/urandom of=/etc/cryptsetup-keys.d/encrypted_usb.key
sudo chmod 0400 /etc/cryptsetup-keys.d/encrypted_usb.key
```
key fileはランダムなバイナリーデータ（文字列）です。
人間が覚えにくい推測されにくい文字列を生成させます。
これを適切なデバイスにバックアップしておいてください。
紛失すると復号化できなくなります。

## 暗号化
USBディスクに作った新しいパーティションを暗号化用にフォーマットします。
/dev/sdb3の部分は適宜、自分の環境に合わせてください。
```sh
sudo cryptsetup luksFormat /dev/sdb3 --key-file /etc/cryptsetup-keys.d/encrypted_usb.key
```
適当な名前で開きます。
```sh
sudo cryptsetup luksOpen /dev/sdb3 encrypted_usb --key-file /etc/cryptsetup-keys.d/encrypted_usb.key
ls /dev/mapper
```

ファイルシステムの作成
```sh
sudo mkfs -t ext4 /dev/mapper/encrypted_usb
```

手動でファイルシステムのマウントのテストを行います。
```sh
mkdir -p ~/mount-test
sudo mount /dev/mapper/encrypted_usb ~/mount-test
```

所有者を一般ユーザーに変更します。
```sh
sudo chown -R $USER:$USER ~/mount-test
```

テスト終了。閉じます。
```sh
sudo umount  ~/mount-test
sudo cryptsetup luksClose encrypted_usb
```

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

/etc/crypttab
```
encrypted_usb   UUID=uuid-uuid-uuid-...     /etc/cryptsetup-keys.d/encrypted_usb.key    nofail,auto
```

crypttabにUUIDを明記して、起動時には必ずしもUSBディスクが接続されていないので、nofail,noautoを指定しておきます。
エラーがでても、弊害がないのでautoに変更しました。

uuidの文字列の前に”UUID=”を、お忘れなく。
fstabも基本的には同じで、マウントさせたいフォルダの場所を指定しましょう。

systemd-cryptsetup-generatorによって、追加されているサービスが、うまく動いているか確認してみましょう。
```sh
systemctl daemon-reload
systemctl start systemd-cryptsetup@encrypted_usb.service 
```

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

USBディスクを接続した状態でLabel名をつけておきます。
```sh
sudo e2label /dev/mapper/encrypted_usb Encrypted
sync
```
ディスクを一度取り外し、再接続しなおすと、新しいLABEL名でマウントされるかと思います。

```sh
lsblk -f /dev/sdb3
```
```
NAME            FSTYPE      FSVER LABEL     UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sdb3            crypto_LUKS 2               fb754562-d2e9-4b1b-844f-93a0f759cbaf                
└─usb_encrypted ext4        1.0   Encrypted 87d1187a-b65d-484a-bd30-a552ae6b0030   18.3G     1% /run/media/USERNAME/Encrypted
```
Label名なしだど、UUIDの値でマウントされます。
```sh
NAME         FSTYPE   FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sdb3         crypto_L 2           fb754562-d2e9-4b1b-844f-93a0f759cbaf                
└─encrypted_usb
             ext4     1.0         87d1187a-b65d-484a-bd30-a552ae6b0030   18.3G     1% /run/media/phoepsilonix/87d1187a-b65d-484a-bd30-a552ae6b0030
```

USBディスクが接続されたら、systemctl daemon-reloadの実行と、systemd-cryptsetup@encrypted_usbサービスの起動を設定します。UUIDは自分のディスクのものに、置き換えてください。
```sh
echo 'ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_UUID}=="fb754562-d2e9-4b1b-844f-93a0f759cbaf", RUN+="/usr/bin/systemctl daemon-reload",RUN+="/usr/bin/systemctl start systemd-cryptsetup@encrypted_usb.service"' | sudo tee -a /etc/udev/rules.d/99-cryptsetup.rules
```

次のコマンドで、cryptsetupの依存関係が確認できます。いずれかが●ではなく◯マークだと依存関係が満たされていないということで、起動に失敗すると思います。
依存関係を満たすために、daemon-reloadを追加しましたが、もっといい方法もありそうです。環境によっては不要でしょう。
私の環境では、USB接続をしたまま再起動しても、USB接続を外して再起動し、起動後にUSBを接続しても、暗号化したパーティションも鍵ファイルでマウントできるようになりました。（マウント時にユーザーのパスワード入力が求められました。）
```sh
systemctl list-dependencies systemd-cryptsetup@encrypted_usb.service
```
サービスの状態
```sh
systemctl status systemd-cryptsetup@encrypted_usb.service
```
ログ
```sh
journalctl -b -xe -f -u systemd-cryptsetup@encrypted_usb.service
```

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

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

# 参考サイト
[dm-crypt/デバイスの暗号化 - ArchWiki](https://wiki.archlinux.jp/index.php/Dm-crypt/%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96)
[linuxでディスクのラベルの確認と変更方法まとめ。 - それマグで！](https://takuya-1st.hatenablog.jp/entry/2023/02/07/002125)