用途別の暗号化手法

以下のテキストは、執筆時当時の情報を元に書いたものであり、 現在の情勢にそぐわないことを含む場合があるので注意されたい。 また、テキストは最終提出原稿で校正を経る前のものなので、実際にOSM 本誌に記載されたものとは異なる。誤字脱字等そのままである。

致命的な誤り以外は加筆修正等は行なわないので情報の鮮度に気をつけつつ 利用して欲しい。

目次


======================================================================
Part 2 用途別の暗号化手法
======================================================================

■
■不十分な情報漏洩対策
■

リモートログインにSSH、オンライン決済にHTTPSなど、重要な通信に暗号化プロ
トコルを使うのは常識となった。

	「クレジットカード番号を入力するときにはブラウザの鍵マークが
	閉じているのを確認してから」

というのはエンドユーザにも浸透している。しかしその先はどうだろう。

インターネットには悪意を持った者がうようよいるという意識により通信路の暗
号化に配慮している人は多い。しかし、データを保存した媒体を物理的に奪われ
る、つまり窃盗された場合にまで及んで情報保護を考えなければ不十分だ。

自分の情報が洩れただけなら恥ずかしい思いをするだけで済むかもしれないが、
持ち歩いているラップトップPCに仕事関連のファイルを入れたまま盗難に遭った
としたら目も当てられない。PCだけでなく、職も失いかねない。

Part2ではストレージに保存するファイルの暗号化について、利用局面に即した
手法を解説する。


■
■ファイル暗号化の層
■

データはファイルに格納され、ファイルはファイルシステムに格納され、
ファイルシステムは論理ディスク内に作成され、論理ディスクは物理ディスク
(ストレージ)内に確保される。暗号化はその全ての層で行なうことが考えられる。

【表 い】の「ファイル単位での暗号化」はもっとも手軽な方法で、秘密性の高
いファイル(群)を利用時につねに暗号化/復号化して利用する方法だ。有名なも
のにzipコマンド(後述)による、暗号化アーカイブがそれにあたる。

保護したいファイルやディレクトリが少ない場合は、「ファイル単位での暗号化」
で構わないが、多くなればなるほど暗号化/復号化の手間がかかるので、暗号化し
たい対象が多くなるほど【表 い】の下に書かれた層での暗号化が適することに
なる。ただし、当然のことだが復号化された状態の持続時間は下に行けば行くほ
ど長くなる傾向があるので、部外者が触れないように注意したり、複数の層の暗
号化を組み合わせるなどして、復号化状態が人目に曝されないように注意する必
要がある。


---[表 い]------------------------------------------------------------------

 -------------------+-----------------------------------------------------
                    |特徴     |・手軽
  ファイル単位での  |         |・その都度パスワード入力する手間あり
   暗号化           |	      |・どの媒体にコピーしても安全性不変
		    |	      |
		    |---------+-----------------------------------------
                    |適した   |・クレジットカード番号など個人の重要情報
                    |利用形態 |・他人に受け渡しする機密情報
                    |         |・参照頻度のあまり高くないもの
 -------------------+-----------------------------------------------------
                    |特徴     |・初期設定(手間)が必要
  ファイルシステム  |	      |・パスワード入力はマウント時のみ
  		    |	      |・暗号化単位をディレクトリごとにできる
    での暗号化      |	      |・ドライバをインストールする必要がある
    		    |	      |・暗号処理のオーバーヘッドがある
		    |---------+-----------------------------------------
		    |適した   |・異なるプラットフォームで同じ暗号化
		    |利用形態 |  ファイルシステムを利用したいとき
		    |	      |  (代表的な実装としてcfsd 文献[1])
		    |	      |・リムーバブルデバイスを複数のホストで
		    |	      |  利用するとき
 -------------------+-----------------------------------------------------
                    |特徴     |・初期設定(手間)が必要
  ディスクドライバ  |	      |・パスワード入力はブート時のみ
     での暗号化     |	      |・システム稼動中は無防備だが盗難には強い
		    |	      |・暗号処理のオーバーヘッドがある
		    |---------+-----------------------------------------
		    |適した   |・他人(部外者)の目に触れやすい機器のHDD
		    |利用形態 |・機密性の高くない個人ファイル全般
		    |	      |・データベースファイルシステムやスワップ
		    |	      |  パーティションなどにも利用できる
 -------------------+-----------------------------------------------------
  ストレージ        |特徴     |・初期投資(お金)がそれなりに必要
  (ハードウェア)    |	      |・起動時にキーカードを抜き差しする必要あり
		    |	      |・キーカードを厳重管理する必要あり
     での暗号化     |---------+-----------------------------------------
		    |適した   |・暗号化ディスクドライバのないOSでの利用
		    |利用形態 |・設定作業の簡単化
		    |         |・入出力に速度も要求されるとき
 ===================+=====================================================
  暗号化保存が      |・入出力速度を特に重視するもの(ストリーム配信データ等)
  適さないもの/	    |・公開されているファイルのアーカイブやローカルコピー
  無意味なもの	    |
 -------------------+-----------------------------------------------------


