ポートスキャナとは、LANやインターネット上に存在するホストの検出およびそこで使用されているポートを確認するためのセキュリティ監査ツールの一種である。この種のツールの存在については、インターネット上のサイトを攻撃する不心得者がセキュリティホールの探索に利用しているという批判があるものの、その正しい用途はまったく逆で、ネットワークセキュリティのプロフェッショナルおよび個人レベルでのユーザがコンピュータやネットワークのセキュリティ態勢を自力で確認できるようにすることを本来の目的としている。その他にも専門家以外のユーザが、ネットワーキングの仕組みやネットワークセキュリティに関する知識を深めるためのツールとしても役立つはずだ。
今回のレビューを行うにあたっては、本稿執筆時点でUbuntu 7.10リポジトリに収録されているNmapが最新の4.53ではなく4.20-2リリースであったので、Nmapのソースコードをダウンロードしたものをコンパイルしてからインストールすることにした。こうしたソースコードからのビルド時にはコンパイル処理や依存性関係の問題に遭遇するかもしれないが、その場合はNmapプロジェクトが用意している詳細な解説が参考になるだろう。いずれにせよ通常のビルド手順に従えば、コマンドライン形式の実行ファイルであるnmapと、その新型GUIフロントエンドであるZenmapが作成されるはずである。
| ポートスキャニングについての基礎知識 |
|---|
|
基本的にポートスキャニングとは“ポートXはホストYにより開かれているか?”という疑問に答えるための処理である。ここで言う“ポートが開いている”とは、当該ポートに送信されてくるトラフィックを何らかのアプリケーションがリスニング(受信)している状態を示す用語であり、通常はこのポートに関連付けられた特定サービスがアクティブにされていることを意味する。例えばスキャンの検索対象がHTTPサーバであれば、ポート80をスキャンするのが常套手段である。もっともポート80はWebサーバ専用で固定されている訳ではなく、HTTP以外のアプリケーションがポート80を使用することもあり得るため、ポートスキャニングの結果だけで具体的な使用サービスまでを見極めることはできない。
ポートスキャニングは、システムへの不正侵入を目論むクラッカー連中が、サービスやアプリケーションのセキュリティホールを探す目的で使う場合もある。例えばMicrosoft SQL Serverの使用するTCP/UDPポート1433が、中国に置かれたサイト群から絶え間なくスキャンされ続けているのは、その好例と言えるだろう。これと対照的にネットワーク管理者やセキュリティ担当者がポートスキャニングを使用する場合は、各自のネットワークで許可されるホストとサービス以外が使用されていないかの確認を目的としているケースが多い。 通常ポートスキャニングは、ホストを検出してから実際のポート探査を行うという2段階のステップで実行される。このうちホスト検出は、未使用分のIPアドレスをスキャン対象から除外して処理効率を高めるという意味を有している。つまり特定アドレスでのスキャン対象となるポート数は数千単位に上ることも珍しくはないため、反応のあったアドレスのみにスキャニング対象を絞り込むことで多量の不要トラフィックの発生を回避させるのである。実際のホスト検出法としては、ごく単純にpingを打つという簡易的な方法が一般に使われている。 基本的なポートスキャンで行われる処理の後半部は、対象ホストにおいて探査対象となる各ポートへの接続確立である。ホスト間のTCP接続が確立されるには、3ウェイハンドシェイクというプロセスを経なくてはならない。こうしたハンドシェイクは、まず接続する側のホストがSYNパケットを送信し、このSYNを受信した相手側ホストがその応答としてSYN/ACKを送り返し、接続する側のホストが最後にACKパケットを送るという流れで進行する。この3段階の処理が正常に終了した時点で、両ホスト間の接続が確立されたことになる。確立後の接続を解除するには、一方のノードがFINあるいはRSTパケット(それぞれFINishおよびReSeTの略)を相手に送信する必要があるが、あるいは単純にタイムアウトした段階でも接続は解除される。 この種の処理の中でも接続スキャンは、多数のネットワーク処理を必要とする分だけ効率が悪くなっている。また処理の方式自身が目立つ部類に属すため、スキャンが行われていることが第三者に察知されやすい。TCP接続を必要としないタイプのスキャンとしては、SYN、FIN、XMASなどが存在し、これらの方が処理としても目立ちにくい上に、少ないトラフィック量でターゲットに関する同等の情報を取得できる。ただしこれらのスキャンを実行するには、スキャニングするマシンでのroot権限が必要となる。 |
