ポートスキャンツール「Nmap」を使ったセキュリティチェック 3ページ
ポートスキャンで使用する方式を選択する
Nmapでは複数のポートスキャン方式が実装されており、目的や状況に応じてポートスキャン方式を選択できる。通常はデフォルトで利用されるTCP SYNスキャンもしくはTCP Connectスキャンで十分なのだが、対象のホストがIPS(侵入検知システム)やファイアウォールなどで守られている場合、それ以外のスキャン方式を選択することでこれらを回避できる可能性がある。自分が管理しているサーバーに対してこのような特殊なポートスキャン方式を利用することはあまりないだろうが、Nmapがどのようにポートスキャンを行っているかを理解する補助として、Nmapで利用できるポートスキャン方式のいくつかを簡単に説明しておこう。
TCP SYNスキャン(-sS)
もっとも基本的なポートスキャン方式が「TCP SYNスキャン」だ。「ステルススキャン」とも呼ばれている。このスキャン方式を利用するにはroot権限が必要だが、高速にポートスキャンを行えるのが特徴だ。root権限を持つユーザーがスキャン方式を指定しないでNmapを実行した場合、このスキャン方式が利用される。また、-sSオプションを指定して明示的にこのスキャン方式を選択することもできる。
TCP SYNスキャンでは、対象のホスト/ポートに対しTCPのSYNパケットを送信し、その結果からポートが利用可能かどうかをチェックする。サーバーはSYNパケットを受信した場合、そのポートが利用可能であればSYN/ACKパケットをクライアントに返送する。いっぽう、サーバーアプリケーションが稼働していないなどで接続を受け付けられない場合はサーバーはRSTパケットを返送する。また、パケットフィルタなどでそのポートへのアクセスがブロックされている場合、サーバーからパケットは返送されない。この違いによってTCP SYNスキャンではポートの状態を調査する。
なお、SYNスキャンでは対象のサーバー/ホストに対しSYNパケットを送信するだけで、実際の接続は確立させない。そのため、通常サーバー側にはそのログは残らない。ただし、ファイアウォールのログには記録される可能性がある。
TCP connectスキャン(-sT)
TCP Connectスキャンは、connectシステムコールを発行してターゲットとするホスト/ポートへの接続を確立させることでポートが利用可能かどうかをチェックする。この方式ではroot権限を必要としないが、SYNスキャンと比べると処理速度に劣る。また、ターゲットのホストにログが記録される可能性も高くなる。一般ユーザーでスキャン方式を指定しないでNmapを実行した場合、このスキャン方式が利用される。また、-sTオプションを指定することで明示的にこの方式を選択することも可能だ。
UDPスキャン(-sU)
NmapはデフォルトではTCPプロトコルを使ったスキャンを行うが、UDPを用いたスキャンも可能だ。UDPスキャンを行うには-sUオプションを指定する。UDPスキャンは空のUDPヘッダをターゲットとするホスト/ポートに送信することでスキャンを行う。ただし、UDPではポートが閉じられているのか、それともほかの要因でパケットが到達していないのかを判断することが難しいため、スキャン速度が遅くなる点に注意が必要だ。
TCP Nullスキャン(-sN)、FINスキャン(-sF)、Xmasスキャン(-sX)
-sNオプションではTCP Nullスキャンを、-sFオプションではFINスキャンを、-sXオプションではXmasスキャンを実行できる。TCP Nullスキャンはどのフラグも設定していないパケットを送信することでスキャンを行う。TCP/IPではこのようなパケットを受信した場合、ポートの状態が「closed」であればRSTフラグ付きのパケットを返送する。いっぽうポートで待ち受けが行われていれば、何もパケットを返送しない。つまり、パケットの返送があればそのポートは「closed」であり、返送が無ければ「open」もしくは「filtered」のどちらか(「open|filtered」)であると判断できる。
また、FINスキャンではTCPのFINフラグのみを設定したパケットを、XmasスキャンではFINおよびPSH、URGフラグを設定したパケットを利用する。これらのパケットについても、TCP Nullスキャンと同様の結果を得ることができる。
これらスキャン方式を利用するメリットは、特定のファイアウォールやパケットフィルタをすり抜けることが可能であるという点だ。ただし、ターゲットのOSやファイアウォール/ルーターによっては実際とは異なる検出結果が得られる可能性がある。また、ポートがclosedであることは判定できるが、openもしくはfilteredのどちらであるかは判定できない。つまり、検出結果は「closed」と「open|filtered」のどちらかとなる。
TCP ACKスキャン(-sA)
TCP ACKスキャンでは、ACKフラグだけを設定したパケットを使ってポートスキャンを行う。このスキャンでは、ポートに対しフィルタが適用されているかどうか(filteredかunfilteredか)のみを判定できる。
TCPウィンドウスキャン(-sW)
TCPウィンドウスキャンはACKスキャンと同じであるが、一部のシステムでは返送パケットのTCPウィンドウのフィールドが異なることを利用してポートがopenかclosedかどうかを判定する。ただし、この挙動をするのは一部のシステムのみであるため、信頼性は低い。
TCP Maimonスキャン(-sM)
TCP Maimonスキャンは、FINおよびACKフラグを設定したパケットを使ってポートスキャンを行う。通常このパケットを受け取るとホストはRSTパケットを返送するが、BSD由来の一部のシステムではポートが開いている場合にパケットが返送されないことを利用してポートの状態を判別する。
そのほか、指定した任意のフラグを設定したパケットを使用する–scanflagsオプションも用意されている。このオプションを利用することで、任意のフラグ付きパケットを対象ホストに送信できる。
GUIフロントエンド「zenmap」を利用する
Nmapには、GUIによる操作でポートスキャンを実行できる「zenmap」というGUIフロントエンドが用意されている。Windows環境では、インストーラを使ってNmapをインストールするとNmapと同時にzenmapがインストールされる。また、Linux環境では別途インストールが必要だ。たとえばREHLやその互換OSでは、nmap-frontendパッケージをインストールすることでzenmapが利用可能になる。
zenmapの起動
Windows環境では、インストーラでNmapをインストールするとデフォルトでスタートメニューにzenmapが登録される。また、Linux環境ではzenmapコマンドを実行することでzenmapが起動される。なお、Nmapの全機能を利用できるよう、どちらの場合でもroot権限(管理者権限)での起動をおすすめする。
zenmapを起動すると、図2のようなウィンドウが表示される。
ここで、「ターゲット」欄に対象とするホストを入力して「スキャン」をクリックするとポートスキャンが実行され、「Nmapの結果」タブにその結果が表示される(図3)。
また、「スキャンプロファイル」ではスキャン方式を選択できる(図4)。この選択結果に応じてnmapのコマンドラインオプションが変更される仕組みで、指定されるコマンドラインオプションは「コマンド」欄に表示される。
複数のホストをターゲットに指定してスキャンを行った場合、左ペインにホスト一覧が表示される(図5)。
ここでホストを選択すると、「ポート/ホスト」タブや「ホスト情報」でそのホストの情報を確認できる(図6、7)。
「サービス」ボタンをクリックすると左ペインにサービス一覧が表示され、そのサービスを提供しているホスト一覧やその情報が表示される(図8)。
「トポロジー」タブでは、スキャン結果を元にネットワークトポロジをグラフで表示してくれる(図9)。
このように、zenmapを利用することでポートスキャン結果をより分かりやすい形で確認することが可能だ。なお、スキャン結果は「スキャン」メニューの「スキャン結果を保存する」でファイルに保存しておくことができる(図10)。
サーバーのセキュリティチェックだけでなくネットワークの管理にも有用、ただし対象の設定にはご注意を
このようにNmapはサーバーでどのようなサービスが動いているのかをチェックするだけでなく、ファイアウォールの設定チェックやネットワークの管理にも有用だ。たとえばローカルネットワークに対し定期的にポートスキャンを行うことで、意図しないホストやサービスが稼働していないかをチェックすることができる。TCP SYNスキャンであれば100台規模のスキャンでも数分で完了するので、まずはお手元の環境で試してみてはいかがだろうか。
ただし、冒頭でも触れているとおり、自分が管理しているマシンやネットワーク以外に対するポートスキャンはそれらに対する攻撃と見なされる可能性もあるため、利用の際は十分に注意してほしい。