----------------------------------------------------------------------------

さて、四つの層での暗号化のうち、ファイルシステム層のものはユーザごとのパ
スフレーズ設定など、柔軟な機能を持つのだが、

	* 既存のファイルシステムと互換性がない
	* データベース専用ファイルシステムなど独自形式のパーティション
	  の暗号化ができない
	* 複雑なので安定度の確保が難しい(実装上の問題)
	* よりシンプルに実装できるディスクドライバ層での暗号化の利用で
	  ほぼ同じ運用が可能

などの理由から、あまり多くの選択肢がない。読み取られると危険だとされるス
ワップパーティションの暗号化も視野に入れるとディスクドライバ層での暗号化
を利用するのが運用上適しているといえるので、今回はファイルシステム層以外
の暗号化について取り上げる。



■
■前提
■

以後、いくつか暗号化記録手法を紹介するが、いずれの場合も
ずさんなパスフレーズ(またはそれを保存したファイル)管理では意味がない
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ことを肝に銘じて欲しい。パスフレーズを考える際に注意すべき点については
Part3で述べる。

■
■ファイル単位の暗号化
■

「必要なとき以外は常に暗号化されたままの方がよく、必要なときにはその都度
パスフレーズを打って開く」という利用形態が適しているものは、ファイル単位
で暗号化するのが望ましい。

●Info-ZIP

ファイル単位で内容を暗号化するためのツールのうち、最も手軽なものは暗号化
機能を持った圧縮ツールである。最近では多くのシステムに標準装備となった
Info-ZIPのzipコマンドは -e オプションでファイルの内容を暗号化してアーカ
イブすることができる。

	% zip -e foo file-1 file-2 file-3 ....
	Enter password: 
	Verify password: 

とすると file-1 file-2 file-3 .... の内容が暗号化された上で foo.zip に格
納される。zip 2.3 では最長80字(バイト)までのパスフレーズを区別するので、
心掛け次第で強固な防御ができる。

復元には unzip コマンドを利用する。

	 % unzip foo.zip
	 Archive:  foo.zip
	 [foo.zip] date password: 

zipなど、暗号化アーカイバを使う場合の注意点としては、

	* 復号したファイルを置いたままにしない
	* 復号したファイルをアプリケーションで開いたままにしない

などが挙げられ、そのためにはunzipするときに復号後ファイルをディスクに保存
せず標準出力に書き出す -c オプションなどを利用するとよい。

	% unzip -cqq foo.zip


●PGP

PGPも上手に使うと必要な情報の暗号化に威力を発揮する。PGPによる暗号化メッ
セージの送受信が可能な状態に設定してあるのなら、自分にとって最も重要な情
報を保護するのに値する強固なパスフレーズにしておき、それよりランクの低い
秘密情報を守るための別のパスワードをPGP暗号化して自分宛に送信しておくこ
とで、重いものから軽いものまで多くのパスワードが一元管理できる。

ただしPart3で詳しく述べるが、実際の復号化プログラムのフロントエンドとして
パスワード入力を受け持つプログラムの利用には注意が必要である。具体例とし
ては、Emacs内でパスワードを入力して裏で復号化プログラムを起動するような利
用法が当てはまる。これは端末を離れたときにパスワードが簡単に盗まれる可能
性があるので、本当に重要な情報の暗号化/復号化にはコマンドラインツールを利
用するのが望ましい。


■
■ディスクドライバによる暗号化
■

多数のファイル群を管理していて、その一部に秘密性の高いものが含まれる場合、
あるいはそれらを頻繁に更新する必要がある場合はファイル単位ではなく、もっ
と下位のレイヤで暗号化するのが運用効率的上有利である。

