Linuxにおけるセキュアなファイルシステム

2005年4月1日から個人情報保護法が発効します.大事なものを暗号化しましょう.

このページは,Linuxにおいて,暗号化によるセキュアなファイルシステムを紹介します.Mike ChiricoのチュートリアルMike Petersの解説を参考にしました.なお,他のLinux distributionでも原理が同じですが,Fedora Core 3でしか確認しておりません.

ファイルによるファイルシステム,暗号なし

概要:(普通の)ファイルでファイルシステムを作ります.

  1. ファイルを作っておく.
        $ dd if=/dev/zero of=disk.img bs=1M count=10
        読み込んだブロック数は 10+0
        書き込んだブロック数は 10+0
  2. ファイルシステムを作る(=フォーマットする).
        $ /sbin/mkfs.ext3 -F -q disk.img
        max_blocks 10485760, rsv_groups = 1280, rsv_gdb = 39
        inode.i_blocks = 158, i_size = 67383296
  3. スーパユーザ権限でマウント/アンマウントする.
        # mount -o loop disk.img /mnt
        ...(/mntにおいて作業を行なう)
        # umount /mnt

注:ファイルサイズ(容量)は作成する時に調節します.例えばcount=100とすると100Mのファイルができます.ファイルシステムのフォーマット(/sbin/mkfs.*のどれでもよい)やマウントポイント(/mnt)は自分の都合に合わせます.

暗号化方法 1

一番簡単なのは,以上で作ったファイルに対して,使うときに暗号を解除する/終ったら暗号をかけておく方法です.暗号強度,スピード,OSへの(非)依存性,使いやすさなどの理由から,ぼくは ccrypt が好きです.インストールは,パッケージをダウンロードしてrpm -Uvhでインストールするだけです.以下,使い方を説明します.

この方法は,ファイルを気軽にコピーできますから,かなり便利だと思います.例えばyahooのブリーフケースで保存したり,(ウェブ)メールに添附して送ったりすることが安心してできます.しかし,暗号をかけるのを忘れたら(偶にあるでしょう)意味がないし,ちょっと面倒でもありますね.以下別の方法,マウント/アンマウントの時に自動的に暗号を解除/かける方法を説明します.

暗号化方法 2

現在多くのLinux上で使える方法を紹介します.ただ,古いので,なるべく次の暗号化方法 3 を使いましょう.

  1. ファイルを作っておく.
        $ dd if=/dev/zero of=disk.img bs=1M count=10
        読み込んだブロック数は 10+0
        書き込んだブロック数は 10+0
  2. スーパユーザ(以下同様)権限でループデバイスにセットする,
        # /sbin/losetup -e aes /dev/loop0 disk.img
        パスワード:(暗号キーを入力)
  3. ループデバイス(イメージファイルではない!)をフォーマットする.
        # /sbin/mkfs.exts -F -q /dev/loop0
        max_blocks 10485760, rsv_groups = 1280, rsv_gdb = 39
        inode.i_blocks = 158, i_size = 67383296
  4. マウントする.
        # mount -o loop,encryption=aes disk.img /mnt
        パスワード:(暗号キーを入力)
    オプションencryption=aesを使わなかった,あるいは間違ったパスワードを入力した場合,
       mount: ファイルシステムタイプを指定する必要があります
    となります.これはタイプを指定したらマウントできるわけではありません.マウントはできません.
  5. アンマウントする.
        # umount /mnt
  6. ループデバイスから切り放す.
        # /sbin/losetup -d /dev/loop0

注:ループデバイス(/dev/loop*)は,使われていないものを使います(コマンドラインmountで確認できます).また,アンマウントもループデバイスからの切り放しもシステム終了の時に自動的に行なわれます.

暗号化方法 3

