Linuxにおけるセキュアなファイルシステム
2005年4月1日から個人情報保護法が発効します.大事なものを暗号化しましょう.
このページは,Linuxにおいて,暗号化によるセキュアなファイルシステムを紹介します.Mike ChiricoのチュートリアルとMike Petersの解説を参考にしました.なお,他のLinux distributionでも原理が同じですが,Fedora Core 3でしか確認しておりません.
ファイルによるファイルシステム,暗号なし
概要:(普通の)ファイルでファイルシステムを作ります.
- ファイルを作っておく.
$ dd if=/dev/zero of=disk.img bs=1M count=10 読み込んだブロック数は 10+0 書き込んだブロック数は 10+0
- ファイルシステムを作る(=フォーマットする).
$ /sbin/mkfs.ext3 -F -q disk.img max_blocks 10485760, rsv_groups = 1280, rsv_gdb = 39 inode.i_blocks = 158, i_size = 67383296
- スーパユーザ権限でマウント/アンマウントする.
# mount -o loop disk.img /mnt ...(/mntにおいて作業を行なう) # umount /mnt
注:ファイルサイズ(容量)は作成する時に調節します.例えばcount=100とすると100Mのファイルができます.ファイルシステムのフォーマット(/sbin/mkfs.*のどれでもよい)やマウントポイント(/mnt)は自分の都合に合わせます.
暗号化方法 1
一番簡単なのは,以上で作ったファイルに対して,使うときに暗号を解除する/終ったら暗号をかけておく方法です.暗号強度,スピード,OSへの(非)依存性,使いやすさなどの理由から,ぼくは ccrypt が好きです.インストールは,パッケージをダウンロードしてrpm -Uvhでインストールするだけです.以下,使い方を説明します.
- ccryptでファイルに暗号をかける.
$ ccencrypt disk.img Enter encryption key:(暗号キーを入力) Enter encryption key: (repeat)(もう一回)
オリジナルのファイルは削除されて,disk.img.cptは暗号化されたファイルとなります. - ccryptでかけた暗号を解除する.
$ ccdecrypt disk.img.cpt Enter decryption key:(暗号キーを入力)
オリジナルのファイルdisk.imgに復元されます.暗号キーが間違ったら復元できません.
この方法は,ファイルを気軽にコピーできますから,かなり便利だと思います.例えばyahooのブリーフケースで保存したり,(ウェブ)メールに添附して送ったりすることが安心してできます.しかし,暗号をかけるのを忘れたら(偶にあるでしょう)意味がないし,ちょっと面倒でもありますね.以下別の方法,マウント/アンマウントの時に自動的に暗号を解除/かける方法を説明します.
暗号化方法 2
現在多くのLinux上で使える方法を紹介します.ただ,古いので,なるべく次の暗号化方法 3 を使いましょう.
- ファイルを作っておく.
$ dd if=/dev/zero of=disk.img bs=1M count=10 読み込んだブロック数は 10+0 書き込んだブロック数は 10+0
- スーパユーザ(以下同様)権限でループデバイスにセットする,
# /sbin/losetup -e aes /dev/loop0 disk.img パスワード:(暗号キーを入力)
- ループデバイス(イメージファイルではない!)をフォーマットする.
# /sbin/mkfs.exts -F -q /dev/loop0 max_blocks 10485760, rsv_groups = 1280, rsv_gdb = 39 inode.i_blocks = 158, i_size = 67383296
- マウントする.
# mount -o loop,encryption=aes disk.img /mnt パスワード:(暗号キーを入力)
オプションencryption=aesを使わなかった,あるいは間違ったパスワードを入力した場合,mount: ファイルシステムタイプを指定する必要があります
となります.これはタイプを指定したらマウントできるわけではありません.マウントはできません. - アンマウントする.
# umount /mnt
- ループデバイスから切り放す.
# /sbin/losetup -d /dev/loop0
注:ループデバイス(/dev/loop*)は,使われていないものを使います(コマンドラインmountで確認できます).また,アンマウントもループデバイスからの切り放しもシステム終了の時に自動的に行なわれます.
暗号化方法 3
前の暗号化方法 2 (cryptoloopを使っています)はobsoleteとなっています.できればdm_cryptという方法を使いましょう(上記の参考URIを参照).これは,Fedora Core 3ならデフォールトで(?)使えます.
- やはり最初にファイルを作っておく.
$ dd if=/dev/zero of=disk.img bs=1M count=10 読み込んだブロック数は 10+0 書き込んだブロック数は 10+0
- スーパユーザ(以下同様)権限でループデバイスにセットする.
# /sbin/losetup /dev/loop0 disk.img
- 次に,ループデバイスから暗号化デバイス(diskなら/dev/mapper/diskになる)を作成する.
# /sbin/cryptsetup create disk /dev/loop0 Enter passphrase: (暗号キーを入力)
- フォーマットする.
# /sbin/mkfs.ext3 -q /dev/mapper/disk
- マウント/アンマウントする.
# mount /dev/mapper/disk /mnt # umount /mnt
- デバイスを削除する.
# /sbin/cryptsetup remove disk
- ループデバイスから切り放す.
# /sbin/losetup -d /dev/loop0
注:デバイスはディレクトリ/dev/mapperの下に作成されます.名前が重複しないよう注意しましょう.一旦作成されたら,削除しない限り,デバイスはずっと存在します.マウントの時に暗号キーの入力は要りません.デバイスを再度作成する際に,一回目に設定した暗号キーを入力します.入力が間違っても作成されますが,中身がおかしくなりますので,マウントは
mount: ファイルシステムタイプを指定する必要がありますとなり,失敗します.なお,システム終了時,アンマウントやデバイスの削除やループデバイスからの切り放しも自動的に行なわれます.言い換えれば,使うには再度デバイスを作成する必要があります.
注:
- いずれの方法でも,指定ファイルから暗号キーを読みこむことができますので,自動スクリプトに使えます(例えばシステム起動時に自動マウントしたりすることができます).
- ファイルではなく,ハードディスクやUSBフラッシュメモリなど物理的デバイスを使うことができます.というか,ループデバイスが要らないからもっと簡単になります.暗号化方法 3 で,cryptsetupの引数にデバイス名を指定すればOK(ファイルの作成やlosetupの部分は要りません).
パフォーマンス
せっかくですから,パフォーマンスを測ってみました.システムのキャッシュなどの情况によって大きく変わることがあるので,あまり真剣に考えないでほしいですが,一応ご参考に.テスト環境は,Athlon64 3200+,メモリ 1G,スワップ 2G,ハードディスク Maxtor 6Y080L0,Fedora Core 3,ファイルシステム全部 reiserfs です.ベンチマークソフトは hdbench clone を用いました.
読み込み/書き出し速度(ハードディスク)暗号 | テストサイズ | 読み込み(KB/s) | 書き出し(KB/s) |
なし | 1024M | 50156 | 42395 |
〃 | 100M | 680893 | 44393 |
〃 | 10M | 699050 | 44243 |
〃 | 1M | 524288 | 95325 |
aes-cbc-plain 256 bits | 1024M | 29307 | 22187 |
〃 | 100M | 689852 | 19421 |
〃 | 10M | 655360 | 14093 |
〃 | 1M | 524288 | 13797 |
具体的の数値は環境によって大きく変わりますが,以上のテストでは,暗号化によって,キャッシュの効く読み込みの速度はあまり変わらないが,キャッシュの効かない読み込みや書き込みの速度は約1/2から1/3に落ちて妥当な結果になっています.それにしても 15MB/s 程度なので普段問題ないでしょう.
読み込み/書き出し速度(ファイル+ループデバイス)暗号 | テストサイズ | 読み込み(KB/s) | 書き出し(KB/s) |
なし | 1024M | 38919 | 20250 |
〃 | 100M | 659481 | 219827 |
〃 | 10M | 655360 | 243854 |
〃 | 1M | 1048576 | 209715 |
aes-cbc-plain 256 bits | 1024M | 27780 | 9206 |
〃 | 100M | 685343 | 24724 |
〃 | 10M | 655360 | 13797 |
〃 | 1M | 1048576 | 1361 |
いい加減な数値が多くて困りました...暗号化なしの場合,メモリに入るサイズだと読み込みも書き出しもとんでもない速くなっています.暗号化ありの場合,大体普通の速度とみられます.ハードディスクの場合と比べていい勝負? 興味深い? とか,と思います.いずれにしろ,10MB/sの速度以上なので,ぼくには十分ですね.
補足:USBフラッシュメモリはよく使われるようになりましたね.ちょうどeleve社のHandyBitが届いたのでついでに速度を測ってみました.ファイルシステムはFAT,暗号化なしです.
HandyBit 1G (E-H2-010G) FAT, Fedora Core 3,速度測定測定ソフト | 読込み(MB/s) | 書き込み(MB/s) |
hdbence clone | 750 -- 780 | 15 -- 17 |
hdparm -Tt | 1250 -- 1300 | 19 -- 20 |
cp | 300 | 14 |
eleve社のページをみてみたら,Win$s 2000上のテストでは読込みも書き込みも5MB/s程度でした.えーあんなにLinuxにおける成績が優秀なのだから,宣伝するならLinuxの結果を載せたら,eleve社さん?