もちろんシステム稼動時には常に復号化された状態になるので、暗号化していな
いファイルシステムと同様の保護機能(ファイル属性やACLなど)しか持たなくなる。
その点に留意する必要があるが、システムを停止して持ち運ぶような利用形態の
場合は、非常に有効な情報漏洩の防衛手段となる。最初に一手間要るが、一度設
定すれば通常のファイルシステムと同じ感覚で利用できる。持ち歩く機会の多い
ラップトップPCなどにはおすすめの設定である。

●設定と運用の流れ

本稿では FreeBSD GBDE(Geom Based Disk Encryption), Linux
dm-crypt(device-mapper crypto target), NetBSD CGD(cryptographic disk
driver) について紹介するが、いずれも

	(1) 暗号化に供するパーティションの用意
	(2) 仮暗号鍵で構築し全域をダミーデータで書き潰す
	(3) 2で作成した設定を解除
	(4) 正式運用暗号鍵で初期化する
	(5) fstabなどシステム起動時設定ファイルの書き換え

という手順で進める。実運用環境では(1)に実際のハードディスクのパーティショ
ンを利用することが多いと思われるが、導入を検討したり「練習」したりすると
きには新規のパーティションを調達するよりファイルから作成した仮想的なパー
ティションを利用する方が手軽である。それを考慮して以下の手順は仮想パーティ
ションを作成し、それを対象とした操作も併記する。

また、手順(2)はディスクが盗難に遭い、解析されたときに大きな意味を持つ。通
常の利用されたディスクは書き込みが発生しないセクタには初期データが残った
ままになる。たいていの場合0が残るので、解析時に0でない部分を解析対象とす
ればよいことになり、大きなヒントを与えることになってしまう。ダミーデータ
として「暗号化した0」【註 は】を書き込むことで、書き込み領域とそうでない
場所の区別は容易でなくなる。実際に運用するときには欠かせない操作だが、
時間がかかる処理なので「練習」のときには手順を省いても構わない。

---[註 は]------------------------------------------------------------------
暗号化した0は、暗号化に用いた鍵に応じて様々なバイト列に見える。
----------------------------------------------------------------------------

●FreeBSD GBDEによる暗号化ディスク

FreeBSD(5以降)ではGEOMフレームワークの上で一つのディスクとして振る舞う
GBDEが利用できる【註 ろ】。GBDEではデータ部分の暗号化にはAES-CBC-128を利
用している。

---[註 ろ]------------------------------------------------------------------
 FreeBSD 5.5/6.0 以降ではGELIというもう一つのGEOMクラスが利用できる。
----------------------------------------------------------------------------

(1) 暗号化に供するパーティションの用意
    ----------------------------------
新規にHDDが調達できる場合は接続する。ここでは外付けUSB-HDDアダプタなどに
繋ぐ場合を想定し、/dev/da0 が新規HDDだと仮定する。調達できない場合は適当
なサイズのファイルからvnodeディスクを作成する(以下の例は100MB)。

	(作業ディレクトリに移動)
	# dd if=/dev/zero of=gbde-test.fs bs=1m count=100
	# mdconfig -a -t vnode -f gbde-test.fs -u 0

新規HDDの場合は /dev/da0、vnodeディスクの場合は /dev/md0 を操作対象とす
る。以下、/dev/da0 の例のみ示す。必要ならbsdlabelでパーティションを作成
し、一部のパーティションのみを操作対象としても良い。

	# bsdlabel -w da0
	# bsdlabel -e da0
	(必要ならさらにパーティション分割する。今回はしない)


(2) ダミーデータによる書き潰し

ランダムパスフレーズで暗号化ディスクを構築する。

	# gbde init /dev/da0
	Enter new passphrase:
	Reenter new passphrase:

パスフレーズを尋ねられるが、ダミーデータを書くためのものなので、適当なも
のを考えて2度入れる。さらに、そのパスフレーズで暗号化ディスクを構築して、
0で埋めつくす。暗号化ディスクは元となるデバイスファイルに .bde を付けた
名前でアクセスできる。

	# gbde attach /dev/da0
	Enter passphrase:
	# dd if=/dev/zero of=/dev/da0.bde bs=1m

(3) 2で作成した設定を解除

