コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
ファイアウォール基礎
片道だけ許可すると、応答が返ってこない
関所を置いて「外から中への 443 番は通す」と書いたとします。これで Web サーバーは公開できます。
では、中から外へ見にいく通信はどうでしょうか。「中から外への 443 番は通す」と書いても、それだけでは動きません。応答が外から中へ入ってくるからです。応答の分も許可しなければならず、要求と応答で 2 本ずつ書くことになります。ルールが 100 本あれば 200 本です。しかも応答が返ってくる番号は毎回変わるので、書きようがありません。
会話を覚えていれば、片道だけ書けばいい
そこで、いまのファイアウォールはやりとりの状態を覚えています。中から外への通信を許可した時点で「この会話が進行中」と記録し、その会話に対する応答は自動で通します。
おかげで、書くべきルールは片道分だけになります。家庭用ルーターの内蔵ファイアウォールも、クラウドのセキュリティグループも、この方式です。「中から外は自由、外から中への新規の呼びかけは拒否」という既定値が成り立っているのは、この記録があるからです。応答は新規の呼びかけではなく、進行中の会話の続きだと判別できます。
覚えている以上、限りもあります。会話の記録は表に溜まるので、同時に扱える会話の数には上限があります。攻撃を受けたときはもちろん、正常な高負荷でもこの表は埋まります。埋まると新しい通信を受け付けられません。ファイアウォールそのものが詰まって全部止まる、という壊れ方があることは頭に入れておいてください。
拒否を最後に置くか、最初に置くか
判断材料は、送り主と宛先の IP アドレス、宛先の番号、TCP なのか UDP なのか、そして先ほどの会話の状態です。ルールは上から順に照合され、最初に当てはまったものが適用されます。
プレーンテキスト
許可 すべての送信元から Web サーバー群の 443 番へ
許可 社内の範囲からのみ DB サーバー群の 5432 番へ
拒否 それ以外すべて最後の 1 行が肝心です。明示的に許可したものだけを通し、残りは全部落とす。この順序にしておけば、書き忘れは「通らない」という形で表面化します。逆に「基本は通す、危ないものだけ落とす」と書くと、書き忘れが素通りになり、誰も気づけません。動かないほうが安全側なので、面倒でも許可を並べる形にします。
クラウドでも考え方はそのままです。仮想マシンやコンテナの手前に置く設定画面は、名前こそ違っても、やっているのはここで見た許可の並べ方そのものです。違うのは、境界の機器ではなく個々のインスタンスに紐づく点で、そのぶん細かく絞れます。
関所だけでは守りきれない
ファイアウォールは万能ではありません。443 番を許可した以上、その中を流れる中身は素通りします。中身に仕込まれた攻撃を止めたければ、要求の中を開けて読む別の仕組みが要ります。中から外への通信を許可している以上、内部に入り込んだものが情報を持ち出すのも止められません。
だから 1 枚で守ろうとしません。境界の関所、機器そのものの設定、アプリの認証、記録の監視と、性質の違う守りを重ねます。1 枚破られても次で止まる、という組み方をします。止められないものを先に一覧にしておくと、次に何を足すべきかが決まります。ファイアウォールを入れて安心してしまう状態が、いちばん危ないところです。
復習ミニクイズ
ステートフルファイアウォールの説明として正しいものはどれですか