ファイルシステムごと暗号化する方法
暗号化のために専用のパーティションや専用のディスクを使用して良いのなら、保護するファイルすべてを暗号化/復号するのにパスフレーズやキーがたった一つで済む。しかもソリューションによっては、スワップパーティションやルートパーティションの暗号化までできるものもある。ただし専用パーティション/ディスク全体を暗号化することの難点としては、性能が落ちる可能性があること(残念なことではあるが、セキュリティを重視する場合、性能が落ちてしまうことはやむを得ないことだ)や、万一攻撃者がキーを入手した場合(あるいは自分でキーをなくしてしまった場合)に暗号化した全ファイルに別れを告げることになるといったようなことがある。
ループバックデバイスとdm-crypt
ファイルシステムの暗号化に関して現在Linuxカーネルでサポートされている主な方法には、ループバックデバイスドライバを使うものと、デバイスマッパーシステム(dm-cryptターゲットを利用)を使うものとがある。ループバックデバイスを使う方法を取るなら、loop-AESが最も良い選択肢だろう。loop-AESは、Linux上で利用することのできるディスク暗号化方法として最も完成度の高いものの一つだ。なおloop-AESのREADMEは非常に良くできており、ファイルシステムの暗号化について実用的で参考になる例が紹介されている。
一方Linuxカーネルの2.6系列で統合されたdm-cryptは、ループバックデバイスドライバよりも高性能/高セキュリティを実現している。さらに機能的にもより優れたものとなっている。
現在dm-cryptを使用しているプロジェクトの中でも最も将来性があると思われるのは、LUKSだろう。LUKSプロジェクトの狙いは、ディスク上のフォーマットを標準化することにより異なるディストリビューションの間で保護データを移行することを簡単にすることだ。それに加えてLUKSでは、複数のキーの管理ができる上(これは大きな利点だ)、暗号化されたパーティションにはFreeOTFE経由でWindowsからアクセスすることも可能だ(さらに大きな利点だ)。
FUSEを使う方法
また別の方法としてFUSEを使うという手もある。FUSEは、ユーザがユーザ空間のプログラムによってファイルシステムを実装しルート権限なしでマウントする、などといったことを可能にするパッケージだ。FUSEを使用した暗号化ファイルシステムとしてはCryptoFSとEncFSがある。CryptoFSとEncFSでは、専用のパーティションや専用のディスクは必要なく、ファイル(とそのファイル名)は暗号化され、通常のディレクトリ内に置かれる。暗号化/復号する際には、キーと共に、暗号化ファイルシステムのためのマウントポイントとしてディレクトリを一つ指定する必要がある。そのディレクトリ経由でアクセスすると、暗号化されたデータは復号された状態で読み書きすることができる。キーがなければ、暗号化されたディレクトリをマウントすることはできず、復号された状態のファイルにアクセスすることはできない。
CryptoFSとEncFSは、セキュリティとユーザにとっての利便性という点でのバランスが優れている。FUSEを利用したCryptoFSとEncFSでは(あらかじめ固定サイズのパーティションを作成する必要のあるループバック方式などとは異なり)ファイルシステムの大きさをあらかじめ決めておく必要はない。とは言え非常に用心深く神経質なユーザならほぼ確実に、CryptoFSとEncFSが抱える大きな難点が気になることだろう。つまり暗号化されたファイルの置かれている通常のディレクトリを見ることにより、暗号化されたファイルが全部でいくつあるのかを把握したり、それらのファイルの実サイズを計算したり、どのようなパーミッションになっているのかを確認することができてしまう。
なおTom’s Hardwareが行なったLUKS、EncFS、CryptoFSのベンチマークによると、ファイル入出力の性能に関してはLUKSが優勢であるようだ。
eCryptfs
Linuxカーネルに統合されているもう一つの選択肢にeCryptfsがある。eCryptfsをインストール/利用するためには、カーネルモジュールとユーザ空間のユーティリティが必要になる。eCryptfsは別の既存のファイルシステムの上で動く、いわば2段式の暗号化ファイルシステムだ(2段式のため、コールスタックもその分、積み上がることになり、XFSなど一部のファイルシステムでは問題が起こる可能性がある。詳しくはeCryptfsのFAQを参照のこと)。
eCryptfsを利用することの利点は、eCryptfsがネイティブのLinuxファイルシステムであり、FUSEを使ったりRPCの呼び出し経由で操作を行なったりする必要がないため、依存性が少なく、また、(おそらくは)よりきれいに開発できるということだ。またファイルについての暗号化関連のメタデータが各ファイルのヘッダ部分に保存されるため、データの移行やバックアップを楽に行なうことができる。機能的には、キー管理などの機能はすでに利用できるようになっており、近い将来にファイル名の暗号化などの機能を実現することも計画されている。
存在隠蔽可能な暗号化
データの保護だけでは十分ではなく、その存在自体も所有者以外には知られないようにすることが要求される状況もある。例えば当局に求められた際に暗号化ファイルのキーの提示を拒否すると投獄の可能性があることを明記した法律がすでに存在する国もいくつかある。そのような場合などでは、暗号化データの存在自体を目に見えない状態にしておくことが最大の防御となることもある。
いくつかのステガノグラフィ用ツールでは、ユーザがデータを他のファイル(通常は画像や音声ファイル)の「中」に目立たないように隠すことが可能になっている。しかし一つのjpgファイルの中には隠しきれないほどファイルの数が多い場合やファイルのサイズが大きい場合には、ステガノグラフィファイルシステムを利用するのが最良の策だ。
最近行なわれている興味深い提案の一つに、MP3ステガノグラフィファイルシステムがある。他の方法のほとんどでは隠された暗号化パーティションを作成するだけに留まっているが、MP3ステガノグラフィファイルシステムではそれだけでなく、ユーザはそのような隠し暗号化パーティション内を階層化し、各階層ごとに異なるパスワードを設定することができる。そのため隠しパーティション用のパスワードの提示を強制された場合にも、ユーザはダミーのデータが入っている層にアクセスするためのパスワードだけを渡すことができる。各層は自分以外の層について何も知らないので、その層以外の層の存在を立証することはできない。そのため存在隠蔽可能な暗号化が実現されることになる。
ステガノグラフィファイルシステムにも難点はある。隠しデータがディスクやパーティションの全体にわたりランダムに分散されている必要があるため(このこと自体は解析をほぼ不可能にするためであり、好ましいことだ)、目に見えているパーティションでの通常のファイル操作により上書きされる可能性がある。またデータの衝突が起こる可能性もある。さらにこの種のファイルシステムではファイル入出力の性能が著しく劣るということもある。しかし最大の難点は、残念なことに私が知る限りほとんどすべてのプロジェクトが停止か半停止状態にあるという点だ。具体的に言うとRubberhose、Phonebook、StegFSなどのプロジェクトだ。MagikFSというプロジェクトは、書かれていることを見る限り将来性があるように思えるので、他のプロジェクトと同じ運命をたどらないことを期待しよう。
とは言え、存在隠蔽可能な暗号化の利用が必要である場合に、安定していて保守もしっかりとされているお勧めのツールも実は存在する。Truecryptだ(Linux.comのTruecryptの記事、翻訳記事)。Truecryptでは、単純な暗号化パーティションの作成ができるだけでなく、隠しボリュームの作成もできる。つまり、まずダミーのデータが入っている暗号化された「外部パーティション」が存在し、次に外部パーティションの中にそれよりも小さくて目には見えない「内部パーティション」が作成されるのだが、その際、内部パーティションのデータは外部パーティションの空き領域に保存されるというようになっているということだ。
Truecryptには有益な文書が付いているが、それを読むと、Truecryptではステガノグラフィファイルシステムにはつきもののデータ衝突やファイル入出力性能といった問題を回避するための手段がいくつか講じられていることがわかる。それに加えTruecryptはインストール/利用が簡単であり、またLinux版とWindows版の両方が用意されている(ただしLinux上にインストールする場合はカーネルソースが必要だ)。Truecryptは、Linux/Windowsどちらのオペレーティングシステムでも利用可能なものとして、最も優れたディスク暗号化ソリューションの一つだと言えるだろう。
セキュリティの重視
誰かが言っていたように、セキュリティというのは心掛けの問題だ。最終的に自分のシステムをセキュアにするのは、使っているソフトウェアではなく、結局は他でもない自分自身だということが言える。通常どのシステムにもファイルやディスク全体を暗号化してもカバーしきれない脆弱な部分といったものが存在するものだ。例えばファイルにアクセスする度にスワップ空間や一時ディレクトリにコピーが残っているかもしれないし、シェルの履歴ファイルによって最近実行したコマンドが示されることもあるだろう。多くのアプリケーションが作成したファイルのバックアップ用コピーを(自動的に)生成するし、先ほど印刷してディスクから削除した文書が今もまだプリンタのスプールからは復旧可能な状態にあるかもしれない。また、暗号化用のキーは紙に書くかポータブルメディア(USBメモリやCD-ROMなど)上に保存し、安全な場所に保管するべきなのだが、そうなっていないかもしれない。いずれにしろ、無頓着と極度な神経質のどちらか一方を強いて選ぶとしたら、セキュリティという観点からは神経質である方が好ましいということだ。
最後に駆け足で補足を何点か言っておこう。FreeBSDを使っているならFuse4BSD経由でCryptoFSとEncFSを試してみることができる。またCGD(NetBSD)やGBDEも見てみると良いだろう。ステガノグラフィと隠しデータについてより詳しくは、隠し情報についてのページを参照のこと。またここで、単純に通常のファイル単位の暗号化をやめて暗号化ファイルシステムを使うということではなく、両方を利用したソリューションを検討するべきだということを付け加えておかねばならないだろう。さらに費用が許すなら、Trusted Platform Moduleなどのハードウェア暗号化の利用も考えてみよう。
Rui Lopesは、ポルトガルのウェブデザイナー兼映画制作者。技術分野における幅広い興味を持つ。