detachサブコマンドで解除する。

	# gbde detach /dev/da0

(4) 運用パスフレーズで初期化する

いよいよここからが運用時設定となる。かなりの確率で安全だと思えるパスフレー
ズを用意し、もう一度初期化する。

	# gbde init /dev/da0 -L /etc/da0.lock
	Enter new passphrase:
	Reenter new passphrase: 

-Lオプションに与える引数はパスフレーズとペアで使う鍵ファイルで、これをメ
モリカードなどに移動しておけば安全性が高まる。鍵ファイルの指定を省略する
とディスクの最初のセクタが使われる。その場合、パスフレーズが推測されただ
けで復号できることになるので注意が必要だ。

attachサブコマンドで暗号化ディスクを構築する。

	# gbde attach /dev/da0 -l /etc/da0.lock
	Enter new passphrase:

構築されたパーティションをnewfsする。

	# newfs -U /dev/da0.bde

(5) fstabなどシステム起動時設定ファイルの書き換え

newfsした /dev/da0.bde をfstabなどに登録し、実際の運用に入る。以下のよう
に設定ファイルを修正する。

まず、/etc/fstab に *.bde デバイスを書く。/home と /opt をGBDEディスクに
する例を示す。

	/dev/da0.bde  /home  ufs  rw  0 1
	/dev/da1.bde  /opt   ufs  rw  0 1

/etc/rc.conf にGBDEの起動時自動構築のための変数定義を追加する。

	gbde_autoattach_all="YES"
	gbde_devices=AUTO
	gbde_lockdir="/foo"  # 鍵ファイル置場を /etc 以外にする場合
	# 鍵ファイル名をデバイス毎に指定するには以下のように代入する
	gbde_lock_da1="/別の/媒体の/どこかの/opt.lock"

なお、上記の変数はFreeBSD 5.4R/6.0Rの時点のもので、将来変更される可能性
もある。実際にリブートする前に、

	/etc/rc.d/gbde start

してみて、正常に構築されるか実験するのが望ましい。


●Linux dm-cryptによる暗号化ディスク

dm-cryptは透過的なブロックデバイス暗号化機能を持つLinux 2.6 の device
mapper【註 に】 ターゲットだ。dm-crypt による暗号化パーティションの作成手
順も、FreeBSD GBDEと同様の流れで行なう。dm-crypt の管理コマンドとして
dmsetupがあるが、直接利用するのは繁雑なので、cryptsetupを利用した例を示す。

---[註 に]------------------------------------------------------------------
http://sources.redhat.com/dm/
----------------------------------------------------------------------------

ただし、システムによってはcryptsetpがインストールされていないのでその場
合は

	http://www.saout.de/misc/dm-crypt/

の「Download」のセクションより cryptsetup の最新版を入手する。アーカイブ
を展開し ./configure && make && make install とすればよい。


(1) 暗号化に供するパーティションの用意

新規にHDDが調達できる場合は接続する。ここでは /dev/sda だと仮定する。もし
なければ適当ななサイズのファイルからloopデバイスを作成する(以下の例
は100MB)。

	(作業ディレクトリに移動)
	# dd if=/dev/zero of=crypt-test.fs bs=1M count=100
	# losetup /dev/loop0 crypt-test.fs

以下の説明では外付けHDDがあるものとして、/dev/sda を利用する。loopデバイ
スを利用する場合は適宜読み換えてほしい。

(2) ダミーデータによる書き潰し

まずはいい加減なダミーパスフレーズで初期化する。初期化時には、暗号化ディ
スクとなる論理ボリューム名を与える。ここでは論理ボリューム名を hoge とす
る。

	# cryptsetup create hoge /dev/sda
	Enter passphrase: 

これで /dev/mapper/hoge デバイスファイル経由でアクセスできるようになる。
ダミーデータで書き潰す。

	# dd if=/dev/zero of=/dev/mapper/hoge bs=1M

(3) 2で作成した設定を解除

	# cryptsetup remove hoge


(4) 運用パスフレーズで初期化する

今度は忘れにくく推測されにくいパスフレーズで初期化し直す。

	# cryptsetup create hoge /dev/sda
	Enter passphrase: 


利用したいファイルシステムでmkfsする。

	# mkfs.ext3 /dev/mapper/hoge

(5) fstabなどシステム起動時設定ファイルの書き換え

