Linuxで暗号化ボリュームを作るためにzuluCryptを使ってみた

使ってみた系の記事を書くのはあまり好きじゃないのですが、日本語の情報が少なかったので投稿します。

## 要件と選定の理由

* ファイルを透過的に暗号化し、ディスクとしてマウントできること
* Linux (Debian) で簡単に使え、WindowsやmacOSでも使えること

この分野のソフトは古くは[TrueCrypt](http://truecrypt.sourceforge.net/)が有名でしたが、2014年に開発が終了し今は後継として[VeraCrypt](https://www.veracrypt.fr/)がよく使われているようです。VeraCryptはLinux版、Windows版、macOS版すべてあるのですが、TrueCryptのフォークでTrueCrypt Licenseを含んでおりソースコードは公開されていますが、オープンソースライセンスとして問題が少しあるためDebian等で公式パッケージが用意されていません。

Debian公式パッケージがあるという条件で見つけたのが[zuluCrypt](http://mhogomchungu.github.io/zuluCrypt/)です。zuluCryptは（今の所）Linux版しかありませんが、標準のLUKSに加え、TrueCrypt、**VeraCrypt**、dm-crypt、BitLockerのボリュームを扱うことができます。そこで暗号化ボリュームとしてVeraCryptを使い、ソフトウェアはLinuxではzuluCrypt、WindowsやmacOSではVeraCryptを使用することとしました。

またファイルシステムとしてはWindowsやmacOSでも使えるように（少々不安が残りますが）NTFSを使用しています。FAT系でないのはシンボリックリンクが使えないためです。

## 使い方

まずzuluCryptはGUIが用意されていますが、GUIは使っていません。あしからず。

zuluCryptを使用するには`zuluCrypt-cli`コマンドを使用します。オプションに癖があって少々分かりづらいですが`man zuluCrypt-cli`のexamplesが参考になると思います。

```
examples:
create volume: zuluCrypt-cli -c -d /dev/sdc1 -z ext4 -t luks -p xxx
open volume  : zuluCrypt-cli -o -d /dev/sdc1 -m sdc1 -e ro -p xxx
close volume ; zuluCrypt-cli -q -d /dev/sdc1
remove key   ; zuluCrypt-cli -r -d /dev/sdc1 -p xxx
add key      : zuluCrypt-cli -a -d /dev/sdc1 -y xxx -l yyy
get device path from mapper  : zuluCrypt-cli -P -d /dev/mapper/zuluCrypt-sdc1
check if partition with UUID is present : zuluCrypt-cli -w -d UUID="d2d210b8-0b1f-419f-9172-9d509ea9af0c"
```

### 暗号化ボリュームの作成

今回は（デバイスではなく）ファイルをVeraCrypt暗号化ボリュームでNTFS（別途ntfs-3gパッケージが必要）で作成したかったので以下のコマンドで作成しました。

```console
$ # 空ファイル作成
$ dd if=/dev/zero of=ファイル bs=10MB count=1

$ # 暗号化ボリュームファイルにする
$ zuluCrypt-cli -c -d ファイル -k -z ntfs -t vcrypt 
```

### 暗号化ボリュームのマウント

マウント（正確には暗号化ボリュームのオープンとマウント）は以下のように実行します。


```console
$ # オープンとマウント
$ zuluCrypt-cli -o -d 暗号化ボリュームファイル -t vcrypt
```

`zuluMount-cli`というマウント・アンマウント専用のコマンドもあるのですが、`zuluCrypt-cli`コマンドでもできるため使用していません。

コマンドを実行すると、`/dev/mappter/zuluCrypt-`で始まるデバイスが作成（オープン）され`/run/media/private/$USER/マウント名`以下にマウントされます。デフォルトのマウント名は（ディレクトリ部分を除いた）暗号化ボリュームファイル名です。マウント名を指定したい場合は、`-m foo`のように指定します。

マウント場所などがこれで良ければこのまま使用できるのですが、マウントオプションとマウント場所を変更したかったので、暗号化ボリュームのオープンとマウントを別々に行っています。

```console
$ # オープン
$ zuluCrypt-cli -O -d 暗号化ボリュームファイル -t vcrypt

$ # マウント
$ mount -t ntfs -o permissions,windows_names /dev/mappter/zuluCrypt-デバイス名 /var/data
```

ただ一つ問題があって、暗号化ボリュームをオープンしたときに作成されるデバイス名を簡単に知る方法がわかりませんでした。一応`-s`オプションでわかるのですが、メッセージの一部なので将来フォーマットが変わる可能性がある気がします。

```console
$ zuluCrypt-cli -s -d 暗号化ボリュームファイル名
/dev/mapper/zuluCrypt-省略 is active and is in use.
 type:          Nil
 cipher:        aes-xts-plain64
 keysize:       512 bits
 offset:        256 sectors / 128.0 KB
 device:        /dev/loop0
 loop:          暗号化ボリュームファイル名
 mode:          read and write
 active slots:  Nil
```

`-L`オプションに*print a list of all opened volumes and their mount point.The list is not formatted*とあるので `zuluCrypt-cli -L` と実行してみましたが、使い方が間違っているのかこちらは何も表示されず。

逆にデバイス名から暗号化ボリュームファイル名を知るのは`zuluCrypt-cli -P -d /dev/mapper/zuluCrypt-デバイス名`で出来たので、`/dev/mapper/zuluCrypt-*`を列挙してファイル名が一致したデバイス名を取得しています。

```sh
get_zulucrypt_device() {
  for device in /dev/mapper/zuluCrypt*; do
    device_path=$(zuluCrypt-cli -P -d "$device")
    [ "$device_path" = "$1" ] && echo "$device" && return 0
  done
  return 1
}
device=$(get_zulucrypt_device 暗号化ボリュームファイル)
```

### 暗号化ボリュームのアンマウント

正確には暗号化ボリュームのアンマウントとクローズです。マウントしたままクローズしようとするとエラーになります。オープンと違って暗号化ボリュームのアンマウントとクローズを同時にやってくれるコマンドはなさそうです。


```console
$ # アンマウント
$ umount /run/media/private/$USER/マウント名

$ # クローズ
$ zuluCrypt-cli -q -d 暗号化ボリュームファイル
```

## さいごに

以上、私が使用した最低限のコマンドだけなので少ないですが、誰かが使用するきっかけになれば幸いです。