PR

ファイアウォールは,通過しようとするパケットを検査し,あらかじめ許可したパケットだけを通し,それ以外のパケットを遮断する。ファイアウォールの機能は,このパケット・フィルタリングの方法で決まる。では,現在使われているフィルタリング手法とはどんなものか,確認していこう。

 現在のファイアウォールが採用しているフィルタリング手法は4種類に分けられる(図1)。単純なものから,

a.静的フィルタリング

b.動的フィルタリング

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

d.アプリケーション・データの検査

の順になる。

図1●パケットの止め方の方法は4種類
図1●パケットの止め方の方法は4種類
[画像のクリックで拡大表示]

 一番単純な静的フィルタリングは,(1)向き,(2)あて先IPアドレス,(3)送信元IPアドレス,(4)プロトコル番号,(5)あて先ポート番号,(6)送信元ポート番号という6種類の情報を事前に登録しておくことで,パケットの通過を許可・禁止する。

 例えば,「LAN側からインターネット側に出て行き,送信元IPアドレスがA,あて先ポート番号が80のTCPパケットであれば,あて先IPアドレス,送信元ポート番号が何であっても通す」といった具合に指定する。

 しかし,通信は応答パケットも通すようにしないと成り立たない。そこで普通は,上記のルールに加えて「インターネット側からLAN側に入ってきて,送信元ポート番号が80で,あて先IPアドレスがAのTCPパケットを通す」というルールも追加しておく。

 インターネットで使うアプリケーション・プロトコルの大部分は,あて先ポート番号が決まっている。例に出した80番はWebアクセスに使うHTTP。指定を言い換えると,「LANのパソコン(アドレスA)からインターネットへのWebアクセスは許す」ということになる。

 ファイアウォールは,このように作られたルールのリスト(テーブル)を基にパケットを通過させるか遮断するかを判断する。

 こうした静的フィルタリングを使えば,上記の例ならWebアクセスに無関係なパケットがインターネットからLANへ流れ込んだり,LANからインターネットへ流出するのを防げる。しかし,Webアクセスの応答パケットに似せた攻撃パケット(例えば,インターネット上の不正なサーバーからの送信元ポート番号が80番であて先IPアドレスがAのパケット)は通してしまう。

応答パケットだけを通すように進化

 この静的フィルタリングを進化させたのが,動的フィルタリングである。現在のファイアウォールはすべて,BBルーターも多くは,静的フィルタリングと動的フィルタリングも備える。

 動的フィルタリングでは,通信を始める側を決めておき,送信パケットに対する応答パケットを通す。例えば,「LANからインターネットへ出て行き,送信元IPアドレスがA,あて先ポート番号が80のTCPパケットと,その応答パケット」などとルールに登録する。

 この場合,ファイアウォールはLANからインターネットに出て行くパケットに対しては静的フィルタリングと同じように振る舞う。異なるのは,LANからパケットが出て行ったあとの動きである。ファイアウォールがLANからインターネットへパケットを転送すると,その応答パケットのアドレス情報などをフィルタリング・テーブルに一時的に書き加えるのである。

 例えば,インターネットへ出て行ったパケットの送信元ポート番号が1050,あて先IPアドレスがXだったら,「インターネットからLANへ入ってきて,送信元ポート番号が80,送信元IPアドレスがX,あて先ポート番号が1050,あて先IPアドレスがAのパケットを通す」というルールを書き加える。そして,通信が終了したら,このルールを消去する。

 こうすることで,LAN内のパソコンがインターネットへアクセスするパケットだけを通し,無関係なものを遮断できる。

公開サーバーへのアクセスは守備範囲外

 動的フィルタリングは,LAN内のクライアント・パソコンからインターネット上のサーバーへのアクセスを許可するときに使う一般的な手法である。LANからインターネットへのアクセスは,LAN側のポート番号がランダムに変わる。つまり,ファイアウォールが通過を許可する応答パケットのあて先ポート番号は通信が始まるまでわからない。したがって,クラッカがポート番号を予測して攻撃パケットをLANへ送り込むのが難しくなる。

 しかし,動的フィルタリングは,LAN側から通信が始まる場合しか有効ではない。そうでない場合は,静的フィルタリングと同じになる。もともと,インターネットからのアクセスを待ち受ける公開サーバー向きではないわけだ。

 また,LANからインターネットに通信するときも,いったん応答パケットが通るようになれば,パケットの中身までは検査しない。IPアドレスやポート番号を正しいものに偽装した不正パケットを通してしまう。

通信状態までチェックする

 公開サーバーに送られてくる不正パケットや,IPアドレスやポート番号を偽装したパケットを遮断するには,ステートフル・インスペクションやアプリケーション・データの検査が必要になる。

 ステートフル・インスペクションは,やりとりされるパケットを順番に見て,通信がどんな状態になっているかを把握する。そして次に届くパケットの状態を予測し,届いたパケットが矛盾していれば不正なパケットとして遮断する。例えば,TCPパケットで,データの順序番号が矛盾するパケットが届けば,不正なパケットとして遮断する。

 ステートフル・インスペクションには,TCP/IPだけを検査するものと,アプリケーション・プロトコルまでを検査するものがある。TCP/IPの場合,例えば送られるパケットのシーケンス番号と確認応答番号を覚えておき,反対向きのパケットの確認応答番号と矛盾しないかをチェックする。アプリケーション・プロトコルであれば,前に通過したパケットのコマンドやレスポンスの内容を覚えて,次に届くパケットのコマンドやレスポンスの内容が予想されるものであるかをチェックする。

 このため,同じようにステートフル・インスペクションと呼ばれていても,その深さは異なる。ステートフル・インスペクションをうたうブロードバンド・ルーターのほとんどは,TCP/IPのヘッダーしかチェックしない。一方,ゲートウエイ型ファイアウォールの多くは,アプリケーション・プロトコルまでをチェックする。

究極はデータ内部のチェック

 ステートフル・インスペクションによってかなり多くの不正パケットを遮断できるようになる。しかし,パケットのデータ部分に書き込まれて届く,攻撃用の不正コードやウイルスは,ステートフル・インスペクションでも防げない。

 そこで,ファイアウォールの一部は,アプリケーション・データの中身までをチェックする。代表的なのは,シグネチャというデータベースを使って不正なデータが入っていないかをチェックする手法。シグネチャには,攻撃パケットやウイルス入りパケットのデータ部分のビット列が記述されている。このシグネチャとパケットの中身を比較して不正なパケットを見つけ出す。

 ただし,アプリケーション・データの中身までチェックするのはファイアウォールにとって大変な作業になる。場合によっては,複数のパケットのデータ部を連結して覚えるといった手間が加わるからだ。