[運用]
常時接続時代のパーソナル・セキュリティ対策
(第1回)

8.セキュリティ対策その3:パケット・フィルタを設定する(3)

デジタルアドバンテージ
2000/12/23

全パケットを禁止すると……

 ところで先ほどの画面の例では、「インターネット接続」側のインターフェイスでは、TCPもUDPもIPも、すべてのパケットを禁止するという設定にしていた(通過させるリストが空のまま、を選択している)。これにより、「インターネット接続」側は外部(インターネット側)から一切アクセスされなくなるので、安全になると思うだろう。実際、インターネット側からのアクセスはすべてブロックされているので、安全であることは確かである。だが大きな問題が1つある。外部へのアクセスもできなくなってしまっているのだ。具体的には、たとえばローカルのLAN上のWindows MeクライアントからInternet Explorerを使って、@ITのWebページ(http://www.atmarkit.co.jp/)を見ようとしても、いつまでたっても画面が表示されないのである(「ページを表示できません」というエラーになる)。それだけではなく、さらには、接続共有を実行しているWindows 2000上でもやはりWebブラウザを使うことができない。

 これらの原因は実はDNSによる名前解決にある。次の画面を見てもらいたい。これは、内部のLAN上にあるWindows Me上で、winipcfg.exeコマンドを実行したところである。

クライアントのTCP/IP環境

これは、LAN上にあるWindows Meマシンでwinipcfg.exeコマンドを実行した結果である。「DNSサーバ」のフィールドに注目していただきたい。「192.168.0.1」となっていることから分かるように、DNSサーバは、接続共有を実行しているWindows 2000マシンが代理で実行している(DNS Proxy機能)。
  DNSサーバのアドレス。接続共有を実行しているマシンのIPアドレス。
  ゲートウェイやDHCPサーバも接続共有を実行しているマシンのIPアドレスとなっている。

 DNSサーバのIPアドレスが「192.168.0.1」となっていることから分かるように、クライアント側から見ると、DNSサーバはインターネット上に存在するのではなく、接続共有を実行しているWindows 2000マシンが実行しているように見える。実際には、Window 2000マシンに届いたDNSの名前解決要求は、そこで中継されてインターネット上のDNSサーバに届くようになっている。このあたりのパケットのやりとりをまとめると、次のようになる。

  1. クライアントのInternet Explorer上で、「http://www.atmarkit.co.jp/」のページを開こうとする。
  2. クライアントは、「www.atmarkit.co.jp」というFQDNをDNSサーバ(「192.168.0.1」のマシン)に送って、名前解決(ホスト名やドメイン名から、そのIPアドレスを求めること)を依頼する。
  3. Windows 2000マシンは、DNS要求を受け取り、それをインターネット上の本来のDNSサーバに送って、名前解決を依頼する。
  4. DNSサーバから、DNSの応答を受け取る。
  5. それをクライアントのマシンへ、DNS応答として、再送する。
  6. クライアント側では、受け取ったDNS応答から、「www.atmarkit.co.jp」のIPアドレスが「211.2.XXX.XX」であることを知る。
  7. アドレス「211.2.XXX.XX」のWebサーバに対して、HTTP(TCPのポート80番)プロトコルを使ってアクセスし、HTMLファイルの情報を得る。
  8. 以下省略。

 ここで問題となっているのは、4.のDNSサーバからその応答を受け取るところである。先ほどの設定では、「インターネット接続」側の全TCP/UDPポート(TCPとUDPのすべてのインバウンドのパケット)をブロックしているが、この結果、4.の応答が受け取れなくなってしまうのである。それ以外のパケット、つまり「インターネット接続」側のアウトバウンド・パケットと、「ローカル接続」側のインバウンド/アウトバウンド・パケットは、すべてそのまま通過する。

 以上のような事情により、すべてのパケットをフィルタリングするように設定すると、DNSによる名前解決が正しく機能しなくなってしまうのだ。これが本当かどうかを確認するには、名前ではなく、IPアドレスでWebブラウザを使ってみればよい。クライアント・マシン上のInternet Explorerで、「www.atmarkit.co.jp」ではなく「211.2.XXX.XX」を直接開いてみるのである。今度は正しく表示できるはずである。

DNSパケットを通過させる

 さてそれでは、どうしたらよいのであろうか? すぐに考え付くのは、先ほどのパケット・フィルタリングの設定で、「UDPの53番(DNSプロトコル)」だけを通過するように設定することであろう。具体的には、をチェックして、のリストに「53」を追加するのである。これでDNSパケットだけは通過できるようになり、名前解決ができるようになると考えられる。

 だが結論から言うと、これでは正しく動かない。なぜなら、DNSの返答のパケットは、宛先ポート番号が53番ではないからだ。次に示すのは、DNSの問い合わせパケットの構造である(UDP層の部分だけを示す)。

DNSの問い合わせ(Query)パケット
宛先ポート
ソース・ポート
データ
53
nnnn
DNS-Query(“www.atmarkit.co.jp”)

 ここで、「nnnn」は、UDPのソース・ポート番号(16bitの整数)を表している。この数値は、新しいDNSの問い合わせが発生するたびに、(通常は)1024以上の数値からランダムに選ばれる。

 この問い合わせに対する応答パケットは、次のような構造をしている。データ部には、問い合わせのあった名前に対するIPアドレスが含まれている。

DNSの応答(Response)パケット
宛先ポート
ソース・ポート
データ
nnnn
53
DNS-Response(“211.2.XXX.XX”)

 先頭の2つのポート番号(宛先ポートとソース・ポート)フィールドに注目していただきたい。問い合わせパケットのときとは内容が入れ換わっている。TCPやUDPプロトコルでは、応答(逆方向)のパケットでは、ポート番号が入れ換わる(UDPの場合は、使い方によっては変わらないようにすることもできるし、もっと異なる使い方もできるが、通常はこのように使われる)。

 このように、インバウンドの(応答の)DNSパケットでは、宛先ポート番号が53番ではなく、しかも固定的な値になることはない。Windows 2000のTCP/IPプロトコルル・スタック組み込みのパケット・フィルタリング機能では、すでに述べたように、「宛先ポート」でしかフィルタリングできないので、このようなパケットだけを通すように設定することは不可能である(専用のルータならば、『「宛先ポート番号が53」か「ソース・ポート番号が53」のパケットを通す』などという設定ができるのが普通である)。

クライアントのDNS設定を変える方法

 Windows 2000の組み込みのUDPパケット・フィルタリング機能がうまく使えない以上、何らかの別の方法を考える必要がある(それにしてもこのUDPのフィルタリング機能を使うのは、事実上不可能ではないかと思われる。ただしRRASを使えば、より柔軟で高機能なパケット・フィルタリング機能が利用できる)。

 Windows 2000 Professional(接続共有のサーバ)側のフィルタ設定をこのままにするなら(つまりUDPのパケット・フィルタ機能やDNS Proxy機能を有効にしたままなら)、できることは1つ、クライアント側のDNS設定を変更することぐらいしかないであろう。クライアント・マシンには、DHCPで自動的にDNSサーバ・アドレス(192.168.0.1)が割り当てられるが、それをやめ、DNSサーバのアドレスだけは手動で設定するのである(プロバイダから与えられたDNSサーバ・アドレスを、各クライアントのTCP/IPプロトコルのコントロール・パネルへセットする)。こうすると、クライアント・マシンから発信されたDNSの問い合わせパケットは、接続共有を提供しているマシンでNAT/IPマスカレード変換されてインターネット側へ送り出され、その応答パケットは逆のルートでクライアント・マシンへ戻ってくる。UDPのパケット・フィルタリングでブロックされることはない。

 以上の設定により、少なくともクライアント・マシンだけは透過的にインターネットに接続できるようになる。しかしサーバ側のマシンでは、DNSパケットの応答を正しく受け取ることができないので、DNSを使うようなアプリケーションを実行することはできない。せいぜいLAN側のクライアントに対して、ファイルやプリンタの公開サービスを提供するぐらいの使い方しかできないだろう。それに、各クライアントの設定を忘れずにこのように行うというのはかなり大変であろうから、あまり実用的な方法とはいえないかもしれない(セキュリティ的には望ましいのだが)。

より現実的なフィルタリング設定

 上記の方法では、Windows 2000マシン自体がインターネットを利用することができないので、あまり現実的ではない。実際には、さらにマシンのIPアドレスを決めるためのDHCPのパケットも受け取れないのだが、これは、許可するUDPのポートとして68番(BOOTPクライアント・ポート)を追加しておけばよいだけである(BOOTP/DHCPでは、DNSと違って、ソース・ポート番号と宛先ポート番号は固定である)。

 このような事情があるため、セキュリティ的にはやや劣るが、もう少し実用的な方法として、「UDPのパケット・フィルタリング機能を無効にする」という方法がある。これならDNSを始めとするUDPを使ったアプリケーションはそのまま利用可能であるので、クライアント側の設定なども不要であるし、Windows 2000マシンからもほぼ自由にインターネット側のリソースを利用することができる。

 もちろん外部からのUDPに対する接続がそのままパスすることになるが、TCP側はすべてブロックされているし、ファイル/プリンタ共有サービスやNBTプロトコルなどはすでにブロックしているので、セキュリティ的には(何もしない状態よりは)かなり安全性が高い。「TIPS:ポート445(ダイレクト・ホスティングSMBサービス)に注意」についても、TCP側の445番がブロックされているので、外部からのアクセスはできないようである(Windows 2000のダイレクト・ホスティングSMBサービスでは、TCPの445番ポートは利用されているが、UDPの445番ポートは使われていないようである)。

[TCP/IPフィルタリング]の設定(より現実的な設定)
UDPパケットをすべてブロックすると、DNSサービスなど、UDPを使った通信ができなくなってしまうので、UDPについてはフィルタリングを無効にする。TCPとIPについては、完全にブロックする。
  パケット・フィルタリング機能は有効にする。
  TCPプロトコルはすべてブロックする。
  通過させるポート番号のリストは空にしておくが、必要なサービスがあればここに記述する。
  UDPプロトコルについては、フィルタリングは行わない。
  IPプロトコルはすべてブロックする。
  通過させるプロトコルのリストは空でよい。

関連記事(Windows Server Insider)
  Windows TIPS:ポート445(ダイレクト・ホスティングSMBサービス)に注意

更新履歴
【2000.12.25】当初「RRASの持つ高度なパケット・フィルタリング機能はWindows 2000 Professionalでは利用できない」としておりましたが、Windows 2000 Professionalでも利用できることが分かりましたので、これについての記述を追加しました。


 INDEX
  [運用]常時接続時代のパーソナル・セキュリティ対策(第1回)
    1.ネットワークの「接続共有」機能とは
    2.セキュリティ対策の必要性
    3.ネットワーク環境について
    4.セキュリティ対策その1:インターネット側のファイル共有サービスを禁止する
    5.セキュリティ対策その2:NBTを禁止する
    6.セキュリティ対策その3:パケット・フィルタを設定する(1)
    7.セキュリティ対策その3:パケット・フィルタを設定する(2)
  8.セキュリティ対策その3:パケット・フィルタを設定する(3)
    9.セキュリティ対策その3:パケット・フィルタを設定する(4)

 「運用 」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間