一般的に、インターネットからの不正侵入者はリッスン状態(待ち受け状態)にあるポート番号を調べて、動作しているサービスの種類など調べる。そのために使用されるのがポート・スキャン・ツールである。これは、ある特定のホスト・マシンに対して、ポート番号を次々と変えながらスキャン(操作)して、通信ができるかどうかを調べるツールである。具体的には、TCPの通信開始要求(SYN要求という。SYNはsynchronizeの略)を特定のポートに対して送り、正しくそれが受け付けられるか(受信確認のACK=acknowledgeが返ってくる)、それとも否定応答(RST=Reset。該当するリッスン・ポートがないので通信を拒否するという応答)が返ってくるかどうか、あるいは何も返ってこないかなどを調べることにより、そのポートで待ち受けしているサービスがあるかどうかを調べている。
ポート・スキャン・ツールというと「攻撃者の不正侵入用ツール」というイメージがあるが、防衛側にとっても、どのポートが開いているのかを確認するためにポート・スキャン・ツールを利用できるから、持っていると便利だ。筆者はWindowsのコマンドラインで動作する「spp」を使用しているが(sppについては「超高速TCP/IPポートスキャナSPP.EXE」を参照)、一般的にはLinux上で動作する「nmap」や(nmapについては「Linux Square連載「ゼロから始めるLinuxセキュリティ―第6回ファイアウォールの設定・動作チェック方法」や、「Linux Tips―開いているポートを調べるには」などを参照)、GUIベースのツールも多く使われているようだ。
また、ポート・スキャン・ツールはちょっと……という人でも、Windows 2000が標準装備しているnetstatコマンドを使用すれば、同様にリッスン状態にあるポートを確認できるので、こちらを使う方法もある。
それでは、前回までの設定で、IIS Lockdown Toolの実行を終えた状態のWindows 2000 Serverを対象にして、netstatコマンドとポート・スキャン・ツールsppの両方を動作させて、その結果を見てみよう。まずはnetstatの結果である。
※netstat -a -n で調べた結果
C:\>netstat -a -n…リッスン状態のポートもすべて(数値で)表示
Active Connections
Proto Local Address Foreign Address State
TCP 0.0.0.0:21 0.0.0.0:0 LISTENING…以下TCP
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1025 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1026 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1027 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1029 0.0.0.0:0 LISTENING
TCP 0.0.0.0:3372 0.0.0.0:0 LISTENING
TCP 192.168.0.3:139 0.0.0.0:0 LISTENING
UDP 0.0.0.0:135 *:*…以下UDP
UDP 0.0.0.0:445 *:*
UDP 0.0.0.0:1028 *:*
UDP 0.0.0.0:3456 *:*
UDP 192.168.0.3:137 *:*
UDP 192.168.0.3:138 *:*
UDP 192.168.0.3:500 *:*
「State」欄が「LISTENING」となっているのが、待ち受け状態にあるTCPのサービスである。UDPの場合は、「Foreign Address」が「*:*」となっているのが、待ち受けしているポートである(TCPとUDPは通信方式が異なるので、このように表示方法も異なっている)。
それでは次にポート・スキャン・ツール「spp」でスキャンしてみよう。
※ポート・スキャン・ツールsppで調べた結果
C:\>spp artemis…引数はターゲットのホスト
Target 'artemis' port scan 0 to 1000 start. …ポート0から1000までスキャン
Proto Remote Address State
TCP 192.168.0.3:21 LISTENING…FTP
TCP 192.168.0.3:80 LISTENING…http
TCP 192.168.0.3:139 LISTENING…NETBIOS Session Service
TCP 192.168.0.3:135 LISTENING…DCE endpoint resolution
TCP 192.168.0.3:443 LISTENING…https
TCP 192.168.0.3:445 LISTENING…CIFS
Completed
こちらの例では、LISTENING状態にあるTCPポートは全部で6つ表示されている(UDPはスキャンされない)。それに対して先のnetstatの例では、全部で11ものポートがLISTENING状態であると表示されている。さてどちらが正しいのであろうか?
結論からいうと、後者のsppツールによる調査結果が正しいようである。実はコマンドラインで利用できるnetstat.exeコマンドは、TCP/IPのSocket(いわゆるWinSock)レベルでのLISTENING状態を表示しているのではなく、より低位のTDI(Transport Driver Interface)レベルでのリッスン状態を表示しているので、このような違いが起こるようである。詳しくは「JP418762 - LISTEN していないポートが netstat で LISTENING と表示される」や「JP307175 - Windows 2000 と Windows NT 4.0 におけるリスニング ソケット再使用時の動作の違い」などを参照していただきたいが、簡単にいうと、使用済みのポート(すでにクローズしてしまっているポート)までもLISTENINGと表示されることがあるので、実際のリッスン状態のポートよりもいくらか多く表示されることがある、ということである(これは「仕様」だそうだ)。よって、正確にリッスン状態のポートだけを知りたければ、ポート・スキャン・ツールなどを使う必要がある。
いずれにしろ、厳格なセキュリティ対策を施すには、Webサーバの利用に必要なTCPのポート80番と、後述する、FTPによるコンテンツ更新に必要なTCPのポート20番と21番以外はすべて閉じてしまいたいところだ。だがWindows 2000の持つ標準的なTCP/IPの機能だけではこれは難しい。外部のDNSを参照するためにはいくつかのUDPパケットのやりとりができなければならないが、このようなDNS要求とその応答だけを許可して、それ以外をすべてブロックするというのが困難だからである。外部DNSが参照できなくなると、Windows Updateなどが実行できなくなってしまう。
このように、ポートの閉鎖と各種機能の利用には二律背反が生じることが多いので、単純なポートの開け閉めだけでは、さまざまな要求に対処できないことが多い。ポート番号の情報だけでなく、さらに詳細な条件設定が可能なファイアウォールを介してDMZ(非武装セグメント)をLANとは別に設置し、そこにWebサーバを設置するのが好ましいとされるのは、こうした事情による。可能なら、IDS(侵入検知システム:Intrusion Detection Systems)もある方が望ましい。
なお、Windows 2000 Serverが持っている機能を利用してパケット・フィルタリングを実現するには、以下の2種類の方法がある。
しかし、前者は機能的に不満足な点が多く(ソース・ポート番号やIPアドレスでフィルタリングすることができない)、特にUDPポートの閉鎖が事実上は困難である点から、防御壁としてこの機能に頼るには無理がある。また、後者については詳細なフィルタリングの設定が可能だが(ただしポート番号に範囲型などを指定することはできない)、(前者と同様に)ログを残すことができないという難点がある。ログを記録できないと、不正侵入が試みられた場合や、あるいは実際に侵入された場合でも、その原因を究明するのが難しくなる。
そのため、Windows 2000 Serverが持つ機能だけで不必要なポートなどを完全封鎖するのは難しく、専用のファイアウォールを用意せざるを得ない。なお、これらのパケット・フィルタ機能の詳細については、以下に示す別掲記事を参照されたい。
Copyright© Digital Advantage Corp. All Rights Reserved.