某所に書いたネタなんだけど備忘録として一応こちらにも書いておく。以前に LVM に新しく暗号化 LVM を追加する話を書いたがそれにも関連する。
巷にはディスクを暗号化するソフトウェア製品がいくつかあるが Linux カーネルには暗号化の仕様である LUKS を実装した dm-crypt というサブシステムがあり、既定でディスク暗号化をする能力がある。またその性能も良好である。
サードパーティー製品としてはオープンソースソフトウェアの TrueCrypt が有名ではあるが、現段階では大きな脆弱性が無いことが第三者期間によって監査されているものの、今後の開発継続性に問題があるなど将来が危ぶまれている。メンテナンスの継続性を考慮すると Linux カーネルを利用するのが良いだろう。ちなみに OS X Yosemite で TrueCrypt が使えないという報告がさっそくあるが、バージョンチェックに失敗するだけで機能としては問題がないので、バージョンチェックを回避するようコードを修正するとか、パッケージの中身を個別にインストールするなどすれば問題なく利用することができる。
要件
システムに接続し必要に応じて切り離せる可搬性を確保した暗号化デバイス上に ext4 ファイルシステムを生成し利用する。デバイスは /dev/sdb とする。
生成
あらかじめデバイスを乱数で埋めておく。
1 | shred -n 1 -v /dev/sdb |
luksFormat しディスクに暗号化領域を生成する。
大文字で YES を応答し、パスフレーズを 2 回入力する。
1 | cryptsetup luksFormat -c aes-cbc-essiv:sha256 -s 256 /dev/sdb |
デバイスをシステムに接続する。
1 | cryptsetup luksOpen /dev/sdb sdb_crypt |
暗号化領域を ext4 ファイルシステムでフォーマットする。
1 | mkfs -t ext4 /dev/mapper/sdb_crypt |
これで生成は完了する。
利用開始
利用を開始するときはデバイスをシステムに接続する。
この操作によってデバイスマッパー (/dev/mapper/sdb_crypt) が作られる。
1 | cryptsetup luksOpen /dev/sdb sdb_crypt |
デバイスマッパーをファイルシステムとしてマウントする。
1 | mount /dev/mapper/sdb_crypt ~/mnt/sdb |
あとは普通に読み書きする。
利用終了
ファイルシステムをアンマウントし、デバイスをシステムから切り離す。
この操作によってデバイスマッパーはシステムから消去される。
1 2 | umount ~/mnt/sdb cryptsetup luksClose sdb_crypt |
これで暗号化されたディスクを取り外すことができる。
接続の自動化
以下はおまけである。
場合によっては毎回手動でパスフレーズを入力しマウントする作業が煩わしいケースもある。そのような時は接続を自動化できる。
普段利用する際、システム起動時に自動認識させるにはキーファイルを使う。
まずはあらかじめキーファイルを生成しておく。
1 2 | dd if=/dev/random of=/etc/lvm/lvm.seckey bs=1 count=32 chmod 400 /etc/lvm/lvm.seckey |
暗号化領域のフォーマット直後に luksAddKey でキーファイルを追加する。
1 | cryptsetup luksAddKey /dev/sdb /etc/lvm/lvm.seckey |
キーファイルを指定してデバイスマッパーを生成する。
1 | cryptsetup --key-file /etc/lvm/lvm.seckey luksOpen /dev/sdb sdb_crypt |
UUID を確認する。
1 | cryptsetup luksDump /dev/sdb |
/etc/crypttab に自動接続設定をする。
1 | sdb_crypt UUID=XXXX /etc/lvm/lvm.seckey luks |
あとは /etc/fstab にファイルシステムの自動マウント設定をしておく。
1 | /dev/mapper/sdb_crypt /mnt/sdb ext4 errors=remount-ro 0 1 |
システムからディスクを切り離すときにはこれらの自動接続設定を解除しなければならない。
当然ながら可搬性に対してはトレードオフとなる。