VeraCryptをLinuxでコマンドラインから使う方法 

VeraCryptをLinuxでコマンドラインから使う方法についてのメモです。
Arch Linux環境で動作することを確認しています。

# 説明の前提
デスクトップ環境の端末から操作する場合、コマンド実行時に`-t`または`--text`をつけないとGUIで動作してしまいます。
GUIが動作しない環境ならこのオプションは不要です。

```bash
veracrypt --text
# ↑または↓
veracrypt -t
```

加えて大抵の操作にはroot権限が必要なので、`sudo`が必要なケースも多いです。
以後の説明はこれらを省略しているので、予めご了承ください。

# 暗号化ボリューム作成する

## ファイルコンテナを作る場合

いくつか具体的なオプションパラメータを指定しているので、実際の利用時は適切なものに置き換えてください。

```bash
veracrypt --create --size 64M --keyfiles='' --encryption=AES --hash=SHA-512 --random-source=/dev/random --volume-type=normal --filesystem=none /path/to/container
```

- -c, --create
ボリュームを作成する場合につけるオプション
- --size
例えば64Mだと64メガバイトサイズのファイルコンテナを作成する
単位として`K, KiB, M, MiB, G, GiB, T, TiB`が指定できる
単位指定無しだとバイト単位になる
- --keyfiles
パスワードとは別に鍵ファイルも使いたい場合にパスを指定する
不要なら空文字列を指定する
- --encryption
暗号化アルゴリズムを指定する
例えば`AES`、`Serpent`、`Camellia-Kuznyechik`など
指定できるパラメータは[公式ドキュメントのEncryption Algorithms](https://www.veracrypt.fr/en/Encryption%20Algorithms.html "Encryption Algorithms")の表のAlgorithmの列を参照
- --hash
ハッシュアルゴリズムを指定する
例えば`SHA-256`、`Whirlpool`など
指定できるパラメータは[公式ドキュメントのHash Algorithms](https://www.veracrypt.fr/en/Hash%20Algorithms.html "Hash Algorithms")を参照
- --random-source
乱数源にするファイルのパスを指定する
指定がない場合はユーザがキーボードから適当なランダム文字列を入力するハメになるので結構大変
`/dev/random`で動作が固まる場合は`/dev/urandom`を使えばよいが、その場合は予測可能な擬似乱数が混ざるかも知れないので気にする人は注意
- --volume-type=normal
`normal`（通常ボリューム）または`hidden`（隠しボリューム）を指定する
隠しボリュームを作る場合も通常ボリュームは必要なので、まずは`normal`でOK
- --filesystem
ボリュームのファイルシステムを指定する
後で別途ファイルシステムを指定してフォーマットするので、ここではnoneを指定して何もしない

最後の/path/to/containerはファイルコンテナを生成するパスを指定してください。
またコマンド実行時にパスワードと[PIM](https://www.veracrypt.fr/en/Personal%20Iterations%20Multiplier%20(PIM).html "PIM")の設定を求められるので、適宜設定してください。

この後、ボリューム全体の暗号化が始まります。
サイズによってはかなり待たされます。

## ブロックデバイスを直接暗号化する場合

各オプションの意味はファイルコンテナと同様。
/path/to/device は自分の環境に合わせたものに置き換えてください。
例えば`/dev/sdb2`や`/dev/nvme1n1p2`などです。

```bash
veracrypt --create --keyfiles='' --encryption=AES --hash=SHA-512 --random-source=/dev/random --volume-type=normal --filesystem=none /path/to/device
```

# 暗号化ボリュームを利用する

まず暗号化ボリュームをマウントします。
/path/to/volume は自分の環境に合わせたものに置き換えてください。
例えば`/home/hoge/file_container.vc`や`/dev/sdb2`などです。

```bash
veracrypt --filesystem=none /path/to/volume
```

どこにマウントされたかは以下のコマンドで確認できます。
おそらく`/dev/mapper/veracrypt1`のように`/dev/mapper/`下にマウントされます。

```bash
veracrypt -l
```

続いてマウントしたデバイスをフォーマットします。
少なくともEXT4とXFSで動作することを確認していますが、ここではEXT4を例にあげます。
フォーマット時に設定しているオプションの意味は以下の通り。
- `-E lazy_itable_init=0,lazy_journal_init=0`により高速フォーマットを無効化し、バックグラウンドでのストレージ書き込みを防ぐ
- `-m 1`によりrootの予約領域サイズを全体の1%に設定

```bash
mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 -m 1 /path/to/device
```

フォーマット完了後は一旦アンマウントします。
/path/to/volumeはファイルコンテナや元々のブロックデバイスのパスを指定してください。
面倒なら`veracrypt -d`で全てのボリュームをアンマウントできます。

```bash
veracrypt -d /path/to/volume
```

その後、以下の操作でボリュームをマウントすれば早速利用可能になります。
マウント直後は所有者がrootになっていると思われるので、適宜設定を変更してください。

```bash
veracrypt /path/to/volume /where/to/mount
```

# 隠しボリュームを作る

まず隠しボリュームを隠す[通常の暗号化ボリュームを作成](#暗号化ボリューム作成する)しておきます。
続いて以下の操作を実行します。
各種オプションは適宜変更してください。

```bash
veracrypt --create --keyfiles='' --encryption=Camellia-Kuznyechik --hash=Streebog --random-source=/dev/urandom --volume-type=hidden --filesystem=none --size=32M /path/to/normal/volume
```

ほとんどのオプションは通常ボリューム作成時と同じですが、以下のオプションが異なります。

- --volume-type=**hidden**
隠しボリューム作成時は`hidden`を指定する（通常ボリュームは`normal`）
- --size
必須オプション
通常ボリュームのサイズより小さい値を設定すること

/path/to/normal/volumeは隠しボリュームを隠す通常ボリュームです。
コマンド実行後にパスワードなどが求められるので、隠しボリューム用のものを入力してください。

なお隠しボリューム作成時はボリューム全体の暗号化は行われないので、この操作はすぐ終わります。

# 隠しボリュームを利用する

[通常ボリュームを利用する場合](#暗号化ボリュームを利用する)と同じ操作をすればよいですが、ボリュームマウント時のパスワードは隠しボリュームのものを入力する点には気をつけてください。

# ボリュームをアンマウントする

ボリュームを使用しているプロセスがあるとアンマウント出来ないので、それらのプロセスを落としてください。
`fuser -mv`や`lsof`でボリュームが使用中かどうか確認できます。

まずは以下の操作でどのボリュームがどこにマウントされているか確認します。

```bash
veracrypt -l
```

アンマウントしたいボリュームまたはマウントポイントを指定します。

```bash
veracrypt -d /path/to/volume
# または
veracrypt -d /path/to/mount/point
```

ボリュームまたはマウントポイントを指定しないと、アンマウント可能な全てのVeraCryptボリュームをアンマウントするので注意してください。

# Tips

- HDDを丸々1台暗号化する場合、半日は見ておいたほうがよい
- あまり複雑な暗号化アルゴリズムを採用すると、ディスクI/OよりCPUパワーがボトルネックになってパフォーマンスが落ちる場合がある
- AES-NI拡張命令に対応したIntel/AMD CPUを使うと、AES暗号化のスループットがよくなる
- GUIで利用可能なベンチマーク機能はコマンドラインでは利用できない
  - [ベンチマークを行うbashスクリプト](https://www.pickysysadmin.ca/2016/09/03/veracrypt-cli-benchmark-script/)を作ってくれた人がいる🙏🙏
ただし動作にはある程度環境整備が必要（bcコマンドのインストールとか）