動的フィルタリングとは

静的フィルタリングには、弱点があります。

 それは、内側から外側へパケットが流れていない時も、戻りのパケットのためにを穴を開けておかなければならないということです。

 上の図の例では、内側から外側にあるWebサーバへのアクセスがない場合、外側から内側への侵入経路である「IN」の穴は、開けておく必要はありません。そこから、許可すべきでないパケットを通過させてしまう可能性があります。

 TCPヘッダの中身を確認できるファイアウォールであれば、TCPヘッダ内ののSYNやACKフラグのハンドシェイクの状態を確認して、内側から発したパケットの戻りでないパケットを遮断することができますが、ハンドシェイクの状態を偽装されれば通過させてしまうこととなります。

 また、UDPの場合は、UDPヘッダ内にSYNやACKフラグがないので、ハンドシェイクの状態も確認することすらできません。

 静的フィルタリングでは、常時、経路となる穴を開けておかなければならないので、その開けたままの状態となる穴が弱点となります。

アプリケーションによっては、非常にたくさんの穴を開けておかなければならないものもあります。

例えば、DirectXを使用するゲームでは、以下のポート番号の通信を開けておく必要があります。

プロトコルポート番号
UDP2300 ~ 2400
TCP2300 ~ 2400
TCP47624
UDP6073

※DirectXのバージョン、ホストかクライアントであるのか、ゲームの種類によって異なります。

内部で使用するアプリケーションの種類が多ければ多いほど、たくさんの穴を開けておく必要があります。

上図のように穴だらけだと、セキュリティ面で心配です。

 セキュリティを確保するには、通過させたいときにだけ、穴を開けたいところなのですが、静的フィルタリングでは、それができないのです。

そこで、静的フィルタリングの弱点を解消するために考えられたのが、動的フィルタリングなのです。

 動的フィルタリング機能を備えるファイアウォールが、非常に高価なものでしたが、最近では安価なルータでも、その機能を備える製品が増えており、その機能を活用する場面も多くなっています。

静的フィルタと動的フィルタの関係

 動的フィルタでは、コネクションの最初のパケットがトリガとなり、関連するコネクションの通信を通過させる動的フィルタが自動的に追加するようになっています。

その仕組みのため、動的フィルタでは、パケットを破棄するのではなく、パケットを通過させるように動作します。

 したがって、動的フィルタリングでは、動的フィルタでパケットを通過させ、静的フィルタでパケットを破棄する運用が基本となります。

 動的フィルタだけを設定した場合は、パケットを通過させる定義のみとなり、パケットが破棄されなくなるので注意が必要です。

静的フィルタと動的フィルタの適用順序

動的フィルタリングは、動的フィルタと静的フィルタを組み合わせて定義してゆきます。

動的フィルタリングを定義するには、まず、その仕組みを理解しておくことが大切です。

 動的フィルタは、初めから存在するのではなく、コネクションの最初のパケットがトリガーとなり、その時に動的フィルタが作られます。

つまり、

トリガーとなるパケットを静的フィルタで捉える必要があるということです。

ここで、さらに、注意が必要です。

動的フィルタは、静的フィルタよりも優先されるということです。

 動的フィルタは、静的フィルタよりも前に追加されます。一度、動的フィルタが作られると、パケットは、静的フィルタよりも前に動的フィルタと比較されることになります。

そして、動的フィルタを通過するパケットは、後続の静的フィルタと比較されることなく通過することとなります。

静的フィルタと動的フィルタの適用順序が、理解し難いかもしれません。

そこで、適用順を下図に示します。

以上まとめると、動的フィルタリングの定義は、以下のようになります。

  1. トリガーとなる静的フィルタを定義する。
  2. トリガーにより追加する動的フィルタを定義する。

 通過したパケットの戻りのパケットに対する動的フィルタは自動的に作成され追加されるので、定義する必要はありません。

ステートフルインスペクション

 ここまで動的にフィルタリングテーブルが更新されてゆく様子を説明してきましたが、ここでは、さらに厳密に戻りのパケットを指定するステートフルインスペクションという手法があります。

この手法は、TCPヘッダの中もをもう少し詳しくチェックします。

TCPヘッダは、次のように構成されています。

 静的フィルタリングの説明のところで、TCPの通信では、コードビット部の「ACK」を見て、通過させるか遮断するかの判断を行うことができると説明してきました。

ステートフルインスペクションでは、さらにシーケンス番号を確認します。

 このシーケンス番号とは、受け取ったパケットを元通りに組み立てるために必要な番号です。パケットを送った順番通りに相手に届かないことがあるため、TCPでは、この番号を利用して並び替えを行っています。

 ステートフルインスペクションを実装するファイアウォールでは、通過するパケットのシーケンス番号を見て、次に戻ってくるパケットのシーケンス番号を予測して、予測した番号と異なる値のパケットを受信したら破棄するように動作します。

 ステートフルインスペクション機能を実装するファイアウォールでは、このシーケンス番号を確認するだけのものから、パケット内のデータ部分まで確認するものまで様々な製品があります。