4で初期化した /dev/mapper/hoge を /etc/fstab に登録し運用に移る。




●NetBSD CGDによる暗号化ディスク

NetBSDのCGDでは鍵生成法とそのビット長、データの暗号化アルゴリズムを選ぶ
ことができる。デフォルトではそれぞれpkcs5_pbkdf2/sha1、AES-CBC-128が選ば
れる。下記の手順(4)でそれらを指定している。

(1) 暗号化に供するパーティションの用意

ディスクの調達についてはFreeBSDと同様である。vnodeディスクで実験したい場
合は下記のようにして作成する(100MBの例)。

	(作業ディレクトリに移動)
	# dd if=/dev/zero of=cgd-test.fs bs=1m count=100
	# vnconfig -c vnd0 cgd-test.fs

以下の説明では、外付けHDDを利用する場合の /dev/sd0d で例示するが、vnode
ディスクで行なう場合は /dev/vnd0d で読み換えてほしい。

(2) ダミーデータによる書き潰し

CGDの管理コマンドであるcgdconfigでは、標準入力からも暗号鍵を読めるので、
/dev/urandom を与えてランダムな鍵で初期化する【註 れ】。

	# cgdconfig -s cgd0 /dev/sd0d aes-cbc 128 < /dev/urandom
	# dd if=/dev/zero of=/dev/rcgd0d

---[註 れ]------------------------------------------------------------------
スワップパーティションなどはランダムな鍵でよいので、常に /dev/urandom か
ら鍵を与える方法で構築する。
----------------------------------------------------------------------------

(3) 2で作成した設定を解除

	# cgdconfig -u cgd0

(4) 運用パスフレーズで初期化する

堅牢なパスフレーズで初期化する。まず、パスフレーズとペアで使う鍵を含むパ
ラメータファイルを作成する。マニュアルを見て手動作成しても良いが、
cgdconfigコマンドが生成してくれる【註 ち(コラムかなあ)】。ここでは
AES-CBC-256 を指定する。

	# cgdconfig -g -V disklabel -o /etc/cgd/sd0d aes-cbc 256

---[註 ち]------------------------------------------------------------------
"could not calibrate pkcs5_pbkdf2" というエラーでパラメータファイルの生成
に失敗することがある。これはPKCS#5の繰り返し数を決めるためにCPU速度を計測
するのだが、2度計った値の差が大きいとエラーとみなすためである。CPU速度の
変わる環境(自動クロック制御つきCPUや、VMwareなどホストOSの負荷によって左
右されやすいPC)では安定した計測結果を得にくいため、別プロセスをなるべく落
とすか、逆に一定負荷を与えるかして、システムの負荷を一定に保つようにする
と成功率が上がる。また、リモートからログインして作業していると乱数発生の
ためのエントロピーが不足して処理が滞りがちになるので、rndctlコマンドでネッ
トワークデバイスもタイミング情報収集対象に追加するとよい。

	# rndctl -ce -t net
	# rndctl -ls

こうしておいて、cgdconfig -gの待ち時間にキーボードをでたらめに叩いて文字
列を送るとスムーズに進む。
----------------------------------------------------------------------------

-o オプションに与えたのがパラメータファイルで、暗号化アルゴリズムの指定
やsaltなどが入っている。以後の暗号化ディスク構築時にはこのパラメータファ
イルを利用するのだが、デフォルトでは

	/etc/cgd/対象ディスク

というファイル名を参照するようになっているので sd0d を利用するときには
/etc/cgd/sd0d という名前で保存する。ただし、このパラメータファイルをメモ
リカードに保存するとより安全な運用となる(後述)。

-V オプションの後の "disklabel" は、暗号化ディスク構築時に入力されたパス
フレーズが正しいかどうかを、「暗号化ディスクに正しい disklabel 情報がある
かどうか」で判定することを指示している。もし、運用時に間違ったパスフレー
ズが入力された場合、復号結果が正しくフォーマットされたディスクに見えなく
なるため、間違ったままでは暗号化ディスク構築を行なわないようになっている。

ただし、「運用用パスフレーズで最初の一回目に構築するとき」はフォーマット
されていない暗号化ディスクになるので、初回時にはパスフレーズの正当性チェッ
クを「端末からの二度入力(re-enter)」にして設定する。

	# cgdconfig -V re-enter cgd0 /dev/sd0d

