第12回 ファイアウォールの分類
2002/12/7作成
2002/12/10更新
今回のテーマは無謀にもファイアウォールを分類してみようと思います。
詳しい人が読んだらいろいろツッコミ入れられそうですが、下で分類しているように見方によってもいろいろ分類する方法があるということで、参考程度にもてもらえればうれしいです。
今回の分類は、私の経験上で特に重視したい項目で分類してあります。
本編に入る前に、予備知識編です。
そんなの知ってるよという人はさっさと次行っちゃってください。
・セッションフローとパケットフロー
一般的に電話はかける人(Aさん)とかける相手(Bさん)がいます。
AさんにはBさんに聞きたいことがあるのでAさんはBさんに電話をしました。
この電話をかける行為がセッションにあたり、通信を開始したのがAさんなのでセッションフローは「Aさん」→「Bさん」ということになります。
通話中はAさんが何か聞くとBさんが答えを返してくれます。
会話の流れがここではパケットに例えられます。
セッションはAさんからBさんなのですが、パケットはBさんからAさんにも流れます。
これがパケットフローです。
ファイアウォールが制御する通信もこれと同じことが起きています。
・TCP 3wayハンドシェイク
TCPでは、3wayハンドシェイクという手順で通信をはじめようとします。
まずTCPではSYNパケットというのを相手に投げます。
SYNパケットを受け取った相手は投げてきた相手に通信を許可したい場合SYN/ACKパケットというのを投げ返してあげます。
SYN/ACKを受け取ったら準備ができたということなのでようやくデータを送ることができます。
ちなみに、このSYNやらACKやらというのはTCPのヘッダの中にあるフラグの部分で認識しています。
他にもRSTやらFINやらのフラグがありますが、詳しくはTCP/IPの本を読みましょう。
・TCP/UDPポート番号
TCPとUDPではポート番号を使って通信をします。
たとえば、TCPの80番ポートはhttpで、UDPの53番はDNSだったりするわけですが、サーバ側のポート番号のほか、通信元もポート番号を持っています。
サーバに届いたパケットは通信元のポート番号に返事を返します。
ポート番号の役割は上記のセッションフローと深い関わりがあり、一般的に一連のセッションは同じポート番号を使って行われます。
1.ステートフルとステートレス
ファイアウォールの役割は主に内から外の通信はOKで、外から内の通信はNGですが、そのままでは困ったことが起こります。
相手から返される通信までもがファイアウォールで捨てられてしまうのです。
電話に例えるなら、自分の声は相手に届いているのですが、相手の声が届かない状態です。
ということで、ファイアウォールではただパケットを見てフィルタをかけるのではなく、セッションも意識しなければいけません。
ステートフルなファイアウォールは、内から外に出ていったパケットのセッション情報すなわちIPアドレスとポート番号を記憶して、出ていったパケットに対する戻りのパケットだけを通してあげます。
セッションのステータスを保持するという意味からステートフルなわけです。(多分)
セッションの維持はいろいろな要素があります。時間によるセッションの維持だったり、TCPの場合はFINパケットの検知でセッションを解放することもあります。
ステートレスなファイアウォールは、TCPの場合、内から外のパケットは特に制限しませんが、外から内に入ってくるパケットはACKパケットだけを許可します。セッションの開始は必ずSYNがあるので、SYNを通さないだけでも十分ファイアウォールになります。
UDPの場合は内から外はいいのですが、外から内のパケットのルールには気を使わなければいけません。
一般的には自分が使いたいサービスがソースポートに書かれているパケットはすべて通す方法にしますが、そうするとソースポートを偽って任意のUDPを攻撃される可能性があるのでもう少し考えた方がいいです。
一般的に、ステートレスの方がステートフルより処理的に楽してるので高速に動く傾向にあるようです。
ステートフルなファイアウォールはパケットを意識せずに設定することができるので設定が楽であるという利点もあります。
逆にステートレスではパケットベースの設定をしていくので設定が難しいのですが、その反面細かいところまで設定できたりするので、そこが利点だったりします。もちろん細かい設定ができるステートフルなファイアウォールもあると思いますが。
余談ですがステートレスなファイアウォールの設計・設定をするとTCP/IPに詳しくなれるという恩恵が得られるでしょう。
私が使っているFreeBSDのIPFilterはどっちも可能ですが、なぜかあまりステートフルの設定をして使っているひとは見ないです。
私もステートレスで設定してます。性能悪いのかなぁ?
2.レイヤ
OSIの7層とか、インターネットの5層とかいろいろありますが、なじみが深いOSIの7層で見ていくことにします。
5層以上はほとんど境目が無いので一緒にしてあります。
レイヤ 名称 ファイアウォール(?)の例 7層 アプリケーション層 ログのフィルタ
有害サイトのフィルタリング
ウィルスチェックなど6層 プレゼンテーション層 5層 セッション層 4層 トランスファー層 TCP/UDPポート番号によるパケットフィルタ 3層 ネットワーク層 IPアドレスによるパケットフィルタ 2層 データリンク層 MACアドレスを登録するHUB、VLAN 1層 物理層 ハブを別にする。LANにつながない。
一般的なファイアウォールはIPアドレスとポート番号の組み合わせでフィルタをかけているので3〜4層のネットワーク層かトランスポート層ということになります。
1,2層で動くファイアウォールもあります。たとえばVLANを切ったりMACアドレスを登録するHUBなんかがそれに当たります。
極端な話ですがHUBを別にしたり、マシンを置く部屋を別にしたり部屋に鍵をかけるのも1層のファイアウォールと言っていいかもしれません。(いいのか本当に?)
ちょっぴり上位で動くファイアウォールはURIフィルタがあります。ホームページを見るときにおなじみのURLですが、ある文字列が入っていたらダメとかすることができます。これを活用すれば国ドメイン指定でアクセス拒否とかもできるようになります。
さらに上位になると通信データの中身を見て有害なコンテンツをシャットアウトしたりすることも可能です。
メールサーバに仕掛けるウィルスチェックソフトもこの分類です。
当然のことですが、ファイアウォールが見るレイヤが高くなればなるほどファイアウォールとなるホストのハードウェアに高いスペックが要求されます。
3.ルータモードとブリッジモード
ファイアウォールの内と外でIPアドレスのネットワークセグメントが変わってしまうのがルータモード。
同じネットワークなのがブリッジモードです。
ルータモードのファイアウォールが一般的です。
ブリッジモードはファイアウォールがあることを意識することなくネットワークを利用することができます。ただし、ファイアウォール本体の設定はかなり煩雑で難しいです。
proxyARPやらIPアドレスのaliasやらを書いて左右のホストに振り分けたりしないといけないし、トラブルが起きたときパケットの挙動を把握できなかったりするのが難点です。さらにせっかくファイアウォールを設置してもうっかりファイアウォールの向こう側にPCを接続されたりするとファイアウォールの意味が無くなります。
でも、既にあるネットワークになんの影響も与えずにさっくりと加えることができるのがうれしいです。
なんにも無いところにファイアウォールを設置するときはルータタイプがおすすめです。
NATが使えるファイアウォールはルータタイプということになります。
4.適用のタイミング
最近のファイアウォールは多機能なので、パケットフィルタ以外にもパケット処理として以下の様な処理をします。
・PPPoE(oA)のカプセル化
・NAT(IPマスカレード)
・ルーティング
・IPSecなどのVPN処理
ネットワークから流れてきたパケットはネットワークカードから入ってきて内部で処理されまた出ていくのですが、上記の処理をホスト上で順番に行っていくことになります。
いろいろなパターンがあると思われますが、大抵は
PPPoE→IPSec→NAT→パケットフィルタ→ルーティング(カーネル処理)→パケットフィルタ→(NAT)
という流れがあると思います。
あえてIPSecを分解せずにそのままフィルタしたりNATすることもあると思います。
パケットフィルタが2つあるのは入りと出で2回作用するからです。
ファイアウォールの仕様によってはこの順番はいろいろ変わることが考えられます。
NATがあとになったり、ルーティングしながらパケットフィルタしたりといろいろあると思います。
ここで注意したいのはパケットフィルタをあまり後回しにしてしまうと、その間に通過する処理が増えてしまうということです。
通過する処理を行うアプリケーションにバグやセキュリティホールがあった場合、ファイアウォールに届く前に攻撃されてしまいます。
処理が多ければ多いほどその脅威にさらされると言うわけです。
ということで、パケットフィルタはなるべく早めに適用するのがいいと私は個人的に思います。
特にVPN関連では最近SSLのバグが多いので怖いですね。