1年ほど前から、いろいろな雑誌記事で無線LAN(IEEE 802.11b/a/g)のWEP暗号が解読される危険性がとりあげられている。
私の家で利用している無線LAN機器は2〜3年前のルーター機能付きアクセスポイントと無線LAN PCカードである。これらは「64ビットWEP」にしか対応していない。64ビットWEPというのはユーザーが指定できるキーの長さがわずか40ビットであり、「WEPの数学的な脆弱性(上記の資料を参照)」を利用するまでもなく、総当たり攻撃で実用的に解読できるほど頼りないものだ。近所に「スキルと覗き趣味のある人」がいれば、無線LANでやりとりしている内容がわかってしまうだろう。
無線LANで流れている情報の中で、特に問題になるのは次のものだ。
上記以外にも、アクセスしたWebサイトの情報があるが、それは「非常に困る情報」には含めない。ショッピングサイトに入力するクレジットカード番号などがあるが、その種のサイトとのやりとりはSSLで暗号化されるのがあたりまえなので、WEPが破られただけでは情報は漏れない。
最後の「SSLで暗号化された内容は、WEPが破られただけでは漏れない」点は重要だ。SMTPとPOPの通信内容も、同じようにWEP以外の暗号で保護すればよい。
PGPやS/MIMEを使って、メール本文や添付ファイルを暗号化する方法もある。しかしメールをやりとりする相手が、全員PGPかS/MIMEを使えるケースは少ないだろう。PGPやS/MIMEを使わない相手とのメールは、結局別の方法でカバーすることになる。
たとえると、次のような感じである。外務大臣と大使がやりとりする文書は、普通の郵便(安全ではない通信路)で送られるとしよう。
|
外務大臣---平文の文書-->外務省の暗号係---暗号文--->大使館の暗号係---平文の文書--->大使 |
外務大臣と大使は、それぞれ暗号を意識することはない。これと同じように、「暗号化トンネリング」を使用すると、アプリケーションとサーバーが暗号化の機能を持たなくても、通信を暗号化できるようになる。無線LANが安全ではない通信路なので、その両端に暗号係となるソフトウェアを配置するわけだ。
暗号化トンネリングを実現するプロトコルおよびソフトウェアには、次のようなものがある。
SSL
よく知られているとおりWebショッピングで使われているが、他のプロトコルの暗号化トンネリングにも使える。
SSH
"Secure Shell"の意味で、UNIXで暗号化されたリモートログインができるように開発された。リモートログインだけでなく、暗号化トンネリングの機能もある。利用するにはSSHクライアントとSSHサーバー(SSHデーモン)が必要である。上の外務省の例でいえば、大使館の暗号係は、外務省の暗号係とは違うタイプの人でないといけないようなものだ。
Zebedee
上の2つはプロトコルの名前だが、これはプロトコルではなくソフトウェアの名前だ。暗号化トンネリングを主な目的として作られている。本稿では、このソフトウェアを選択する。
作者 Neil Winton氏
ダウンロード先 http://www.winton.org.uk/zebedee/download.htm
Norton AntiVirus 2003 (Internet Security 2003も同じ)
Norton AntiVirus 2003を使っている場合、本稿の方法による「送信・受信メールの暗号化トンネリング」を行うには、メーラーでSMTPサーバーのポート番号を25以外(10025など)にする必要がある。本稿の操作例ではSMTPサーバーのポート番号を10025に設定する。
さらに、メーラーでPOPサーバーのポート番号を110以外(10110など)にする必要がある。本稿の操作例ではPOPサーバーのポート番号を10110に設定する。
この制限があるのは、[電子メールスキャン]で[着信電子メールをスキャン]および[発信電子メールをスキャン]をオンにしている場合でも、オフにしている場合でも同じだ。
また、オンにしている場合でも、SMTPサーバーとPOPサーバーのポート番号を25と110以外に設定することによって、Norton AntiVirus 2003の送信・受信メールのスキャンはできなくなる。その分は、Norton AntiVirusのAuto-Protect機能で補完してほしい。
ウイルスバスター2003
ウイルスバスター2003を使っている場合、本稿の方法による「受信メールの暗号化トンネリング」を行うには、メーラーでPOPサーバーのポート番号を110以外(10110など)にする必要がある。本稿の操作例ではPOPサーバーのポート番号を10110に設定する。
この制限があるのは、[メール検索]で[受信メール(POP3メール)検索を有効にする]をオンにしている場合でも、オフにしている場合でも同じだ。
また、オンにしている場合でも、POPサーバーのポート番号を110以外に設定することによって、ウイルスバスター2003の受信メール検索はできなくなる。その分は、ウイルスバスターのリアルタイム検索機能で補完してほしい。
ウイルスバスター2003では、送信メールのスキャン機能はないため、送信メールについては同じような問題はない。
この操作によって、ウイルスバスター2003の受信メール検索はできなくなる。その分は、ウイルスバスターのリアルタイム検索機能で補完してほしい。
MacAfee.com ウイルススキャンオンライン
この製品は「プロキシ方式のメールスキャン機能」を使用しないので、本稿で説明する方法とは競合しない。
これに対してSSHとSSLはどうかというと:
SSH
SSHサーバー(SSHデーモン)がトンネルの先に必要であり、Windowsでは手軽にインストールできない。使うとしたら、Cygwin(Windowsで動くUNIXツール集)をインストールするのが一般的で、その手間はZebedeeのインストールとは比較にならない。
SSL
「認証機関」、「サーバー証明書」などの用語説明を読む間に、Zebedeeの設定はできてしまうだろう。
SSLに対応しているメーラー(Outlook Express、Netscape Messengerなど)を使う場合は、クライアントPCで新規に必要なものはないため、そこは利点である。SSLについての知識があれば、ZebedeeではなくSSLトンネリングを使ってもよいだろう。サーバー証明書の作成には「EasyCert」、SSLトンネリングには「wstunnel」を使うのがよいと思う。
Zebedeeでは、クライアント-サーバー間のセッションごとに新しい鍵が生成され、その鍵(セッション鍵)でパケットが暗号化される。暗号化アルゴリズムは"Blowfish"、鍵の長さは4〜576ビットだ。デフォルトは128ビットであり、本稿では256ビットに設定する。Blowfishについては、現在のところ脆弱性は発見されていない。
セッション鍵は、Diffie-Hellman鍵交換という方式で、クライアントとサーバーの間で交換される。原理的には、SSHやSSLもほぼ同じである。
「公開されている解読ツール」が、Zebedeeでは(私の知る限り)存在しないことも大きな利点だ。WEPには「公開されている解読ツール」があり、それがなければ本稿を書くこともなかっただろう。
UNIX
ソースからコンパイルすることで、各種のUNIX系OSで利用できる。LinuxにはRPM形式のバイナリパッケージが用意されている。
Mac
MacOS Xはソースからコンパイルすれば利用できる。実例はhttp://homepage1.nifty.com/glass/tom_neko/web/web_zebedee.htmlにある。
MacOS 9などでは、Java版を利用できる(はずだが、実例の報告は見たことがない)。
図(1) 無線LAN機能を持つルーターを使う構成
![]() |
図(2) ルーター機能を持たない無線LANアクセスポイントを、ケーブルでルーターに接続する構成
![]() |
「Zebedeeクライアント」は無線LANカードをセットしたPCで、図では1台だが複数台でもよい。
無線LANで流れるパケットは、WEPに加えてZebedeeで暗号化される。
Zebedeeサーバーマシンとアクセスポイント(ルーター)はイーサネットケーブルで接続される。その区間では、「ZebedeeクライアントマシンとZebedeeサーバーマシンの間で送受信されるパケット」が暗号化される。「ZebedeeサーバーマシンとISPの間で送受信されるパケット」は暗号化されない。
パケットは次のように処理される。
上の2つの構成のうち、図(1)(無線LAN機能付きルーターを使う構成)が成立する大前提は「ケーブルで送受信されるパケットは、無線LANのパケットとして漏れない」ことだ。同時に、「送信先を指定した場合に限り、無線LANとケーブルの間でパケットが流れる」ことも必要だ。
もし有線側のパケットが無線LANのパケットとしても漏れてくるなら、有線でだけ流れるはずの平文のパケットが無線で漏れてしまい、意味がなくなってしまう。幸い、有線側と無線側のパケットは、勝手に互いに漏れることはないようだ。
原理的にそうなっているわけではないので、有線側と無線側のパケットがリピータハブのように自由に流れるアクセスポイントが、ひょっとしたら世の中には存在するのかもしれない。アクセスポイントの負荷から考えると、有線側のパケットをいちいちWEPをかけて無線側に転送するのは不合理だ。
私自身の例をあげると、アクセスポイントはNECのWL30Aであり、内蔵ルーター機能を使う状態ではうまくいかず、内蔵ルーター機能がオフになる「無線HUBモード」にし、ルーターは別の機器を使用することで実現できた。図(1)の構成にできると予想していたのだが、わざわざ図(2)の構成にしなければならなかったわけだ。
上の2つの構成のうち、図(2)(ルーター機能のないアクセスポイントをルーターに接続する構成)では、アクセスポイントとルーター間のケーブルを流れるSMTPとPOPのパケットは暗号化されたものだけなので、漏れの問題はない。
イーサネットケーブルで、Zebedeeサーバーマシンをアクセスポイントに接続する。アクセスポイントにルーター機能がない場合は、次のものに接続する。
ここでは、クライアント、サーバー、アクセスポイントとも、ホスト名ではなくIPアドレスで識別する例だけを説明する。また、クライアントとサーバーには、それぞれ固定のIPアドレスが設定されていることを前提とする。[IPアドレスを自動的に取得する]設定にしている場合は、固定アドレスを設定する構成に変える必要がある。
Zebedeeの起動
|
>cd Zebedeeのインストールディレクトリ
>zebedee -s -d www.google.com:80 (次はメッセージ) ZEBEDEE(72195/36331): waiting for connection on port 11965 _(-dオプションを付けたため、プロンプトが表示されないままになる。この状態ではCtrl+Cを押すだけでZebedeeを終了できるので、テストに適している) |
|
>cd Zebedeeのインストールディレクトリ >zebedee -d ZebedeeサーバーマシンのIPアドレス 10080:www.google.com:80 (次はメッセージ) ZEBEDEE(6291/9655): waiting for connection on port 10080 ZEBEDEE(6291/9655): waiting for client connection _(-dオプションを付けたため、プロンプトが表示されないままになる。この状態ではCtrl+Cを押すだけでZebedeeを終了できるので、テストに適している) |
これで、クライアントのWebブラウザから10080ポートに接続すると、パケットが暗号化されてZebedeeサーバーに送られ、復号されたパケットが、ZebedeeサーバーからGoogleのWebサーバーに送られることになる。
| http://localhost:10080/ |
Googleのトップページが表示されたなら、接続はうまくいっている。
PCにパーソナルファイアウォールをインストールしていると、上記の操作のどれかのタイミングで、Zebedeeの通信について警告が表示される場合がある。その場合は、Zebedeeの通信を許容するように設定してほしい。
Zebedeeの終了
ここで、いったんZebedeeを終了する。
Zebedeeクライアントマシンのコマンドプロンプトで、Ctrl+Cを押す。
Zebedeeサーバーマシンのコマンドプロンプトで、Ctrl+Cを押す。
|
>zebedee -p > sec.key
>zebedee -P -f sec.key > id.txt |
"sec.key"、"id.txt"は例であり、別の名前でもよい。"sec.key"ファイルはクライアント設定ファイルの"include"行で指定するので、別の名前にするなら、設定ファイルでもその名前を指定する必要がある。
Zebedeeクライアントマシンが複数あるなら、各マシンでも同じ操作を行う。"id.txt"ファイルはZebedeeサーバーマシンに移動するので、それぞれ別の名前にする必要がある。
Zebedeeクライアントマシンが複数あるなら、上記の手順をマシンの分だけ繰り返す。
sec.keyの格納場所は、Zebedeeクライアントマシンの設定ファイルの"include"キーワードで指定される。client.idの格納場所は、Zebedeeサーバーマシンの設定ファイルの"checkidfile"キーワードで指定される。これらの指定方法は後述する。
こうすることで、秘密鍵であるsec.keyと同じ中身を持つファイルを持っていなければ、Zebedeeサーバーマシンに接続できないようになる。この「秘密鍵」はZebedeeクライアントマシンの認証にだけ使われる。パケットの暗号化には「セッション鍵」が使われ、この鍵はセッションごとに違ったものが生成される。
ZebedeeサーバーマシンのC:\Program Files\Zebedee\server.zbdをテキストエディタで開き、下記のように編集する。
|
#message "DEFAULT CONFIGURATION FILE -- EDIT BEFORE USE"
先頭に#を入力する。 detached true "false"を"true"に変更する。 keylength 256の行の下に、 minkeylength 256 と入力する。鍵の長さにゼロを指定してサーバーにアクセスされるのを防ぐ設定だ。 logfile './server.log' ログファイルにログをとるなら、先頭の#を削除する。これは任意。ログをとる場合、server.logというファイルを用意する必要はない。Zebedeeの起動時に自動的に作られる。 checkidfile './clients.id' 先頭の#を削除する。 #redirect none 先頭に#を入力する。こうしないと、Zebedeeクライアントからの通信が中継されないので注意。 target ISPのSMTPサーバーのホスト名:25 target ISPのPOPサーバーのホスト名:110 上の2行を入力する。ここは最も重要で、ZebedeeクライアントからのSMTPとPOPのパケットをISPのサーバーに中継する設定だ。 |
|
"c:\Program Files\zebedee\zebedee.exe" |
のように表示されているので、この内容を次のように編集する。
|
"c:\Program Files\zebedee\zebedee" -f server.zbd |
-fとserver.zbdの間には英数スペースが必要。
"-f server.zbd"を指定することで、サーバー用設定ファイルを読み込んで起動するようになる。
これで、Zebedeeサーバーマシンの起動時に、Zebedeeがサーバー用設定ファイルを読み込んで起動するようになる。
Zebedeeクライアントマシンで、C:\Program Files\Zebedee\vncviewer.zbdを、client.zbdという名前でコピーする。client.zbdをテキストエディタで開き、下記のように編集する。
|
"c:\Program Files\zebedee\zebedee.exe" |
のように表示されているので、この内容を次のように編集する。
|
"c:\Program Files\zebedee\zebedee.exe" -f client.zbd |
-fとclient.zbdの間には英数スペースが必要。
"-f c:/zebedee/client.zbd"を指定することで、クライアント用設定ファイルを読み込んで起動するようになる。
これで、クライアントマシンの起動時に、Zebedeeがクライアント用設定ファイルを読み込んで起動するようになる。
ウイルスバスター2003を使っている場合、POPアカウント名が
アカウント名/pop-server.ispdomain.co.jp
のように、ウイルスバスターによって自動的に変更されているかもしれない。この場合は、ウイルスバスターによって変更される前の状態(「アカウント名」だけ)にする。
ZebedeeクライアントマシンとZebedeeサーバーマシンをリブートする。スタートアップフォルダにZebedeeを起動するショートカットを入れているので、デスクトップが表示されるとZebedeeも起動する。
インターネットに接続し、Web、メールなど普段どおりの操作が可能か、確認すること。
Zebedeeでメールなどが暗号化されているか確認するには、パケットモニタという種類のソフトウェアが必要になる。
ここでは、Windows 95/98/Meで使用できる、次のソフトウェアを紹介する。
VIGIL(シェアウェア)
作者:SapporoWorks
ダウンロード先:http://homepage2.nifty.com/spw/vigil/
ダウンロードとインストール
「フルセット版」の方のアーカイブをZebedeeクライアントマシンにダウンロードし、適当なフォルダに解凍する。
解凍されたファイルの中に「WinPcap_2_3.exe」がある。このファイルは、パケットモニタに必要な「winpcap.dll」のパッケージだ。WinPcap_2_3.exeをダブルクリックしてWinPcapのインストーラを起動する。特に設定することはないが、ライセンス画面で[Yes, I agree with all the terms of license agreement]をチェックしないと、先に進めない。
VIGIL自体にはインストーラはなく、解凍されたvigil.exeをダブルクリックすると操作開始できる。
VIGILの実行
普通のイーサネットカードの場合、[PROMISCUS]を選択すると、カードを通過するパケットすべてをキャプチャできるのだが、無線LANカードの場合、WinPcapでは完全なプロミスキャスモードにならないものが多いようなので、ここでは[LOCAL]を選択する。この選択では、自分から発信したパケットと自分に送信されたパケットが表示される。Zebedeeによる暗号化を確認するには、これで十分である。
こちらはPOPによるメール受信がZebedeeで暗号化されている状態のパケット。
それぞれ、内容が読めないものになっているはずだ。
実際は、これらの内容に対して、さらに(頼りないが)WEPによる暗号化が行われている。WEPの暗号化は、IPパケットよりも物理層に近い側で行われる。VIGILには、WEPが復号されたあとの状態だけが表示されるため、WEPで暗号化された状態は見えない。
VIGILのようなツールを使うのが初めてという人には、Zebedeeによる暗号化の実感がわかないかもしれない。可能なら別のPC(有線LANかダイヤルアップで接続するもの)でもVIGILを実行し、普通の方法でメールを送受信してみるとよい。SMTPサーバーおよびPOPサーバーとの通信内容が、全部読めることがわかるだろう。
もう1台、無線LANを使うPCがあり、そのOSがWindows 2000/XPであれば、次のソフトウェアを使用することで、WEPが破られてもZebedeeによって安全が保たれているかを検証できる。ただしすべての無線LANカードで動作するわけではない。
AirCapture(フリーウェア)
作者:有限会社レイヤー
ダウンロード先:http://www.pacmon.jp/aircap/
AirCaptureが動作するPCで、WEPキーを同じにすれば、WEPが復号されて表示される。ZebedeeやSSLなどで暗号化されていないパケットは、内容が平文として読めてしまう。Zebedeeで暗号化されていれば、同じWEPキーが設定されていても、読めない内容が表示されるはずである。
Zebedeeを使用する構成にすることで、それまでなかった弱点が生じることはないだろうか?
Zebedeeクライアントマシンでの安全性
クライアントモードのZebedeeに対して、外部から接続されることはないだろうか。本稿の設定ファイルには"localsource true"の行があるため、Zebedeeに接続できるのは、Zebedeeクライアントマシン自身(localhost)からだけになる。
Zebedeeサーバーマシンでの安全性
サーバーモードのZebedeeに対して、外部から接続されることはないだろうか。本稿の設定ファイルでは"checkidfile './clients.id' "の行を有効にし、clients.idファイルにZebedeeクライアントマシンのIDを入力している。そのため、Zebedeeクライアントマシンの秘密鍵"sec.key"ファイルを持たないマシンからは接続できない。
sec.keyを盗まれる危険性は、一般的なセキュリティ対策でカバーすべき問題だろう。
Zebedeeによるトンネルが切断されている状態の安全性
本稿の方法では、メーラーのSMTPサーバーとPOPサーバーの両方とも、localhostに設定してしまう。そのためZebedeeが落ちた場合、メールの送受信はできなくなる。これは"fail safe"な状態といえる。
そうではなく、WEPキーはときどき変更しなければならない。Zebedeeで暗号化されるのは、メールなどの通信内容だけである。WEPキー自体は脆弱なままだ。したがって、
ヒント:無作為なWEPキーを簡単に生成する方法
あなたのアクセスポイントが「64ビットWEP(ユーザー指定鍵長40ビット)」の製品であれば、絶対に「16進数10桁」でWEPキーを指定しなければならない。「英数字5文字」では組み合わせの数が少なすぎる(約9億1600万)。16進数10桁にすれば、組み合わせの数が約1200倍多くなる。
とはいえ、無作為な16進数を作るのは、人手では面倒である。「安全なパスワード・暗号鍵のためのTips」の「MD5チェックサムをパスワード・暗号鍵に使う」を参照するとよい。
本稿では、家庭またはSOHOでのネットワークを対象にしたが、Zebedeeによる暗号化トンネリングは、公衆無線LANスポットでISPのメールを送受信する場合にも、利用できるのではないかと予想できる。その場合は、インターネット側からZebedeeサーバーマシンに接続するために、ダイナミックDNSサービスを利用することになるだろう。