これで暗号化ディスクが /dev/cgd0 を介して利用できる。disklabelで初期ラベ
ルを書く。

	# disklabel -I -e cgd0
	(viが起動するのでそのままで良ければ ZZ で保存終了)

disklabelエディタで a パーティションが使えるようにしたのであれば、
/dev/rcgd0a をnewfsする。

	# newfs /dev/rcgd0a

(5) fstabなどシステム起動時設定ファイルの書き換え

/dev/cgd0a をfstabに登録して運用に備える。また、システム起動時に自動的に
cgdconfig を行なうように、/etc/rc.conf に

	cgd=YES

の1行を加え、cgdconfig が構築すべきディスク一覧を /etc/cgd/cgd.conf に列
挙しておく。今回の例(sd0d → cgd0)の場合は【リスト ほ】のように記述する。
	
---[リスト ほ]--------------------------------------------------------------
# cgd           target          [paramsfile]
cgd0		/dev/sd0d
----------------------------------------------------------------------------

なお、CGDの場合パラメータファイルに鍵を埋め込むことができる。鍵入りパラメー
タファイルをメモリカードなどに移動しておけば、システムブート時にメモリカー
ドがなければ暗号化ディスクを利用できなくなる。cgdconfig の -k オプション
で埋め込み鍵を指定する。

	# cgdconfig -g -k storedkey -V disklabel \
		-o /etc/cgd/sd1d aes-cbc 256

/etc/cgd/sd1d に鍵入りのパラメータファイルができる。最初の一回目はフォー
マットしていない状態でも構築できるよう正当性の検査をしない。

	# cgdconfig -V none cgd0 /dev/sd0d

disklabelを書き、newfsした後には cgdconfig 時のdisklabel検査に通るように
なる。
	# disklabel -I -e cgd0		(disklabelを書き込む)
	# newfs /dev/rcgd0a
	# cgdconfig -u cgd0		(いったん解除)
	# cgdconfig cgd0 /dev/sd0d	(今度はdisklabel検査に通る)

これでエラーなく暗号化ディスクが構築できるようなら、
パラメータファイル(/etc/cgd/sd0d) を別の媒体に移動し、/etc/cgd/cgd.conf
を【リスト へ】のように変更する。
	

---[リスト へ]--------------------------------------------------------------
# cgd           target          [paramsfile]
cgd0		/dev/sd0d	/別の/媒体の/どこかの/sd0d
----------------------------------------------------------------------------



■
■パフォーマンス
■

暗号化ディスクを用いない場合と用いた場合の読み書きの速度を比較してみた。
暗号/復号化処理はCPUの、読み書き速度はドライブやバスの性能によって大きく
左右されるので、どの程度の速度変化になるかは使用マシンの環境によることを
念頭において、あくまでも目安程度に捉えてほしい。

●測定条件

AMD Athlon XP 2600+ で動くNetBSD 3.0_STABLE内の VMware で、

  * FreeBSD 6.0-RELEASE + CGDE(aes-128-cbc)
  * Linux 2.6.11-1.1369_FC4 + dm-crypt(aes-256-plain)
  * NetBSD 3.0_STABLE + CGD (aes-256-cbc)

いずれも主記憶80MBを与えて暗号化なしでの書き込みと、暗号化ありでの書き込
み時間を測定した。実際に導入すべきか検討するときに気になるのは、「最大暗号
化速度」などよりも、日常的な作業の体感速度であることを考慮し、
書き込み実験は、

  * dd によるブロックサイズ1MB×100回の書き込み(100MBシーケンシャル)
  * 総ファイル数92621、展開前約24MB、展開後約192MBの tar.gz ファイル展開
    (tar.gzファイルも同じディレクトリに置いた)

という2種類で行なった。暗号化の有無両方において、Linuxはext3fs、
FreeBSDは ufs+softupdates、NetBSDはffs+softdepのファイルシステムで行なった。

OS間での速度の比較ではなく、暗号化の有無による比較であることに注意して表
を見てほしい。数値は各10回の試行の値(秒)である。

●FreeBSD 6.0 GBDE

---[表 り]------------------------------------------------------------------
FreeBSD 6.0R + GBDEでの比較

		100MB sequential write		tar.gz展開

		平均	σ	 		平均	σ
  GBDEなし	 2.77	0.15			104.50	1.06
  GBDEあり	44.60	1.27			218.12	3.09
  速度比	 6.6%				 47.9%
