ステートフル・インスペクションとは
ステートフル・インスペクション (Stateful Inspection) とは、TCP コネクションや往復が必須の UDP (DNS や NTP 等) を管理し、戻りの通信についてを動的に許可する仕組みのことです。
ステートフル・パケット・インスペクション (SPI) とも呼ばれます。
昔は高機能 FW のみに実装されていましたが、最近ではバッファロー等の家庭用ブロードバンドルータにも大抵実装されています。
下記の図を例に、通信を会話として考えると、ホスト A から Web サーバへ話しかけると、Web サーバはホスト A に返事をすることができます。ですが、Web サーバはホスト A に話しかけることができません。
つまり、PC A からはインターネットの Web サーバ (任意の IP の TCP 80 番ポート) への通信を許可した場合であっても、悪意ある人が送信元の TCP ポートを 80 番にして通信を開始しようとする通信は防ぐことができます。
TCP は双方向で TCP コネクションを張り合うため、必ず戻りの通信が発生します。ポリシー (アクセス制御ルール) を決める際、 この戻りの通信まで定義することはかなり困難です。なぜなら TCP のクライアント通信は 1024 番以降の ハイヤーポートをランダムで使うことが多く、あらかじめ決めておくことができないからです。
また、UDP も DNS や NTP 等は戻りの通信が必須となるものもありますが、これらも同様、あらかじめ定義するのは困難です。
そこで、TCP コネクションや UDP の往復を管理し、戻りの通信については動的に許可する仕組みができました。 この機能がステートフル・インスペクションなのです。
なお、ステートフルとその対義語のステートレスについては以下をご参照下さい。
1 つの行きの通信と、それにより動的に許可される通信のパターンをひとまとめにセッションと呼びます。
また、セッションによりセキュリティを保つ方法を『セッション管理』と呼びます。
TCP コネクションは 1 つのセッションとして数えられ、UDP も往復が必須となる DNS や NTP も、1 往復で 1 セッションとして数えられます。
ステートフル・インスペクションの例
ステートフル・インスペクションの動作はどのようなファイアウォール (Cisco の ASA、PaloAlto、FortiGate、SSG等) でもほぼ同じような動作をします。
そしてステートフル・インスペクションでは、TCP だけでなく様々なプロトコルの動作を把握し、その Context (コンテキスト。会話で例えると、脈絡) に応じて動的に許可される設計となっています。
Cisco では簡易なステートフル・インスペクト機能として CBAC (Context Based Access Control) があります。
例えば、、、
- UDP でも DNS や NTP など、多くのプロトコルで戻りの通信が発生しますが、これらを TCP と同様にセッション (UDP 仮想コネクションと呼んだりもします) として管理し、戻りの通信も動的に許可することができます。
- 通信が途中の NW 機器で破棄されたりすると送信元に ICMP のエラーが通知されますが、この ICMP エラー (Time Exceeded や Destination Unreachable 等) も動的に許可することができます。
- FTP では Active モードの場合、サーバからセッションを張りに来ますが、これを動的に許可します。もちろん Passive モードの動的に決められるファイル転送用ポート番号も、通信の中身を見ることにより動的に開放を行います。他の動的ポートを使うプロトコルも同じように動的に許可します。ただし、機器によって対応プロトコルは異なるので、事前に確認が必要です。
つまり、脈絡のない話は遮られるけど、一連の流れとして関係する会話は継続されるといった動作になります。
セッション・タイムアウト
ところで、TCP/UDP の返りの通信を動的に許可するのは良いのですが、いつまでも許可し続けると、悪意あるものからの侵入を許すセキュリティホールになってしまいます。
そこで、許可する時間をあらかじめ決めておく必要があります。この時間をセッション・タイムアウトと呼び、セッション・タイムアウト後は例えホスト同士で TCP コネクションを維持していても、その間の FW が通信を破棄してしまいます。
結果、PC のアプリ側も TCP のタイムアウトが発生し、TCP Reset や TCP Fin 等によりコネクションが閉じられます。
非対称ルーティング
IP の役割はあくまで宛先 IP への経路指示のみですので、往路と復路が同じになることは保証されていません。経路上に FW がなければそれでも問題ないのですが、FW ではステートフル・インスペクション機能のために通信の往復を見ていますので、問題になります。
具体的には、TCP syn が来たけど TCP syn/ack が見えず TCP ack を返そうとした、もしくは逆に、いきなり TCP syn/ack が来た、等の場合はパケットを破棄します。
コメント