SPIとは

SPI(Stateful Packe Inspection)とは、通信の状態(ステート)を考慮したより高度なパケットフィルタです。「ステートフル」とは、通信の状態をきちんと考慮していることを意味します。SPIは設定も簡単で、「許可した通信の戻りだけを自動的に許可する」ようなよりセキュアなパケットフィルタが可能です。その他にも各種プロトコルのヘッダの整合性のチェックなども行うことが可能です。

以降で通常のパケットフィルタと、SPIのパケットフィルタについて解説します。

通常のパケットフィルタ

ネットワーク上の通信は、ほとんどの場合で双方向です。何らかのデータを送信すると、そのデータに対する返事が返ってきます。パケットフィルタを行うためには、「通信は双方向」ということを考慮して適切に設定しなければいけません。

通常のパケットフィルタは、受信したパケットのIPアドレスやポート番号などをチェックして、パケットを許可するか拒否します。通常のパケットフィルタを利用していると、リクエストとそのリプレイのそれぞれの方向でどのような通信を許可するかの条件をあらかじめ設定しておかなければいけません。そして、リクエストとリプライでそれぞれ別々の条件を設定しなければいけません。つまり、通常のパケットフィルタでは、通信はリクエストとそのリプライから成り立っているという通信の状態は特に考慮せず、パケット単位でファイアウォールを通過させるかどうかを決めているだけです。

条件を作成する際、サーバ側のアプリケーションのポート番号はウェルノウンポートで決まっています。ところが、クライアント側のアプリケーションのポート番号はダイナミックに決められることがほとんどです。サーバからのリプライを通過させるために、ファイアウォールで許可するポート番号の範囲が広くなってしまいます。また、クライアントは複数存在するので、ファイアウォールを通過する通信のIPアドレスはある程度の範囲で指定することになります。許可するパケットのIPアドレスやポート番号を範囲指定しなければいけないということは、不正なパケットがファイアウォールを通過できてしまう危険性が増すことになります。

図 通常のパケットフィルタ
図 通常のパケットフィルタ

SPIのパケットフィルタ

SPIのパケットフィルタは、通信が双方向であることを考慮しファイアウォールを通過する通信の状態を管理してフィルタリングします。通信の状態(ステート)をもう少し具体的に考えます。アプリケーションの通信には、次のような特徴があります。

  • TCPを利用する場合、TCPの3ウェイハンドシェイクが行われる
  • リクエストとリプライでは、IPヘッダ、TCP/UDPヘッダの宛先と送信元が入れ替わっている

こうした通信の状態を踏まえて、SPIのパケットフィルタは、次のように動作します。

許可するアプリケーションの条件を設定する
SPIによるパケットフィルタでは、クライアントアプリケーションのリクエストパケットがファイアウォールを通過できるように条件を設定します。
ファイアウォールは自動的にリプライパケットを許可する条件を作成してパケットを転送
クライアント側からのパケットを受信すると、ファイアウォールはパケットのIPヘッダやTCP/UDPヘッダ、アプリケーションヘッダなどを解析して、自動的にそのリプライパケットのIPアドレス、ポート番号の組み合わせだけをピンポイントで許可する条件を作成し、パケットを転送します。自動的に作成するリプライパケットを許可する条件は、基本的にはリクエストの宛先と送信元を入れ替えている条件です。
返ってきたリプライパケットを転送して、セッション情報を保持する
リプライパケットが返ってくると、自動的に作成された条件によってパケットが許可されることになります。そして、ファイアウォールではクライアントアプリケーションとサーバアプリケーション間の通信の状態をセッション情報として管理し、ファイアウォールを経由したアプリケーションの通信ができるようにします。なお、クライアントアプリケーションとサーバアプリケーションの通信が終了すると、セッション情報が削除されます。
図 SPIのパケットフィルタ

また、SPIでのパケットフィルタは、TCPヘッダのフラグ情報の整合性を確認して、不正なパケットを拒否することも可能です。さらに、アプリケーションごとの通信の特徴を踏まえたフィルタリングを行うことも可能です。なお、自動的にリプライパケットを許可する条件を作成する機能を指して、ダイナミックパケットフィルタリングと呼ぶこともあります。

セキュリティの基礎