Windows XP Professional には NTFS の暗号化ファイルシステムを利用する機能がある。Windows XP Home Editionでは利用できない。使い方は簡単で、フォルダのプロパティの詳細設定で「内容を暗号化してデータをセキュリティで保護する」にチェックを入れるだけ。これだけでそのフォルダに保存したファイルは自動的に暗号化されるようになる。 (Windowsでは「セキュリティ」という言葉は「アクセス権」の意味でも使われるので、この翻訳表現は誤解を招きやすい。英語版の原文では “Encrypt contents to secure data” (「データを守るために内容を暗号化する」)となっていて、「セキュリティ」という言葉は使っていない。) Explorer ではファイル名が緑色で表示される (フォルダ オプションで無効にできる)。ただし NTFS の圧縮属性とは同時使用できない (圧縮か暗号化のどちらかだけ。圧縮も暗号化も「特定のアルゴリズムに基づいてファイルの内容を別のものに変換する」という点では非常によく似た操作であり、NTFS ではアルゴリズムを使い分けることで「圧縮・解凍」あるいは「暗号化・復号」を透過的に行ってくれるが、ファイル毎にどちらか一方しか選べない)。暗号化したファイルは、そのユーザーにとっては使い勝手は普通のファイルとまったく変わらない。使うたびにパスワードが必要になったりはしない。ユーザーは、暗号化ファイルを普通のファイルと同様に直接開き、編集し、保存できる。事前に暗号化解除などの手続きは必要ない。
EFS で暗号化されたファイルはそのシステムにログオンしたそのユーザーでのみ開くことができ、他のユーザーや他のシステムでは開けない。ただし開けない (「アクセスが拒否されました」というエラーとなる) のは本質的ではなく、EFS の目的は、ファイルの内容を暗号化することによって、アクセス制限 (セキュリティ) や物理的な読み取り能力の枠を超えて、他人にはファイルの内容 (暗号化前の内容) を知ることを不可能にすることにある。例えば他人でもアクセス権があれば暗号化ファイルの削除やボリューム内の移動はできる (これらはファイルではなくフォルダ構造に対する操作なので暗号化では防げない) し、Windows 上ではファイルへのアクセスはできず Explorer でのコピーもできないものの、Backup Operators 以上の権限があれば NTBackup や Retrospect などのバックアップツールによる複製 (暗号化したままのコピー) はできる。何より、ハードディスクを取り出して他の OS のシステムでファイルを直接読み出すことはその気になれば誰にでも可能である。ところが、これらのファイルは NTFS ボリューム上で暗号化されて記録されているので、たとえハードディスクを取り出して他の OS のシステムから強制的に内容を読み取ったとしても、データは無意味な内容になっており復元できない。すなわち、暗号化前の内容は、他人にはどんな手段を使っても手に入れることはできない。暗号化ファイルを開き (復号化し)、暗号化前のファイル内容を知ることができるのは、暗号化した本人だけである。
注意するべきことは、同じマシンでも、何の準備もなく Windows を再インストール/リカバリした場合には、暗号化した本人にも暗号化ファイルが開けなくなってしまう点である。まったく同じユーザー名・同じパスワードのユーザーを再作成しても開くことはできない。その理由は、ファイルの暗号化に使われる暗号化鍵はユーザーのパスワードではないからである。ファイルの暗号化に使われる暗号化鍵は初めて暗号化ファイルを作成するときに自動的に生成されるが、それは常にユニーク (世界で唯一) なものであり、二度と同じものが生成されることはない。従って、その暗号化鍵をなくしてしまうと、二度と暗号化ファイルを復元することはできなくなる。ユーザーのパスワードは暗号化鍵を秘匿する (暗号化鍵自体を暗号化する) のに使われるに過ぎない。このため、もしも現在の Windows が破損して暗号化鍵が失われた場合には、たとえパスワードを覚えていても本人にすらファイルが開けなくなってしまう。このような事態を回避するために、暗号化鍵をあらかじめ別にバックアップ (エクスポート) しておくことは絶対に必要であり、その方法もきちんと提供されている (必要性が一般に周知されているとは言いがたいが)。
EFS では、暗号化には共通鍵(対称鍵)方式と公開鍵方式を組み合わせた方法を採用している。具体的には、各ファイルは自動生成された個別の共通鍵で暗号化され、その共通鍵を作成者の公開鍵で暗号化したものと、回復エージェント (DRA: Data Recovery Agent) の公開鍵で暗号化したものがそのファイルに付加される。従って作成者の秘密鍵か回復エージェントの秘密鍵のどちらかを入手すれば、共通鍵を取り出すことができ、ファイルを復号化できる。共通鍵はファイルごとに異なるものが使われるので、あるファイルの共通鍵を何らかの方法で探知しても、他のファイルの復号には使えない。これは既知の内容のファイルとその暗号化ファイルを比較することにより暗号鍵を推測するといった攻撃に対抗するために必要な措置である。このような EFS の構成により、ファイルの暗号化自体は高速な共通鍵方式で行いつつ、秘匿するべき暗号鍵の数は最小限で済み、秘匿した暗号鍵の変更の際もファイル全体を暗号化し直す必要がなく、なおかつ公開鍵方式の利便性を享受できるといった様々なメリットがある。
(採用された暗号化アルゴリズムは Windows のバージョンにより異なるので、異なるバージョンの Windows 間で暗号化ファイルを共用したいときは注意が必要。Windows 2000 と 初期の Windows XP では共通鍵暗号化方式に DESX (鍵長56ビットの DES を強化したもの) が、Windows XP SP1 以降と Windows Server 2003 では AES (鍵長256ビット) が使われる (Windows Vista でも256ビット AES が採用された)。公開鍵暗号化方式はいずれも RSA (鍵長1024ビット、Vista と Windows Server 2008 ("Longhorn") では2048ビット)。)
デフォルトでは、ユーザーは自分自身の秘密鍵しか持っていないので、他のユーザーが暗号化したファイルを開くことはできない。しかし暗号化ファイル作成者の秘密鍵や回復エージェントの秘密鍵をインポートすれば、それらを開くことができるようになり、暗号化ファイルの共用や非常時の復元ができる。
暗号化ファイル作成者の秘密鍵・公開鍵は“EFS 証明書”と呼ばれ、「目的」が「暗号化ファイル システム」と表示される。
回復エージェントの秘密鍵・公開鍵は“EFS DRA 証明書”と呼ばれ、「目的」が「ファイル回復」と表示される。
この二つの証明書ははっきりと別の目的で使われるものであり、互いに流用することはできない。従って、二つの証明書を混同しないように注意しなければならない。例えば、cipher.exe
コマンドの /r
パラメータで生成される証明書は (システムに登録するための新規の) EFS DRA 証明書であり、/x
パラメータで作成されるのは (そのユーザーが現在使用している個人用の) EFS 証明書である。また「回復エージェント」とは特定のユーザーのことを指すものではなく、システムに登録した「ファイル回復」用の EFS DRA 証明書 (公開鍵) と対になる秘密鍵証明書をインポートしたユーザーのことを指す。
EFSで特に注意しなければならないことは、「EFS DRA 証明書で暗号化ファイルのアクセスに成功した場合、そのファイルに付加された EFS DRA 証明書 (で暗号化された共通鍵) は直ちに現在のシステムの EFS DRA 証明書 (で暗号化された共通鍵) で置き換えられる」点と、「EFS 証明書で暗号化ファイルのアクセスに成功した場合、そのファイルに付加された EFS 証明書 (で暗号化された共通鍵) は直ちに現在のユーザーの EFS 証明書 (で暗号化された共通鍵) で置き換えられ、EFS DRA 証明書 (で暗号化された共通鍵) は直ちに現在のシステムの EFS DRA 証明書 (で暗号化された共通鍵) で置き換えられる」点である。コピーしたり保存し直したりすることなく、単に開いただけで置き換えられてしまう。それどころか、開かなくても単に Explorer のヒント情報が表示されただけでも置き換えられてしまう。読み取りに失敗した(アクセス拒否された)場合には置き換えられない。
この点は、条件によっては「良くてたった一回しか開けない」場合があるので細心の注意を要する。
例えば、PC1 に回復エージェントを設定し、その EFS DRA 証明書をファイルに保存しておいたとする。
その後、PC1 上のユーザーが作成した暗号化ファイルには、すべて回復エージェントの EFS DRA 証明書が付加される。もちろん作成者の EFS 証明書も付加される。
さて、PC1 の Windows が破損して、Windows の再インストールを行って PC2 になったとする。
PC2 では回復エージェントを設定しようがしまいが、かつての PC1 での暗号化ファイルを開くには、保存しておいた PC1 の EFS DRA 証明書、または PC1 のファイル作成者の EFS 証明書をインポートしなければならない。もちろん両方の証明書を保存していた場合は暗号化ファイル作成者の EFS 証明書をインポートしても良いが、この場合は EFS 証明書は保存してなかったとする。すると EFS DRA 証明書をインポートするしかない。
ここで重大なことが起きる。もしも PC2 で回復エージェントを全く指定していなかった場合、インポートした EFS DRA 証明書で暗号化ファイルを開いたとたんに、そのファイルからは EFS DRA 証明書が削除されてしまう。そして何も気づかずにファイルを閉じてしまうと、二度とそのファイルを開くことができなくなる。なぜならそのファイルにはもう EFS DRA 証明書が何もなく、付加されているのは PC1 での作成者の EFS 証明書だけだからである。多くの場合、知らない間にアクセスが発生し、開こうとしても一度も開けないことがある。
(もしもあらかじめ PC2 で回復エージェントを指定していたなら、暗号化ファイルの EFS DRA 証明書は削除されるのではなく PC2 の EFS DRA 証明書で置き換えられるので、二度目以降は PC2 の回復エージェント用に保存した EFS DRA 証明書をインポートすれば何度でも開くことができる。この時そのファイルには PC2 の EFS DRA 証明書と、PC1 での作成者の EFS 証明書が付加されている。なお、EFS DRA 証明書を使ってファイルにアクセスしている場合、ファイルを暗号化のままコピーしたりアプリケーションで開いて上書き保存しても、ファイルの EFS 証明書は現在のユーザーのものに置き換わらない。いったん暗号化を解除して暗号化し直すか、アプリケーションで開いて名前を付けて保存し直せば、EFS 証明書も現在のユーザーのものに置き換わる。)
つまり、「回復エージェントを指定していないシステムで EFS DRA 証明書を使って暗号化ファイルを開いた場合、そして作成者の EFS 証明書が得られない場合、良くて最初の一回しか開けない」ということなのである。後から回復エージェントを設定しても手遅れである。なぜならすでにそのファイルにはアクセスできなくなっているので、EFS DRA 証明書が追加されることはないからである。
PC1 の EFS DRA 証明書ではなく、PC1 での暗号化ファイル作成者の EFS 証明書をインポートして開いた場合には、現在のユーザーの EFS 証明書で置き換えられるが、もちろん何度でも開くことができる。同時に EFS DRA 証明書も現在のシステムの EFS DRA 証明書で強制的に置き換えられる (回復エージェントが設定されていなければ削除される)。ちなみに、現在のユーザーが一度も暗号化ファイルを作成したことがなく、自身の証明書を持っていないときにインポートすると、その EFS 証明書がそれ以後もそのユーザー自身の EFS 証明書となる。その後そのユーザーが初めて暗号化ファイルを作成しても、その EFS 証明書が使われ、別途新しい証明書が作成されることはない。
以上のようなことから、システム破損に備えてバックアップしておく証明書は、EFS DRA 証明書だけでは心許ない。Windows 2000 の時代には、すべてのシステムにデフォルトで回復エージェントが設定されていた (Administrator が回復エージェントの秘密鍵を持っていた) から、このようなトラブルは起きにくかったが、Windows XP ではデフォルトで回復エージェントが設定されていないので、この罠にはまってしまうケースが多々あると思われる。
対策としては、証明書をバックアップする際は、システムの EFS DRA 証明書だけでなく、各ユーザーの EFS 証明書も必ずバックアップする。また、EFS DRA 証明書をインポートする場合は、必ず現在のシステムに回復エージェントが設定されていることを確認する。そして現在のシステムの EFS DRA 証明書もあらかじめインポートしておくこと。なぜなら多くの場合、知らない間にアクセスが発生し、「二度目以降」のアクセスがすぐに必要になるから。
EFS DRA 証明書(秘密鍵つきの .PFX
ファイルと登録のための公開鍵だけの .CER
ファイル)を作成するには、cipher.exe
を /r
パラメータつきで使う。
/u
パラメータの説明文は翻訳が間違っている。正しくは「このオプションは /n
以外のほかのオプションと共には動作しません」であり、単独でも動作する。/?
での説明では正しくなっている。)
コマンド プロンプトで
cipher /r:ファイル名(拡張子なし)
.PFX
ファイルを保護するためのパスワードを二回入力する。.PFX
ファイル(秘密鍵つきの証明書)と .CER
ファイル(公開鍵だけの証明書)ができる。このファイルは EFS DRA 証明書としてのみ使用可能で、ユーザー自身の EFS 証明書としては使えない (ユーザーとは関係がない)。この証明書はインポートすると「目的」が「ファイル回復」と表示される。回復エージェントの公開鍵をシステムに追加するのは、
.CER
ファイルを指定して [開く] をクリックする。続いて、[次へ] − [完了] とクリックする。の操作でできる。複数の PC を管理している場合は、同じ EFS DRA 証明書を使って回復エージェントを登録すれば、EFS DRA 証明書の管理が一つで済む。
回復エージェント設定前に作成された暗号化ファイルは、次にアクセスされるまで EFS DRA 証明書が更新されないが、Windows XP で拡張された cipher
コマンドの /u
オプションを使って強制的に更新することもできる。更新するためにはアクセスが成功する (復号可能でアクセス拒否されない) 必要があるので、現在のユーザーの作成した暗号化ファイルしか更新されない。他のユーザーが作成した暗号化ファイルは、そのユーザーが cipher /u
を実行する必要がある。一方、すでに回復エージェントが設定されている場合に、回復エージェントを変更したり回復エージェントをさらに追加するために EFS DRA 証明書を更新する場合は、古い回復エージェントの証明書 (秘密鍵) をインポートしてから cipher /u
を実行すれば、システム内の (古い回復エージェントの証明書が付加されている) すべての暗号化ファイルの EFS DRA 証明書が更新できる (アクセス権で拒否されない限り)。ただし、cipher /u
はシステム内のすべてのファイルを「なめ回す」ため実行に非常に長い時間がかかるので注意。また、cipher /u
を実行して証明書が更新されても、ファイルのタイムスタンプは更新されず、ファイルサイズもアーカイブビットも変化しないので、NTBackup を含むほとんどのバックアップソフトでは変化を認識できず、自動的にはバックアップ対象にならない。手動で明示的に再バックアップ(フルバックアップ)を行う必要がある。
なお、cipher /r
コマンドで生成される EFS DRA 証明書は、cipher /r
を実行するたびにユニークな、異なるものが生成される。.PFX
ファイルには秘密鍵と公開鍵が、.CER
ファイルには公開鍵が保存される。秘密鍵はこの .PFX
ファイルの中にのみ存在し、他のどこにも存在しない(同じものを二度と作成することはできない)。秘密鍵を使うときは、この .PFX
ファイルをインポートしてから使う。cipher /r
コマンドを実行するたびに異なるペア (.PFX
ファイルと .CER
ファイル) が生成されるので、何度か cipher /r
を実行した場合には、どの証明書を回復エージェントに設定したか間違えないようにすること。回復エージェントに指定した .CER
ファイルと対になる .PFX
ファイルを保存しておくこと。間違えて別の .PFX
ファイルを保存していては無意味である。cipher /x
で出力される、各ユーザーの EFS 証明書は、繰り返し実行しても同じ .PFX
ファイルが出力される。これは各ユーザーの秘密鍵が別の場所(ユーザー プロファイル)に保存されているからである。
作成した EFS DRA 証明書 (.PFX
ファイル) は、リムーバブルメディアに移して金庫などの安全な場所に保管しておく。それも一カ所だけでなく、コピーを作って複数の場所に保管する。証明書ファイルにもバックアップは必要だからである。また、対象となる PC からは削除しておくこと。これは PC が盗難にあった場合に暗号化ファイルが解読される危険を減らすためである。.PFX
ファイルは作成時のパスワードで守られているだけなので、パスワードの安全性 (たいてい弱い) に依存している危険なファイルである。.PFX
ファイルを削除しておけば、その PC には回復エージェントの秘密鍵がどこにも存在しない。秘密鍵は必要なときだけファイルからインポートして使う。使い終わったらインポートした鍵も必ず削除する。Windows2000 ではデフォルトで回復エージェントが設定されている (Administrator、正確には最初にログオンした管理者ユーザーが回復エージェントの秘密鍵をインポート済になっている) ので、これをファイルにエクスポートした後に削除しておく。
各ユーザーの EFS 証明書(秘密鍵つきの .PFX
ファイル)の作成作業は、そのユーザーが既に自分のユーザー プロファイルに持っている証明書をファイルに書き出すことで行われ、「エクスポート」と呼ばれる。それには cipher.exe
の /x
パラメータを使っても良いし、インターネット オプションの「コンテンツ」の「証明書」の「個人」タブからのエクスポートでもできる。その方法は
の手順で行える。このファイルはインポートすると、「目的」が「暗号化ファイル システム」と表示される。
作成した EFS 証明書 (.PFX
ファイル) は、リムーバブルメディアに移して金庫などの安全な場所に保管しておく。それも一カ所だけでなく、コピーを作って複数の場所に保管する。証明書ファイルにもバックアップは必要だからである。また、対象となる PC からは削除しておくこと。これは PC が盗難にあった場合に暗号化ファイルが解読される危険を減らすためである。.PFX
ファイルは作成時のパスワードで守られているだけなので、パスワードの安全性 (たいてい弱い) に依存している危険なファイルである。ユーザーの秘密鍵は PC 内のユーザー プロファイルにも (ログオン パスワードに守られて) 存在しているが、危険を増やす必要はもちろんないからである。
証明書 (秘密鍵) のインポートは、 .PFX
ファイルをダブルクリックするか、インターネット オプションの個人タブの「インポート」ボタンをクリックして、証明書のインポート ウィザードを起動して行う。このとき、証明書のストア先を「個人」にする。
離れた場所の二つの PC (例として PC1, PC2 と呼ぶことにする) の間でデータを移動・共用する方法として、データをリムーバブルメディアに入れてオフラインで持ち運ぶ方法がある。例えば 2.5 インチの USB 2.0 インターフェースの外付けハードディスクには容量が 100GB のものもあり、大量のデータを持ち運ぶのに便利である。しかし、もしもその外付けハードディスクを運搬中に紛失してしまったり、盗難にあったりするとデータが漏洩することになり危険である。
このようなとき、その外付けハードディスクを NTFS でフォーマットしておいて、暗号化ファイルシステムを使用すれば、たとえハードディスクが盗まれてもデータは安全である。USB メモリなども、convert.exe
コマンドで NTFS に変換すれば同様に利用できる (例: E:
ドライブを変換する場合、convert E: /FS:NTFS
を実行)。
このような運用をする場合、暗号化したデータを PC1, PC2 のどちらでも読めるようにする必要がある。例えばPC1 の user1 と PC2 の user2 の間でデータを読み書きできるようにするには、両者の EFS 証明書を互いにインポートしておく必要がある。つまり user1 は user2 がエクスポートした証明書をインポートし、user2 は user1 がエクスポートした証明書をインポートする。こうすることによって、外付けハードディスクをどちらの PC につないだ場合でも、その中のデータを問題なく読み書きできるようになる。
この場合に注意することは、上でも述べたように、「データのアクセスに成功するとそのファイルの EFS 証明書は現在のユーザーの EFS 証明書で置き換えられる」という点である。あるファイルを user1 が暗号化して保存したものを user2 (user1 の証明書をインポートしてある) がアクセスすると、それだけでそのファイルの証明書は user2 のもので置き換えられる。従って、外付けハードディスクを何度も運搬してファイルを互いに参照したりすると、外付けハードディスクの中には証明書が user1 のファイルと証明書が user2 のファイルが混在することになる。もしも第三の PC でその外付けハードディスクのファイルをすべて読めるようにしようとする場合は、そのユーザーは user1 の証明書と user2 の証明書の両方をインポートする必要がある。
証明書がたくさんになることを避けるには、PC1 の user1 の EFS 証明書と PC2 の user2 の EFS 証明書が同じものであればよい。証明書をそろえるのは以下の方法でできるが、どちらかのユーザーがまだ一度も暗号化ファイルを作成していない場合が望ましい。以下の例では user1 の証明書にそろえる (user2 の EFS 証明書を user1 のものと同じにする) 場合を示すが、user2 がまだ一度も暗号化ファイルを作成したことがない (最初から「個人」タブの中が空になっている) なら、エクスポート作業がいらないので簡単である。
user1.pfx
ファイルとしてエクスポートする。「個人」タブで証明書のアイコンをダブルクリックすると表示されるウィンドウの「詳細」タブで「表示」を「<すべて>」にするとリストの下の方に「拇印」という欄があるので、それをクリックして表示される文字列 (40桁の16進数) をメモしておく (選択して Ctrl-C でコピーできる)。user2.pfx
としてエクスポートし、保存しておく。証明書の拇印もメモしておく。user1.pfx
をインポートする。user2.pfx
があるなら、それを再度インポートする (そうしないと以前に作成した暗号化ファイルにアクセスできない)cipher /u
コマンドを使って、古い暗号化ファイルに付加された証明書をすべて新しいもの (現在使っている、user1 と同じもの) に更新する。そうすれば user2 は「個人」タブから古い方の証明書を再度削除できる。削除するときは拇印をチェックして証明書を確認すること。なお、暗号化ファイルに現在付加されている証明書の拇印は、ファイルを右クリックして表示されるプロパティの「全般」タブで「属性」の「詳細設定」ボタンをクリックし、「暗号化属性」の「詳細」ボタンをクリックすると確認できる。この手法は、PC を新調したので新しい PC の新しいアカウントにこれまでの暗号化資産を移行したい、といった時にも便利である。証明書をそろえておくことのもう一つの利点は、どちらかの PC の Windows が破損して証明書ファイルが必要になったとき、他方の PC からエクスポートして取り出すことができるので、互いにバックアップになる、という点である (最初にインポートするときに「エクスポート可能にする」にチェックしておくこと)。つまり .PFX
ファイルを保管した金庫にすぐアクセスできなくても証明書ファイルが取り出せる。ただし双方の PC のログオン パスワードは十分長くて推測されにくいものにし、厳重に管理すること。
自分の EFS 証明書をエクスポートしていないうちに「個人」タブから削除してはならない。そのままログオフすると、以前に暗号化したファイルに二度とアクセスできなくなってしまう (回復エージェントを設定して EFS DRA 証明書をバックアップしていない限り)。削除しようとすると常に警告が表示されるはずだが、もしもエクスポートしていないのに削除してしまった場合は、決してログオフしてはいけない。ログオフせずに、すべてのファイルの暗号化をいったん解除すること。その後、いったんログオフしてログオンし直し、暗号化をやり直すと新しい証明書が自動生成される。新しい証明書の生成は cipher
コマンドの /k
パラメータを使っても行えるが、証明書を削除してしまった直後に実行してはいけない。証明書を削除して cipher /k
を実行すると、古い秘密鍵がすべて失われる。
証明書を削除しないで cipher /k
を実行した場合は、新しい証明書が作成されるが、古い秘密鍵はユーザー プロファイルに残されているので、古い暗号化ファイルにも引き続きアクセスできる。ただし古い秘密鍵はもうエクスポートできないので、証明書の更新後は、cipher
コマンドの /u
パラメータを使って、ローカル ドライブのすべての暗号化ファイルを新しい証明書での暗号化に更新しておく必要がある。リムーバブル・メディアに保存した暗号化ファイルも、すべてシステムにマウントして更新しておくこと。さもないと古い秘密鍵が使えなくなったときにそれらのファイルもアクセスできなくなる。新しい EFS 証明書は必ずエクスポートしておくこと。cipher /k
を実行する場面というのは、例えばエクスポートしておいた秘密鍵ファイルが漏洩した疑いのある場合である。すべてのファイルを新しい証明書に更新しておけば、古い秘密鍵しか手にしていない者はそれらを開くことはできない。
ノートパソコンなど、モバイル PC 全体を持ち運ぶ場合の盗難・紛失対策として EFS を使おうとする場合は注意が必要である。OS のあるハードディスクの中には、ユーザーの秘密鍵も入っている。これを簡単に使われないようにしなければならない。つまり、PC に簡単にログオンされないようにしておく必要がある。例えば PC を起動するだけでパスワードなしで自動ログオンできるようになっていると、EFS による暗号化は全く意味がなくなってしまう。ログオン パスワードは十分に長くて推測されにくいものにするとともに、ノートパソコンを閉じるだけでスタンバイ・休止状態にする運用をしている場合、スタンバイ・休止状態からの復帰には必ずパスワードが必要になるよう設定する。
また、Windows XP ではユーザーの EFS 秘密鍵はユーザーのパスワードを使って(正確には、ユーザーのパスワードで暗号化されたマスター キーを使って)暗号化されてユーザー プロファイルに保存されていて他の場所にはないので、ユーザーのパスワードが破られなければ、秘密鍵も安全であるといえる。だが、その安全性は、パスワードの強さ (判明しにくさ) に依存している。パスワードが十分に長くて推測しにくいものでなければ、安全性は大幅に落ちてしまう。
(ちなみに、Windows 2000 では秘密鍵のコピー(正確には、秘密鍵を暗号化しているユーザーのマスター キーのコピー)が LSA Secrets という場所にも格納されていた。この理由は、管理者がユーザーのパスワードをリセットしてもユーザーが再び秘密鍵を使えるようにするためであった。LSA Secrets は「システム キー」と呼ばれるマスター・パスワード (Windows インストール時に自動生成される) で暗号化されている。ところがデフォルトではこのシステム キーはハードディスク上に保存されており、PC ごと盗難にあった場合に何らかの方法でログオンに成功されると、システム キーは自動的に使用可能になってしまうため、まったく秘密鍵の保護にならない。攻撃者はハードディスクへの直接書き込みによって OS を大幅に改変し、SAM データベースというログオン パスワードのハッシュ値の保存場所を別のもので置き換えることによって、Administrator や任意の管理者のパスワードをリセットできるからである。その後、システム キーを使って LSA Secrets からマスター キー、ひいては秘密鍵を取り出すことができてしまう。システム キーをハードディスクから削除し、Windows 起動のたびに入力 (手入力またはフロッピーからの読み込み) するようにしておけば、たとえ攻撃者がハードディスク上の OS を強引に改変して (パスワード解読作業なしで) ログオンに成功しても、EFS 秘密鍵を手に入れることはできなくなる (システム キー で暗号化された LSA Secrets の解読作業か、ユーザー プロファイル内にあるユーザーのマスター キー(これはユーザーのログオン パスワードで暗号化されている)の解読作業、あるいはマスター キーで暗号化された秘密鍵そのものの解読作業が必要になる)。そのため、Windows 2000 では syskey
というコマンドを使ってハードディスクからシステム キーを削除しておくことが必須であった。逆に、Windows XP ではユーザーがパスワードを忘れたために管理者がユーザーのパスワードをリセットした場合、新しいパスワードでログオンしたユーザーは元の秘密鍵にアクセスできないので暗号化ファイルを復号化できなくなる。もちろん、ユーザーが正しいパスワードを使ってログオン後に自分でパスワードを変更した場合はきちんと秘密鍵にも反映される。)
一般にユーザーが作るパスワードは、せいぜい6〜8文字程度で、しかも英小文字しか使っておらず、あろうことか辞書に載っている単語だったりする。パスワードに工夫を凝らしているつもりでも、複数の単語を並べ、一部を大文字にし、i→1 o→0 といった陳腐な置き換えをしただけだったりする。このようなパスワードは、攻撃者から見れば存在しないに等しい。パスワードから暗号鍵を生成して「256ビットの暗号化」と謳ったりする暗号化ソフトがたまにあるが、パスワードが40ビット程度の強さしかなければ、その暗号化ソフトの強さは40ビットである。40ビットは256ビットに比べて2の-216乗、つまり10進数で-65桁、すなわち一億分の一の一億分の一の…と8回繰り返しただけの強さしかない。
EFS がユーザーのパスワードを暗号鍵として直接使用しない(パスワードから暗号鍵を生成しない)理由もここにあり、ユーザーのパスワードの強さは、ランダムに自動生成されたユニークな非常に長い暗号鍵に比べて一般に大幅に(天文学的な差で)劣るからである。自動生成された暗号鍵を使用していれば、暗号化ファイルだけが (例えば外付けハードディスクだけが) 流出した場合の安全性は十分に高い。しかし (パスワードで暗号化された) 暗号鍵と一緒に流出した場合は、暗号化ファイルの安全性もパスワードの安全性に依存することになる。従って、PC ごと盗難にあった場合の安全性は、パスワードの解読がどれだけ困難であるかにかかっている。
例えば、システム キーはユーザー パスワードのハッシュ値を格納している SAM データベースという領域を暗号化するのにも使われているので、Windows XP でも syskey
コマンドを使ってシステム キーをハードディスクから削除すればパスワードの解読が少し困難になる (SAM データベースの解読とハッシュ値の解読の両方が必要になるから)。しかしこれは解読の困難さを増やすという点ではあまり効果的ではない。パスワード保護を二重に掛けても、解読の困難さはせいぜい2倍にしかならないからである。これは暗号鍵の長さが1ビット増えたのと同等にすぎない。パスワードに使う文字が英数記号で64種類とすれば、一文字で6ビットあるので、パスワード保護を二重にするよりもパスワードを一文字伸ばす方がずっと解読が困難になる。
(直感的に分かりにくいので単純な例を挙げると、例えば暗証番号の桁数が4桁の場合、0000 〜 9999 の一万個の場合を試せば、暗証は破られる。暗証の保護を二重に掛けて、合計8桁の数字を覚えることにしても、攻撃者は最初の暗証に一万回、次の暗証に一万回の合計二万回の試行で暗証を破ることができる。これに対し、暗証の保護が一つしかなくても桁数を5桁に伸ばした場合は、攻撃者は 00000 〜 99999 の十万回の試行が必要になる。)
つまり、パスワードの解読を困難にするには、パスワードの長さが重要なのである。パスワードの長さが長くなるにつれ、解読の困難さは指数関数的に増大するので、少しでも長いパスワードを付けることが重要である。目安としては16文字以上。
以上のことから、モバイル PC のデータ保護に関しては、EFS の使用だけでなく以下のことが必要である。
syskey
コマンドを使って、ハードディスクからシステム キーを必ず削除しておく (Windows 起動時に毎回手入力する。このときのパスワードも十分長いものにすること)。更にセキュリティに万全を期すなら、仮想メモリのページングファイルと休止状態のハイバネーションファイルから情報が漏れることを防ぐため、これらをハードディスク上に残さないようにする。ページングファイルは pagefile.sys という名で、ハイバネーションファイルは hiberfil.sys という名で C: ドライブのトップに置かれている (隠しファイル属性が付いている)。これらのファイルは、メモリの内容をそのままハードディスクに書き出したもので、アプリケーションで暗号化ファイルを開いていると、アプリケーションに読み込まれた状態 (復号化された状態) のファイル内容が書き出されている。これらのシステムファイルは暗号化されていないので、このファイルを読み取ることにより、アプリケーションで開いていた内容が読み取られる可能性がある。仮想メモリのページングファイル容量はデフォルトでは物理メモリ容量の 1.5 倍あり (最大 3 倍まで自動的に拡張される)、ページングファイルに書き出されたデータは次に別のデータで上書きされるまでファイル上に残ったままになるので、たとえアプリケーションをすべて閉じてからシャットダウンしても、ページングファイルに機密データが残ったままになる可能性がある。一方、休止状態のハイバネーションファイルは、メモリの容量と同じサイズで、休止状態に入ったときの状態が書き出されるので、アプリケーションを閉じてから休止状態にするようにすれば、機密データの漏洩は防げる。しかしそれでは休止状態を使うメリットがほとんどない上、アプリケーションを閉じることを忘れる可能性もあるので、休止状態を無効にすることが望ましい。
仮想メモリのページングファイルは、シャットダウン時に自動的に上書きクリアするように設定できる。休止状態のハイバネーションファイルは、休止状態を無効にする以外に削除する方法がない。
仮想メモリのページングファイルをシャットダウン時に自動的に上書きクリアするように設定するには、
の操作をする。ただし、この設定をすると、シャットダウン時にページングファイル全体を上書きするため、シャットダウンに長い時間がかかるようになる。
休止状態を無効にするのは、[スタート] - [コントロール パネル] - [パフォーマンスとメンテナンス] - [電源オプション] の「休止状態」タブで行う。
多くの人は、「自分のパスワードを忘れさえしなければ、自分の暗号化したものは必ず復元できる」と思っているフシがある。しかし EFS に関してはこれは正しくない。秘密鍵ファイルが失われた場合、たとえパスワードを完全に覚えていたところで、暗号化ファイルは永久に失われたも同然である。多くのバックアップソフトで、暗号化ファイルは暗号化属性を維持したままでバックアップできる。だが秘密鍵を失えば、これらのバックアップもすべてが水泡に帰す。
Windows が何らかの理由で破損し、起動不能となって再インストールを余儀なくされることはままあることである。そのときに、エクスポートした秘密鍵ファイルが紛失・破損していたら、大惨事である。自分の作成したデータのファイルをバックアップすることの重要性は、広く認識されている。データが一カ所だけに存在するという状態は危険であり、複数の場所にコピーを保持することがデータの保全にとって死活的に重要であることは、よく知られている。ところが、データのバックアップに関心のある人でも、エクスポートした秘密鍵ファイルのバックアップを取ることは失念している場合が多い。
エクスポートした秘密鍵ファイルが一カ所にしかないということは、暗号化データが一カ所にしかないということと等価なのである。これはきわめて危険であり、エクスポートした秘密鍵ファイルは必ずコピーを作って別の場所にも保管しなければならない。できれば二カ所以上の、できるだけ離れた場所に、できるだけ異なった手段で保存することが望ましい(必ず記録媒体の種類を変えること。同種のメディアに保存していると、記録内容が同時に消失することがある)。しかも他人の手に渡らないように堅固で安全な場所を選ぶ必要がある。
暗号化したデータを保全するためには、秘密鍵ファイルにもバックアップが必要だということを忘れてはいけない。
離れた場所の PC 間でファイルをやりとりする方法としてリムーバブルメディアを使う方法を先に述べたが、双方にメールアカウントがあるなら、少量のファイルであればメールで転送できる。もちろん、このとき暗号化を解除しないで転送する必要がある。普通に暗号化ファイルをメールの添付書類にしても、添付した時点で暗号化は解除されてしまう。なぜなら、ファイルシステムから秘密鍵を使って読み取った結果の復号化されたファイルがメールソフトに渡されるからである。暗号化したままメールに添付したい場合は、ファイルシステム中で暗号化したままの状態をカプセル化(アーカイブ化)してくれるソフトで形式変換する必要がある。それをメールで転送し、受取側で再び変換して元の暗号化ファイルを取り出す。このためには、NTFS の EFS に対応したソフトを使わなければならない。Windows XP Professional には、このために使えるソフトが標準搭載されている。それは ntbackup.exe
で、「バックアップ」という名前で「システム ツール」の中にある。これを使って暗号化ファイルを暗号化したままメールで転送する方法を以下に示す。
送信側の操作:
.bkf
。受信側の操作:
なお、Windows XP Service Pack 1 以前では ntbackup による EFS の復元に一部不具合がある(Windows XP Service Pack 2 では修正されている)。
ちなみに、メールや ntbackup を使わない通常のファイル共有では、ドメイン環境でない場合は EFS 暗号化ファイルを暗号化したまま転送はできない。ドメイン環境であれば、ファイルサーバーを委任に対して信頼するように設定することで暗号化ファイルを転送できる。ただしいったん復号化されたファイルが転送されてサーバー上で再び暗号化されるので、通信途中では暗号化されていない。一方、非ドメイン環境で WindowsXP Professional をサーバーにしているような場合でも、IIS をコントロール パネルから追加インストールして WebDAV フォルダ(Web フォルダ)を作成すれば、サーバーに暗号化ファイルを転送できる。しかも通信途中も暗号化されている(「ファイル共有および Web フォルダのリモート EFS 操作」については前記のリンク参照)。ただしサーバーからローカルにアクセスする場合も WebDAV を使う必要がある(\\127.0.0.1\Webフォルダ名)。
秘密鍵を共有するほどでもない相手に特定の暗号化ファイルだけを送りたい場合は、相手のエクスポートした公開鍵だけの証明書(エクスポートするときに「いいえ、秘密キーをエクスポートしません」を選ぶと公開鍵だけの .CER
ファイルができる)を自分のインターネット オプションの「ほかの人」タブにインポートしておくと、暗号化ファイルのプロパティの詳細設定の詳細で「このファイルに自由にアクセスできるユーザー」としてその人を追加できる。そのファイルを上記の方法で転送すれば、秘密鍵を共有しなくても相手に読める暗号化ファイルを安全に転送できる。ただしこのためにはあらかじめ安全な経路(手渡しなど)で相手の公開鍵(.CER
ファイル)を入手しておく必要がある(メールは不可。暗号化しないメールは安全な経路ではない。相手の送ってきた公開鍵が途中で第三者にすり替えられる「なりすまし攻撃」の危険がある)。
また、暗号化による安全性は、長期にわたって保証されているわけではないことも理解しておく必要がある。インターネット等の安全でない経路を利用する場合、たとえ通信を暗号化していても、途中での傍受者はその通信内容をすべて記録して長期にわたって保管しておくことができる。そして何十年後かに、技術が進歩して暗号の解読が容易になってから、それを解読して秘密を暴くことは十分考えられる。暗号解読技術もコンピューターの性能も急速に進化しており、現在の暗号化アルゴリズムに脆弱性が発見される可能性は考えにくいもののゼロではないし、量子コンピューターのような画期的な発明によって現在の暗号が瞬時に解けてしまう事態が将来発生する可能性も否定はできない。というよりも、十分予想できる。従って、永久に秘密にしたい通信は、たとえ暗号化していても、決してインターネット等の安全でない経路を使ってはならない。これはメールだけでなく、SSL や SSH あるいは IPSec-VPN でも同じである。暗号化は(鍵長を無制限にしない限り)「しばらくの間秘密にできる」技術であって、「永久に秘密にできる」技術ではない。本当に秘密にしたい通信は、物理的に部外者がアクセスできない通信方法(手渡しなど)を使わなければならない。その意味で、メールを使って暗号化ファイルを送るのは、「遠い将来には漏洩しても構わない」情報に限るべきである。
近年、個人情報保護法の施行により個人情報の保護が義務づけられるなど、個人情報や機密情報の保護意識が高まると共に、データの暗号化の必要性を感じる人も増えてきた。雑誌や Web の記事などで Windows の EFS が紹介されることも増えたが、秘密鍵のバックアップが必要であることに触れた記事は少ない。そのせいか、EFS でファイルを暗号化したのはよいが、秘密鍵のエクスポートをしていないケースがまま見受けられる。そのような人が、システムの調子が悪くなったからといって安易に Windows を再インストールした結果、データを開こうとしても開けなくなっていることに気づき青ざめる、という例も後を絶たない。データのファイルを外付けハードディスクなど、Windows のある C: ドライブ以外に置いていた場合、まさか C: ドライブの再インストールでそのファイルが使い物にならなくなるとは想像できないからであろう。ファイルが開けなくなった後で調べて回った結果、秘密鍵のバックアップが必要だったことを知り愕然とするが、もはや手遅れである。
しかし、あきらめるのは少しだけ早いかも知れない。C: ドライブを再フォーマットし、Windows を再インストールしても、以前の秘密鍵がハードディスク上に残されている可能性はある。通常、ドライブを再フォーマットしてもデータの「目録」が消されるだけで、ハードディスク上のデータそのものは消されない。Windows を再インストールしても、ハードディスク上で先の Windows のインストールと同様の場所を占め、秘密鍵が上書きされていない可能性は十分ある。もちろん、秘密鍵が上書きされてしまう可能性も同様にあるが、再インストール直後であれば、秘密鍵を救出できる可能性は検討に値するだけはある。
Windows が再インストールされたドライブから秘密鍵を救出して復元しようとする場合、二つの市販ソフトが必要になる。
復旧作業は、まずデータ・リカバリー・ソフトでハードディスクから救出可能なファイルを救出し (その中に秘密鍵があればよい)、その後 Advanced EFS Data Recovery で復元を試みる、という手順になる。ハードディスクからの秘密鍵の救出確率を少しでも高めるために、問題の C: ドライブには一切書き込みをしないこと。ただちに PC をシャットダウンし、C: ドライブのあるハードディスクを取り外す。その後、別の PC、または別のハードディスクにインストールした Windows から秘密鍵の救出を試みること。
秘密鍵が上書きされていて救出できなかった場合は、できることはほとんどない。Windows に標準付属のバックアップ (ntbackup.exe) で C: ドライブと“System State”を含めてバックアップが取ってあれば、それらを新しい Windows (同じサービスパックのもの)に上書き復元する(復元先を「元の場所」にし、 ntbackup の「ツール」メニューの「オプション」の「復元オプション」で「常にディスク上のファイルを置き換える」を選ぶ)ことで秘密鍵を復元できるが、そのようなバックアップを取っていなければ、素直にあきらめてデータを作り直すしかない。暗号化アルゴリズムを破ってデータを復元することは、事実上不可能である。EFS に使われている暗号化アルゴリズムは業界標準のものであり、暗号化技術の集大成とも言える強力なもので、弱点が見つかる可能性は期待できない。ただ、EFS にも使われている公開鍵暗号化方式は、将来「量子コンピューター」が実現されると、高速に解読できると言われている。しかしそれが現実のものとなるには長い時間がかかると見られている。
自分で量子コンピューターを開発する以外の方法が絶対にないかと言えばそうでもなく、軍事用に匹敵する専門機関であれば、上書きされたデータの下にあった上書き前のデータを読み取ることは不可能ではない。ハードディスク上でデータは“0”と“1”のビットで記録されているが、データの上書きには次の四種類がある。
“0”や“1”の信号は磁気で記録されているが、例えば現在の値が同じ 1 であっても、「0 の上に 1 を上書き」と「1 の上に 1 を上書き」では信号の強さがわずかに異なる。ハードディスクの制御回路は信号の強さをある「しきい値」を境に“0”と“1”に分離するデジタル処理をしているだけなので、このわずかな違いを検出することはできない。しかしハードディスクの回路を大幅に改造して、信号の強さをアナログ的に測定できるようにすれば、このわずかな違いを検出することができ、上書き前のデータを復元することができる。従ってこのような改造のできる技術と設備を持つ者であれば、一度上書きされたデータの下からさえ、以前のデータを復元できる。このため、軍用規格ではデータの消去の際はランダムなデータを“0”と“1”を反転しながら最低三回以上上書きするなどの入念な処理を行っている。市場では「データ復旧サービス」と銘打ったサービスを行う会社が多数存在するが、それらはハードディスクが動かなくなった、などの簡単な改造 (部品交換) で済む場合を対象にしていて、データをアナログ的に読む必要のある「上書きされたデータの復元」を手がけている所は見当たらない。しかし自分でやるなら量子コンピューターを開発するよりは簡単そうである。
EFS を使用していると、何らかのきっかけで下記のようなトラブルに遭遇することがある。
この現象がなぜ発生するかは、はっきりしないが、原因は何らかの理由でユーザープロファイルディレクトリの中に不必要に多数のシステムファイルが作られてしまうことにある。具体的には、C:\Documents and Settings\<ユーザー名>\Application Data\Microsoft\Protect フォルダの中にユーザー SID 名のフォルダがあり、その中に数千〜数万の小さなファイル(隠しファイル)ができている。このディレクトリは、ユーザーのマスター キー(ユーザーの EFS 秘密鍵を暗号化する鍵で、ユーザーのパスワードで暗号化されている)が保管される場所で、マスター キーは定期的(デフォルトでは90日ごと)に更新されファイルが一つずつ増えていくだけのものである(どれも削除はできない)。ここにマスター キーとそっくりのファイルが短期間に無数に作成されるのは明らかに異常な動作と思われるが、これらをいったんすべて削除することでこの問題は解決できる。ただしユーザーのマスター キーが失われるので証明書はすべてエクスポートしておくこと。 EFS 証明書も再度インポートし直す必要が生じる。操作手順は以下の通り。
.pfx
ファイルとしてエクスポートする。.pfx
ファイルをインポートし直す。この操作で再び Protect ディレクトリにユーザー SID 名のフォルダが作成されるが、そこに直ちに多数のファイルが作られることはない。現象としては、この PC を非ドメイン環境でファイルサーバとして使用している場合に、他の PC から暗号化ファイルをアップロード(非ドメイン環境なので暗号化は解除されることを承諾して転送)した場合に、ここにかなりの数のファイルが作成される。暗号化ファイルを非ドメイン環境でファイルサーバにアップロードしようとすると、「ファイル '<ファイル名>' は、その暗号化を失わないでコピーしたり移動したりできません。このエラーを無視して続行するか、取り消してください。」という警告が表示される。ここで「無視」あるいは「すべて無視」を選択すると、暗号化が解除されて転送されるが、転送されるファイルが一つしかなくても、Protect\<ユーザー SID> フォルダに数個以上のファイルが作成される。ファイルの転送元であらかじめ暗号化を解除してから転送(暗号化が解除される警告を出さないようにして転送)した場合には作成されない。
暗号化アルゴリズムの進化は続いており、Windows 7 (Business 以上のエディション) の EFS では新たに ECC (楕円曲線暗号) も導入された。暗号化アルゴリズムの進化に対応して新しい暗号化アルゴリズムを利用することが安全性の強化の観点からは望ましいが、全ての PC を一斉にアップグレードすることができない場合、古い暗号化アルゴリズムを使い続けざるをえないこともある。Windows XP マシンが多数ある環境に Windows 7 マシンを導入する場合、ファイルのやり取りの都合上 Windows XP がサポートする方法で EFS を使用し続けなければならない場合もあろう。
Windows 7 の EFS のデフォルトの暗号化アルゴリズムは Windows Vista と同じく AES (256bit) と RSA (2048bit) である。ただし Windows XP で作成した 1024bit の RSA 自己署名証明書もインポートして使用できる。またデフォルトの鍵長も変更できる。Windows 7 マシンと従来の Windows XP マシンで暗号化ファイルを共用するためには、下記のようにする。RSA の鍵長を 1024 ビットにすることがポイントである。
.pfx
ファイルとしてエクスポートする。以上の操作で Windows 7 マシンでも以前の Windows XP マシンで使っていた EFS 暗号化ファイルがそのまま開け、また Windows 7 マシンで新規に作成した EFS ファイルを Windows XP マシンに持って行っても、問題なく開いて使うことができる。
Windows XP までは、非ドメイン環境(ワークグループ環境)ではネットワーク ファイル共有(SMB)上で EFS を使用することはできなかった。しかし Windows 7 以降は限定的ながら非ドメイン環境のファイル共有でも EFS が使えるようになった。
「限定的」というのは、証明書の扱いに制限があるためである。ファイルサーバー A の上のユーザーアカウント User1 がファイルサーバー上に EFS 証明書 C1 をすでに持っていて、クライアントマシン B にも同じアカウントと同じ証明書 C1 を持っていたとする。Windows 7 以降、クライアント B にサインインした User1 がファイルサーバー A から EFS 暗号化されたファイルを手元のクライアント B にダウンロードすることは常に可能になった。
しかし、アップロードに関しては事情が異なり、単純にエクスプローラーを使ってファイルをアップロードするとサーバー A 上の User1 のアカウントに新規に EFS 証明書 C2 が作られ、それを使って暗号化されたファイルとして保存される。そしてファイルサーバー A 上では User1 のデフォルトの EFS 証明書は C2 となってしまう。
そのため、後にクライアント B にサインインした User1 がそのファイルをダウンロードしようとしても、エラーとなってダウンロードできなくなる。クライアントマシン B 上の User1 のアカウントには EFS 証明書 C2 はないためである。
ただし、クライアントマシンからアップロードするときに常に新規に EFS 証明書が作成されるわけではない。例外として、「サーバー A にサインインして、今より数十分以内に EFS 証明書 C1 を使って EFS 暗号化操作をしたことがある」場合に限り、新規に証明書が作成されることはなく既存の証明書 C1 が暗号化に使用される。この「数十分」とは約30分(10分以上1時間未満)である。
そのため、証明書が新規作成されることを避けるためには以下のような対処法が必要である。
アップロードの頻度が少ないなら、その都度リモートデスクトップでサインインして暗号化するのでもよいし、頻度が高いなら、AutoHotkey 等のスクリプトを使って、「EFS フォルダに小さい非暗号化ファイルをコピー」→「そのファイルを削除」という操作を 10 分置きに繰り返すようにしておけばよい。これによりサーバー A 上では 10 分置きに EFS 証明書 C1 が使用されることになり、タイムアウトが発生しなくなるので、いつクライアント B からファイルをアップロードしても証明書は C1 が使われるようになる。