----------------------------------------------------------------------------

---[表 ぬ]------------------------------------------------------------------
Linux 2.6.11 + dm-cryptでの比較

		100MB sequential write		tar.gz展開

		平均	σ	 		平均	σ
  dm-cryptなし	 7.17	2.26			104.33	 8.44
  dm-cryptあり	17.10	2.65			 97.38	 7.01
  速度比	41.9%				107.1%
----------------------------------------------------------------------------

---[表 ぬ]------------------------------------------------------------------
NetBSD 3.0 + CGDでの比較

		100MB sequential write		tar.gz展開

		平均	σ	 		平均	σ
  cgdなし	 4.52	1.32			 68.26	2.01
  cgdあり	 8.71	1.40			 84.26	5.43
  速度比	51.8%				 81.0%
----------------------------------------------------------------------------

どのOSの測定結果も、sequential write の速度低下の方が大きく、圧縮ファイル
展開ではそれほど低下していない。感覚的には、個人で作成する程度の大きさの
ファイルの読み書きではほとんど違いが分からない。確かに sequential write
の書き込みになると「一昔前のHDD?」という風に気付く程度ではあるが、本当に
大きなデータファイルは(機密性の高いものでなければ)暗号化しないパーティショ
ンに置けばいいだけの話なので、不満は回避できるだろう。




■
■ハードウェアレベルでの暗号化
■

ハードディスクとインタフェースの中間に入り、メインボードからの書き込みを
ハードウェア的に暗号化してHDDに送る、あるいはその逆をするものがある。これ
はBIOSレベルから見ても「普通のHDD」として扱われるため、稼動させるOSの種類
にかかわらず利用できる。

今回はバーテックス社の御厚意により、ハードウェア暗号化を行なえる
digicryptシリーズ X-Wall Secure PCI Card を利用することが
できたので導入方法を紹介したい。

---[註 を]------------------------------------------------------------------
http://www.x-wallsecure.jp/products/PCI_Card.html
----------------------------------------------------------------------------

●X-Wall Secure PCI Cardの装着

詳細は付属の説明書にあるのだが、装着は非常に簡単だ。【図 を】のように
X-Wall Secure PCI Card(以下digicrypt) をPCIバスに取り付け、付属ケーブル
でマザーボードとdigicryptを繋ぐ。さらに、digicryptとHDDを繋いで装着完了
である。

---[図 を]------------------------------------------------------------------

【装着前】

   +----- Main Board ------+
   |                       |
   |  [-------]            |
   |     :..........+----+ |   ← Parallel ATAバスに HDDが
   |                |HDD | |   	  繋がっている絵
   |                |    | |
   |		    +----+ |
   +-----------------------+

【装着後】

   +----- Main Board ------+
   |                       |
   |  [-------]            |
   |     ..........[-----] |
   |	 	      ::   |
   |                +----+ |   ← Parallel ATAバスがPCIバスに差した
   |                |HDD | |   	  X-Wall PCIのスロットと繋がり
   |                |    | |	  さらにX-Wallのもういっこのスロットから
   |		    +----+ |	  HDDに繋がっている絵
   +-----------------------+

----------------------------------------------------------------------------

気をつけるべき点は、HDDの転送モードの設定で、転送速度に応じてカードのジャ
ンパスイッチを設定する。今回は、Ultra ATA 133MHz のMaxtor 6L160P0を利用し
たので、JP4を外してdigicryptの転送モードも133MHzに合わせた。

---[図 か]------------------------------------------------------------------
%image dcp_2423.jpg	X-Wall PCI CardにATAケーブルを繋いだところ。
%image dcp_2425.jpg	インタフェースカード。右上のジャンパを設定する。
%image dcp_2426.jpg	実際に装着したところ。IDE Cannel 1 Master に接続。
%image dcp_2431.jpg	BIOS(1) 電子キーを付けていないとHDDが認識されない。
%image dcp_2432.jpg	BIOS(2) 電子キーを付けると普通のHDDとして認識される。
----------------------------------------------------------------------------

今回はFreeBSD FreeBSD 6.1-PRERELEASE のマシンに接続した。電子キーを差して
いない状態ではBIOSからみてもHDDがないように見えるが、電子キーを差してい
る状態では通常のHDDがあるように見える【図 か】。


