豊田 孝
前回はWindows Messengerを取り上げました。その中で,Windows XPで利用できるWebサービスの一部は,特定の論理ポートが“開かれている”という前提で機能することを学びました。本日はまず“論理ポートを開く”とはどういう意味かを説明し,続いて,論理ポートと,私たちの知らない間に起動されているWindowsプログラムの関係を検討します。次回取り上げる「簡易ファイアウオール」機能を活用するための基礎知識となりますので,最後までお読みください。それではさっそく本論に入りましょう。
図1●「netstat.exe」プログラムの実行結果 |
“論理ポートを開く”とはどういう意味か
論理ポートの“ポート”は“港”という意味を持っています。このため,ポートを開くという行為は,“開港する”ということになります。わが国の歴史では,開港と開国が同じ意味で使われた時代があったように,港を開くということは,国家やその国の文化全般に影響を与える,重大な決断です。それでは,港ではなく,論理ポートを開くということは一体どのような意味を持っているのでしょうか。さっそく回答を探してみましょう。説明内容に具体性を持たせるために,まず図1[拡大表示]の画面を見ていただきましょう。この画面は,第6回で紹介したWindows XPに付属する「netstat.exe」プログラムの実行結果を示しています。このプログラムの使い方は後で説明します。一見すると難しい印象を受けてしまいますが,この画面は次のようなことを私たちに教えてくれていると考えるとよいでしょう。なお,以降の説明には,Windowsプログラムとプロセスという用語が頻繁に登場しますが,ここでは,“Windowsプログラムが動作を開始すれば,そのプログラムはWindowsプロセスになる”と考えておいてください。
画面を見ると分かるように,左端からProto,Local Address,Foreign Address,State,PIDという5つの項目があります。これら5つの項目は,次のような意味を持っていると考えておいてください。
・Proto:インターネット上にある2つのコンピュータ同士が通信するための約束事(例:TCPなど)
・Local Address:IPアドレスと論理ポート番号で構成され,自分のコンピュータ上で動作しているプログラムを識別する数値
・Foreign Address:IPアドレスと論理ポート番号で構成され,通信相手のコンピュータ上で動作しているプログラムを識別する数値(このプログラムはWindowsプログラムとは限らない)
・State:自分のコンピュータ上で動作しているプログラムの状態
・PID:Process IDentifierの略で,自分のコンピュータ上で動作しているプログラムを識別する数値
ここで画面上のLocal AddressとForeign Addressを見てください。最初の行には,Local Addressとして0.0.0.0:7,Foreign Addressとして0.0.0.0:0という数値が入っています。これらのアドレスの0.0.0.0部はIPアドレスです。コロン(:)の右にある数値は論理ポート番号です。皆さんの中には,このようなすべて0に設定されているIPアドレスを目にしたことがない人もいることでしょう。このようなIPアドレスは特殊な用途に使用されるため,特殊アドレスと呼ばれることがあります。ここで多くの人は,次のような疑問を持つのではないでしょうか。
“このような特殊なIPアドレスを使用するプログラムの正体とは何だろう?”
この後で紹介する補助プログラムを使用すれば,ほぼすべてのプログラムの正体が分かります。現時点では, “特殊アドレスを使用するプログラムの一部は,Windows XP起動と同時に動作を開始する性質を持っている”ということを覚えておいてください。
図2●普通のIPアドレスを使ってインターネットへ接続している様子 |
図2を見ると分かるように,プロセス識別子(PID)1660を持つプロセスはインターネットに接続され,しかも現在通信中です。通信している相手はForeign Address欄に書き込まれています。ここまではなんの問題もなく理解できると思います。ところが,1660というプロセス識別子が2カ所に現れています。これはいったいどういうことでしょう?プロセス識別子というのは本来,プロセスを一意に識別するために考え出された数値です。このため,同一の識別子を持つプロセスが複数個(この場合2個)存在することはありえないはずです。そこで,State欄を見てみましょう。
上方にあるプロセスは,LISTENING(論理ポート3120を監視しながら,接続要求待ち)状態にあり,インターネット側から次の接続要求が到着するのを待っていると解釈できそうです。また,下方にあるもう一つのプロセスは,ESTABLISHED(論理ポート3120経由で接続完了)状態にあり,Foreign Address欄に表示されている通信相手プログラムと通信していると解釈できそうです。
結論を言ってしまえば,これらの解釈は間違っています。画面に表示されているのは実はプロセスではなく,スレッドというものです。つまり1660というのは,2つのスレッドを内部で作成したプロセスの識別子だったのです。識別子1660を持つプロセスはあくまでも一つです。以上の経緯を一般化して整理すると,次のようになります。
“プロセスは,論理ポートからインターネット要求を受け付け,その要求を処理するときには,必要に応じて複数のスレッドを内部で作成している”
ここで,これまでの説明内容を参考にしながら,“論理ポートを開く”ことの意味を整理することにします。
“論理ポートを開くということは,その論理ポートを使用しているWindowsプロセスをインターネットに公開することである”
それでは次に,先ほど触れた,次のような疑問への回答を探すことにしましょう。
“Windows XPを起動すると,いくつかのプログラムが自動的に動作を開始する。そのようなプログラムが論理ポートを使用し,かつ,そのポートが開かれているなら,知らないプログラムが,知らないところで,インターネットに接続していることになる。セキュリティのことを考えると,とても不安である。Windows XPはいったいどのようなプログラムを自動的に起動しているのだろう?”
本日の補助プログラム「No9ListProcessServices.exe」(こちらからダウンロードできます)はこの疑問への回答を用意してくれます。
知らぬ間に起動しているWindowsプログラムをつきとめる
すでに触れたように,プロセスがLISTENING状態に入っている場合,そのプロセスは,インターネット側から送られてくる接続要求を受け付ける状態にあります。このため,例えば,そのプロセスがファイル送信機能を持っていれば,最悪の場合,ファイル名を受け取り,対応するファイルを勝手に送信してしまう危険性さえあります。
そこで,Windows XP起動と同時に動作を開始するプログラムを調べる方法を紹介します。どんなプログラムが起動しているかが分かれば,そのプログラムの動作を停止したり,あるいは一時停止したりすることもできます。
実行中のプロセスを調べる場合,目的のプロセスにアクセスする必要があります。今回用意した補助プログラム「No9ListProcessServices.exe」(こちらからダウンロードできます)はプロセス識別子(PID)を受け取り,目的のプロセスに関する情報を収集し,表示します。それでは,プロセス識別子を簡単に見つけ出せるように,Windows XP環境で次のような準備作業をしておきましょう。この準備作業完了後は「netstat.exe」プログラムをいつでも簡単に起動できるようになります。「netstat.exe」プログラムはWindows XPに標準搭載されるプログラムの一つです。
ステップ1:第5回で紹介した補助プログラム「No5NetStat.exe」をダウンロードする
ステップ2:「No5NetStat.exe」を起動し,指示に従って最後まで操作する
ステップ3:「ITProToyota」というショートカットがデスクトップ上に作成されていることを確認する
ステップ4:ショートカットを右クリックし,「プロパティ」を選択する
ステップ5:「リンク先」に「-a -n -o 60」という情報を追加し,OKボタンを押す
(追加後は“C:\WINNT\system32\netstat.exe -a -n -o 60”などになる)
図3●「C:\WINNT\system32\netstat.exe -a -n -o 60」の実行結果 |
図4●「No9ListProcessServices.exe」補助プログラムの第1画面 |
図5●「No9ListProcessServices.exe」補助プログラムの第2画面 |
図6●PIDの値「608」を入力すると… |
デスクトップ上に作成されているショートカット「ITProToyota」をダブルクリックすると,図3[拡大表示]のような情報が60秒間隔で表示されます。
すべてのWindowsプログラムは動作を開始すると,Windowsプロセスとなり,プロセス識別子が割り当てられます。画面右端のPID欄を見てみましょう。この欄には現在動作しているプロセスのプロセス識別子が表示されています。プロセス識別子を見ただけでは,動作しているプロセスがいったどのような機能を持っているのか分かりません。ここで,補助プログラム「No9ListProcessServices.exe」の出番です。補助プログラムを起動すると,図4[拡大表示],図5[拡大表示]のような2種類の入力画面が表示されます。
知らない間に起動しているプログラムを調べる場合には,第1画面(図4)では基本的に「サービス情報」を示す「2」入力します(デフォルト)。引き続いて表示される第2画面(図5)では,PID欄に表示されている任意の数値を入力します。例えば,図3のPID欄に表示されている数値「608」を入力すると,補助プログラムは図6[拡大表示]のような情報を返してきます。
画面を見るとわかるように,「Description」という項目欄(項目番号80)があり,プログラムの機能説明が書き込まれています。実は、Windows 2000環境ではこのような機能説明は返されません。このOS間の変更は表面には出ませんが,私は大きな改善であると高く評価している一人です。
さらに,項目番号92の「StartMode」欄には「Auto」という文字列が入っています。これは,このプログラムがWindows XP起動と同時に動作を開始することを示しています。つまり,そのようなプログラムは,私たちの知らない間に動作を開始しているわけです。特殊アドレスを使用しているプロセスなどのプロセス識別子を入力し,対応するプログラムの機能を調べてみてください。その際特に,「StartMode」項目欄が「Auto」になっているプログラムはすでに起動されていることに注意してください。
補助プログラム使用上のヒントと注意事項
補助プログラム「No9ListProcessServices.exe」は,プロセス識別子を使用して,プロセス情報とサービス情報を収集し,結果を表示します。プロセスとサービス間の相違については専門書に譲りますが,本補助プログラムを繰り返し実行するだけでも,相当な知識を得ることができるはずです。ここで次のようなヒントを紹介しておきましょう。
“すべてのサービスはプロセスであるが,すべてのプロセスがサービスであるわけではない”
例えば,Windows Messengerはプロセスですが,サービスではありません。このため,Windows Messengerに関する情報を取得するときには,補助プログラムが表示してくる第1入力画面でデフォルトの「2」ではなく,プロセス情報を示す「1」を入力する必要があります。一方,先に紹介したプロセス識別子「608」を持っているのは「DHCP Client」サービスですから,第1入力画面で「1」を選択し,第2入力画面でプロセス識別子「608」を入力することもできます。“すべてのサービスはプロセスである”からです。ぜひ試してみてください。異なる情報が返されますから,プロセスとは何か,サービスとは何か,プロセスとサービスの違いは何か,への回答を探すためのきっかけとなるでしょう。
ここで補助プログラムの動作上の注意を述べておきます。補助プログラムはWindows 2000環境でも基本的に動作しますが,あえて動作保障はいたしません。Windows XPとWindows 2000環境での動作結果が異なる場合,それは両OS間の相違であり,変更が加えられていると考えるようにしてください。また,Windows 2000環境に付属している「netstat.exe」とWindows XPに付属する「netstat.exe」が提供する機能も異なっています。例えば,Windows 2000の「netstat.exe」は「-o」オプション機能(プロセス識別子を表示させる機能)をサポートしていません。ショートカット機能なども両OS環境ではかなり異なります。このため,できる限り,Windows XP環境での実行をお勧めします。現在これといった問題は発生しておりませんが,補助プログラムの実行は自己責任とさせていただきます。
本日は,まず論理ポート,プロセス,スレッドの関係を簡単に整理し,私たちの知らない間に動作を開始するプログラムの正体を確認する方法を紹介いたしました。本文で触れたように,プロセスは論理ポートを通してインターネットに公開されますから,インターネットへの高速・常時接続時代に入った現在,論理ポートとプロセスにする関する知識はきちんと身に付けておきたいところですね。
次回は本日の基礎知識を活かしながら,Windows XPの標準機能の一つである「簡易ファイアウォール」を活用する方法を紹介する予定です。それでは次回またお会いいたしましょう。ごきげんよう!