前の暗号化方法 2 (cryptoloopを使っています)はobsoleteとなっています.できればdm_cryptという方法を使いましょう(上記の参考URIを参照).これは,Fedora Core 3ならデフォールトで(?)使えます.

  1. やはり最初にファイルを作っておく.
        $ dd if=/dev/zero of=disk.img bs=1M count=10
        読み込んだブロック数は 10+0
        書き込んだブロック数は 10+0
  2. スーパユーザ(以下同様)権限でループデバイスにセットする.
        # /sbin/losetup /dev/loop0 disk.img
  3. 次に,ループデバイスから暗号化デバイス(diskなら/dev/mapper/diskになる)を作成する.
        # /sbin/cryptsetup create disk /dev/loop0
        Enter passphrase: (暗号キーを入力)
  4. フォーマットする.
        # /sbin/mkfs.ext3 -q /dev/mapper/disk
  5. マウント/アンマウントする.
        # mount /dev/mapper/disk /mnt
        # umount /mnt
  6. デバイスを削除する.
        # /sbin/cryptsetup remove disk
  7. ループデバイスから切り放す.
        # /sbin/losetup -d /dev/loop0

注:デバイスはディレクトリ/dev/mapperの下に作成されます.名前が重複しないよう注意しましょう.一旦作成されたら,削除しない限り,デバイスはずっと存在します.マウントの時に暗号キーの入力は要りません.デバイスを再度作成する際に,一回目に設定した暗号キーを入力します.入力が間違っても作成されますが,中身がおかしくなりますので,マウントは

   mount: ファイルシステムタイプを指定する必要があります
となり,失敗します.なお,システム終了時,アンマウントやデバイスの削除やループデバイスからの切り放しも自動的に行なわれます.言い換えれば,使うには再度デバイスを作成する必要があります.

注:

パフォーマンス

せっかくですから,パフォーマンスを測ってみました.システムのキャッシュなどの情况によって大きく変わることがあるので,あまり真剣に考えないでほしいですが,一応ご参考に.テスト環境は,Athlon64 3200+,メモリ 1G,スワップ 2G,ハードディスク Maxtor 6Y080L0,Fedora Core 3,ファイルシステム全部 reiserfs です.ベンチマークソフトは hdbench clone を用いました.

読み込み/書き出し速度(ハードディスク)
暗号テストサイズ読み込み(KB/s)書き出し(KB/s)
なし1024M5015642395
100M68089344393
10M69905044243
1M52428895325
aes-cbc-plain 256 bits1024M2930722187
100M68985219421
10M65536014093
1M52428813797

具体的の数値は環境によって大きく変わりますが,以上のテストでは,暗号化によって,キャッシュの効く読み込みの速度はあまり変わらないが,キャッシュの効かない読み込みや書き込みの速度は約1/2から1/3に落ちて妥当な結果になっています.それにしても 15MB/s 程度なので普段問題ないでしょう.

読み込み/書き出し速度(ファイル+ループデバイス)
暗号テストサイズ読み込み(KB/s)書き出し(KB/s)
なし1024M3891920250
100M659481219827
10M655360243854
1M1048576209715
aes-cbc-plain 256 bits1024M277809206
100M68534324724
10M65536013797
1M10485761361

いい加減な数値が多くて困りました...暗号化なしの場合,メモリに入るサイズだと読み込みも書き出しもとんでもない速くなっています.暗号化ありの場合,大体普通の速度とみられます.ハードディスクの場合と比べていい勝負? 興味深い? とか,と思います.いずれにしろ,10MB/sの速度以上なので,ぼくには十分ですね.

補足:USBフラッシュメモリはよく使われるようになりましたね.ちょうどeleve社のHandyBitが届いたのでついでに速度を測ってみました.ファイルシステムはFAT,暗号化なしです.

HandyBit 1G (E-H2-010G) FAT, Fedora Core 3,速度測定
測定ソフト読込み(MB/s)書き込み(MB/s)
hdbence clone750 -- 78015 -- 17
hdparm -Tt1250 -- 130019 -- 20
cp30014

eleve社のページをみてみたら,Win$s 2000上のテストでは読込みも書き込みも5MB/s程度でした.えーあんなにLinuxにおける成績が優秀なのだから,宣伝するならLinuxの結果を載せたら,eleve社さん?