目的のサーバに接続できるようになった後に考えなければならないのが、ルール上許可していないホストやポートに接続を許可していないかどうかです。つまり、「余計な穴」が開いていないかを確認します。これには、Nmapとhping2を使うといいでしょう。
Nmap(http://www.insecure.org/nmap/)はポートスキャナツールです。機能は多彩で、TCPのSYNスキャンやNullスキャン、OSの推測が可能です。このNmapを用いて、余計なポートが開いているように見えないかを確認します(注)。
まずはNmapのオプションを知る必要があります。Nmapには多くのオプションがあるので、ここではその一部を紹介します。
-sT | TCPポートのスキャンを行う |
---|---|
-sU | UDPポートのスキャンを行う |
-sS | TCP SYNスキャンを行う。SYNパケットを送った後、SYN/ACKパケットを受信するとRSTパケットを送り、コネクションを中断する。このスキャンは、ログに残りにくいという特徴がある |
-sP | 指定されたネットワーク上にICMP echo-requestを送り、稼働しているマシンを探す |
-P0 | ファイアウォールなどでICMP echo-requestが許可されていないホストに対してスキャンするときに使用する |
-O | TCP/IPのフィンガープリントにより、対象ホストのOSを調べる |
-o filename | スキャンした結果を指定したファイルに出力する |
-i filename | スキャン対象ホストをファイルから読み込む |
-p port range | スキャンするポートを指定する。「-p 1-65535」のように指定することで、ポートをレンジ指定できる |
Nmapのオプション |
では、実際にNmapを使ってみましょう。Webサーバ(192.168.0.10)に対して、TCPのフルポートスキャンを実行します。ファイアウォールでICMP requestは特定のホストからしか許可していないので、-P0オプションを付けておきます。
# nmap -P0 -p 1-65535 -sT 192.168.0.10 Starting nmap V. 2.54BETA30 ( www.insecure.org/nmap/ ) Interesting ports on (192.168.0.10): (The 97 ports scanned but not shown below are in state: filtered) Port State Service 80/tcp open http
Nmapの結果から、80/TCP(HTTP)が開いていることが分かります。ここで注目してもらいたいのが、「filtered」というステータスです。これにより、フィルタリングが行われているであろうということが分かるのです。許可していないポートが開いているように見えないか注意してください。
すべてのサーバに対してスキャンすることを忘れないでください。また、特定のIPアドレス(メンテナンス用ホストなど)からしかアクセスを許可していないサービスなどがある場合は、必ずそのIPアドレスからスキャンします。もちろん、ファイアウォールに対するスキャンも行いましょう。
hping2(http://www.hping.org/)は、ファイアウォールの動作確認に非常に有効なツールです(注)。カスタマイズしたTCPパケットを生成して目的のポートに送信することで、リプライパケットの状態を見ることができます。そこから、許可されているのか、ドロップされているのか、拒否されているのかが判断できます。IPアドレスが偽造されたパケットについてテストすることも可能です。TCPだけでなく、ICMPやUDPについてもカスタムパケットを送信可能です。
hping2もtcpdumpやNmapと同様にコマンドラインからオプションを指定して実行します。まずは、知っておいた方がいいオプションを紹介します。
-c count | レスポンスパケットをいくつ送信するかを指定する |
---|---|
-I interface name | パケットを送信するために使うインターフェイスを指定する |
-V | Verboseモード。より詳細な出力結果を得ることができる |
-1 | ICMPパケットを送信するときに指定する。デフォルトでは、ICMP echo-requestを送信しする。--icmptype、--icmpoptionオプションを指定することも可能 |
-2 | UDPパケットを送信するときに指定する。デフォルトでは0/UDPに送信する。--baseport、--destport、--keepオプションを指定することが可能 |
-a hostname | ソースアドレスを偽造したパケットを送信する。ホスト名ではなくIPアドレスで指定することも可能 |
-C --icmptype type | 指定したtypeのICMPパケットを送信することが可能 |
-s | 送信元ポートを指定することが可能。送信元ポート番号は1つずつ増加していく。--keepオプションを指定することで、この増加を無効にすることが可能 |
-p | 送信先のポートを指定することが可能 |
-F | FINフラグをセットしたパケットを送信することが可能 |
-S | SYNフラグをセットしたパケットを送信することが可能 |
-R | RSTフラグをセットしたパケットを送信することが可能 |
-P | PUSHフラグをセットしたパケットを送信することが可能 |
-A | ACKフラグをセットしたパケットを送信することが可能 |
-U | URGフラグをセットしたパケットを送信することが可能 |
-X | Xmasフラグをセットしたパケットを送信することが可能 |
-Y | Ymasフラグをセットしたパケットを送信することが可能 |
-d data size | パケットのデータサイズを指定することが可能 |
hping2のオプション |
では、早速hping2を使ってみましょう。ソースアドレスを偽って、80/TCPにSYNフラグがセットされたパケットを送るには、次のようにオプションを指定します。
# hping2 192.168.0.100 -c 4 -p 80 -S -a 192.168.0.200
ターゲットが「192.168.0.100」で、偽ったIPアドレスが「192.168.0.200」です。これで、80/TCPに4つのSYNフラグがセットされたパケットを送ったことになります。この指定で、ターゲットとなったホストにIPスプーフィング対策が行われているかどうかの確認ができます。
次にWebサーバ(192.168.0.10)の80番ポートにSYNフラグをセットしたパケットを送ってみます。
# hping2 192.168.0.10 -c 4 -p 80 -S -n HPING 1192.168.0.10 (eth0 192.168.0.10): S set, 40 headers + 0 data bytes len=46 ip=192.168.0.10 flags=SA DF seq=0 ttl=63 id=0 win=5840 rtt=22.3 ms len=46 ip=192.168.0.10 flags=SA DF seq=1 ttl=63 id=0 win=5840 rtt=2.6 ms len=46 ip=192.168.0.10 flags=SA DF seq=2 ttl=63 id=0 win=5840 rtt=2.6 ms len=46 ip=192.168.0.10 flags=SA DF seq=3 ttl=63 id=0 win=5840 rtt=3.7 ms --- 192.168.0.10 hping statistic --- 4 packets tramitted, 4 packets received, 0% packet loss round-trip min/avg/max = 2.6/7.8/22.3 ms
「flags=SA」となっていることから、SYN/ACKパケットが返ってきていることが分かります。また、サーバから応答があったことから、接続が許可されていることも分かります。
ほかのポートについても調べてみます。Webサーバ上では22/TCP(ssh)をLISTEN状態にしてあります。このポートへの接続は特定のホストからしか許可していないので、許可されていないホストから試してみます。
# hping2 192.168.0.10 -c 4 -p 22 -S -n HPING 192.168.0.10 (eth0 192.168.0.10): S set, 40 headers + 0 data bytes --- 192.168.0.10 hping statistic --- 4 packets tramitted, 0 packets received, 100% packet loss round-trip min/avg/max = 0.0/0.0/0.0 ms
Webサーバの22番ポートは開いているにもかかわらず何ら応答がないことから、許可していないホストからであればパケットがドロップされていると判断できます。
では、ファイアウォールのルールが適切に設定されていない場合を考えてみましょう。Webサーバ上では、25/TCP(smtp)はLISTEN状態になっていないはずです。このままの状態でファイアウォールのルールを変更し、Webサーバの25/TCPへ接続できる設定を追加してみます。この状態で検査してみます。
# hping2 192.168.0.10 -c 4 -p 25 -S -n HPING 192.168.0.10 (eth0 192.168.0.10): S set, 40 headers + 0 data bytes len=46 ip=192.168.0.10 flags=RA DF seq=0 ttl=254 id=0 win=0 rtt=3.1 ms len=46 ip=192.168.0.10 flags=RA DF seq=1 ttl=254 id=0 win=0 rtt=2.5 ms len=46 ip=192.168.0.10 flags=RA DF seq=2 ttl=254 id=0 win=0 rtt=6.3 ms len=46 ip=192.168.0.10 flags=RA DF seq=3 ttl=254 id=0 win=0 rtt=2.4 ms --- 192.168.0.10 hping statistic --- 4 packets tramitted, 4 packets received, 0% packet loss round-trip min/avg/max = 2.4/3.6/6.3 ms
「flags=RA」となっており、SYN/ACKパケットが返ってきていないので実際に接続できているわけではありませんが、ファイアウォールを通過してWebサーバが応答しています。Webサーバで25/TCPポートはLISTEN状態になっていませんが、経路は存在するのではないかと判断できます。
Nmapでポートスキャンするだけでも、ポートが開いているかいないかの判断はできます。しかし、hping2などを使ってポートがどういう状態にあるのかも確認するようにしてください。ルールが複雑になると、必要のないルールを作成してしまうかもしれないので注意が必要です。
ツールを使った動作確認の方法を解説しましたが、これらは一度行えばよいというものではありません。定期的に確認作業を行うことを推奨します。また、ルールについても定期的に見直しをかけるようにしてください。以前は必要でも現在は必要のないルールが存在すると、それがセキュリティホールとなる可能性があります。
Copyright © ITmedia, Inc. All Rights Reserved.