LUKSを(TrueCryptみたいに)仮想ドライブファイルで運用するには
結局開発終了騒ぎのあった TrueCryptはフォークされた のであるが、 このタイミングでLUKS(Linux Unified Key Setup)に触っておこうというお話し。
LUKSは実ドライブのボリューム暗号化で使われることが多いようだが、 今回は TrueCrypt でありがちな運用方法である 仮想ドライブ(ファイル)を使ったものである。
結論は単にループデバイスを介して普通にLUKSの設定をするだけであったが、 メモとして残しておく。
作成
仮想ドライブファイルの作成
まず仮想ドライブファイルとなるファイルを作る。 仮に 1G byte で作るのならば…
$ dd if=/dev/zero of=/path/to/foobar.img bs=1k count=1M
ファイルを置く場所が ext4 などならば fallocate(1) を使って作ってもよい。
$ fallocate -l 1G /path/to/foobar.img
なお本手法ではディスクイメージをそのまま扱う都合上、 可変ドライブに対応しない(対応できない)。 どうしてもというのならば、スパースファイルでも使えばよいと思う。
$ touch /path/to/foobar.img
$ truncate -s 1G /path/to/foobar.img
暗号化仮想ドライブの構築
仮想ドライブファイルをループデバイスに割り当てる。
# losetup /dev/loop0 /path/to/foobar.img
ここでは /dev/loop0 を使っているが また、 /dev/loop* が起動時に生成されない環境の場合は、 mknod(1) を使って予めループデバイスを作成しておくこと。
次に、ループデバイスに対して cryptsetup(1) を実行して LUKS の暗号化の設定をする。 下の例ではデフォルト設定で行っている。
# cryptsetup luksFormat /dev/loop0
WARNING!
========
This will overwrite data on /dev/loop0 irrevocably.
Are you sure? (Type uppercase yes): <kbd>YES</kbd>
Enter passphrase:
Verify passphrase:
#
次に /dev/mapper/foobar にデバイスマッピングしてから、 ファイルシステムを構築する。 この例ではファイルシステムとして ext4 を使っている。
# cryptsetup luksOpen /dev/loop0 foobar
Enter passphrase for /path/to/foobar.img:
# mkfs.ext4 /dev/mapper/foobar
暗号化仮想ドライブのマウント/アンマウント
あとは /dev/mapper/foobar を普通にマウント(mount(1))すればすぐに使える。 使い終わったら普通にアンマウント(umount(1))する。
なおパーミッションなどをこの段階で設定をしておくといいかもしれない。
# mkdir /mnt/foobar
# mount /dev/mapper/foobar /mnt/foobar
# chown 500:500 /mnt/foobar
# umount /mnt/foobar
# rmdir /mnt/foobar
暗号化仮想ドライブの開放
LUKSの開放、ループデバイスの割り当て解除の順番で行う:
# cryptsetup luksClose foobar
# losetup -d /dev/loop0
日常使い
ループデバイスへの割り当てはコマンドラインで行う必要がある:
# losetup /dev/loop0 /path/to/foobar.img
こうした時点で各種 gtk アプリ (厳密には GIO サブシステム) からはドライブと 認識されているので、 USB メモリのような操作感でマウントして使える。 すなわちNautilusといったファイラーやファイルダイアログ(!)から (rootパスワードと暗号化仮想ドライブのパスフレーズの入力を除いて) マウス操作でマウントアンマウントできる。
なおコマンドラインでマウントするには下記のとおりとなる。
# losetup /dev/loop0 /path/to/foobar.img
# cryptsetup luksOpen /dev/loop0 foobar
# mkdir /mnt/foobar
# mount /dev/mapper/foobar /mnt/foobar
アンマウントは下記のとおりとなる。
# umount /mnt/foobar
# rmdir /mnt/foobar
# cryptsetup luksClose foobar
# losetup -d /dev/loop0
ドライブ拡張
ファイルシステムがリサイズに拡張しているならば、 簡単に拡張することができる。 よって、仮想ドライブファイルの容量が足りなくなった場合に そのときに増やすことが可能である。
以下は2G byteに増量する例。
$ truncate -s 2G /path/to/foobar.img
$ su
# losetup /dev/loop0 /path/to/foobar.img
# cryptsetup luksOpen /dev/loop0 foobar
# resize2fs /dev/mapper/foobar
参考文献
- How to create a portable encrypted file system on a loop file
- EncryptedFilesystemsOnRemovableStorage, Ubuntsu Community Help Wiki
- Linux で疎なファイル(sparse file)を使う
- Linuxファイルシステムのサイズ変更とデフラグ, SourceForge.JP Magazine (2003-10-13)