ブートメッセージでは
	ad2: 156334MB  at ata1-master UDMA133

と出て、digicryptを接続しないときと同じ状態で認識された。この状態からは、
通常のHDDと何ら変わりなく利用できた。物理的な接続の手間はあるが、それ以
外はあまりに手間要らずで呆気ないほどだ。

●利用上の注意点

digicryptに限らず、たとえ暗号化チップを利用してHDDの内容を盗難から保護し
たとしても、HDDそのものの故障や操作ミスによるデータ損失はこれまでどおりな
くならない。そのためにもバックアップを取るべきなのだが、バックアップ先
HDDも同様に暗号化したものでなければ意味がない。バックアップ先にも暗号化
チップを組み込むか、前述したソフトウェア暗号化ドライバを組み込むようにす
る。

また、ハードウェアチップの場合、インタフェースカードが故障することも十分
に考えられる。何年か先に壊れたときに同じ製品があるとは限らないので、導入
に当たっては必ず同じものを2枚以上導入するようにしたい【註 よ】。

---[註 よ]------------------------------------------------------------------
この点においてはハードウェアRAIDカードも同じで、何年も先に故障したときに
困らないよう予備も含めて導入するのが望ましい。
----------------------------------------------------------------------------

HDDを暗号化するときには未使用領域がどこか分からないようにすることも重要な
のだが、digicryptでは固定的な電子キーを用いて暗号化するため、暗号化した0
で埋めつくしても、128ビットごとに同じパターンが繰り返され、データ領域でな
いことが分かってしまう。そのためOS側でランダムなビット列を全域に渡って書
き込んでおくのが賢明だ。非常に時間がかかるが

	# dd if=/dev/urandom of=/dev/ad2

などとして書き込んでから運用に入ることで未使用領域の境界を曖昧化できる。


●パフォーマンス測定

測定条件は異なるがdigicryptでも、装着した場合とそうでない場合とで書き込
み速度を測定してみた。

測定環境は以下のとおり。

CPU:			AMD 64 3000+ 1808.94-MHz
メモリ: 		1GB
IDEコントローラ:	AcerLabs M5229 Ultra DMA 133
HDD:			Maxtor 6L160P0 (Ultra DMA 133)
OS:			FreeBSD 6.1-PRERELEASE (2006年2月上旬版)

これも、暗号化のあるなしでのスループットの変化を見るため、通常利用するで
あろう softupdates ありでのファイルシステムで測定した。さすがハードウェ
アの暗号化だけあって、結果はすばらしく【表 た】のようにdigicryptを組み込
んだときも有意な速度低下は見られなかった。暗号化する必要があり、なおかつ
入出力に速度が求められるものはハードウェア暗号化デバイスを利用するのが良
いだろう。

---[表 た]------------------------------------------------------------------
		100MB sequential write		tar.gz展開

		平均	σ	 		平均	σ
  digicryptなし	 1.60	0.08			 48.50	4.00
  digicryptあり	 1.62	0.03			 48.40	3.64
  速度比	98.6%				100.2%
----------------------------------------------------------------------------


■
■仕事用ディレクトリは暗号化パーティションに!
■

ソフトウェアによる暗号化もハードウェアによる暗号化も導入時に一手間要るだ
けで、あとはほとんど手間をかけずに利用できる。暗号化せずに情報漏洩が起き
たとして、失うものが大きいと思える場合は、それを保存しているパーティショ
ンだけでも暗号化するのが賢明だろう。


---[註 そ]------------------------------------------------------------------
----------------------------------------------------------------------------
---[図 つ]------------------------------------------------------------------
----------------------------------------------------------------------------


■
■参考URL
■

[1] CFS		http://www.crypto.com/papers/cfs.pdf

[2] GBDE:	http://phk.freebsd.dk/pubs/bsdcon-03.gbde.paper.pdf
[3] GELI:	http://www.subterrain.net/~jbl/FreeBSD%20Disk%20Encryption%20With%20geli.pdf
[4] dm-crypt:	http://www.saout.de/misc/dm-crypt/
[5] CGD:	http://www.imrryr.org/~elric/cgd/cgd.pdf
		http://www.onlamp.com/pub/a/bsd/2005/12/21/netbsd_cgd.html
[6] fcrackzip	http://www.goof.com/pcg/marc/fcrackzip.html


yuuji@gentei.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]