最近ではセキュリティの観点からFW(ファイアウォール)やUTM(統合脅威管理)の設置を行う会社が増えてきているかと思います。ただ、FWやUTMがどのようなものか知らずに導入してしまうとアクセス制御やステートフル・インスペクション等の機能により、通信・セッションが繋がらない、切れるなどの問題が発生します。
今回はFWを導入する際にアクセス制御についてはかなり設計するかと思いますが、見落としがちなステートフル・インスペクションについての説明と対処について紹介したいと思います。
CONTENTS
ステートフル・インスペクション
発生する事象
このステートフル・インスペクションの機能が働いている場合に起きることが、TCP/UDPのパケットロスです。その結果、セッションを切断し、再接続が行われるまで通信がFWにより遮断されてしまいます。
※UDPの場合は往復が必須のDNSやNTPなどの通信に限られます。
使っているユーザー側からすると「少し放置していたら、画面更新時に繋がらなくなった」や「システム間の重要な通信が急に来なくなった」等のトラブルが発生することになります。
ステートフル・インスペクションとは?
ステートフル・インスペクション (Stateful Inspection) は、TCPや一部のUDPなどにおいて不正な通信かどうかを過去の通信履歴(文脈)から判断する仕組みです。過去に送信された通信履歴を文脈として記録しておき、現在の通信と矛盾点がある場合に廃棄・拒否します。そして戻り以外のWAN側からのデータは基本的に受け付けません。
正当な接続手順を踏んで送信された通信のみ通過させるので、高い防御性能を誇るファイアウォールの構築が可能です。
動作の詳細
では詳細にどのような動きをするか確認していきます。
TCP は双方向で TCP コネクションを張り合うため、必ず戻りの通信が発生します。ポリシー (アクセス制御ルール) を決める際、 この戻りの通信を定義することはアプリケーションをすべて自社製にするなどしないとできないくらい、困難です。なぜなら一般的な TCP のクライアント通信は 1024 番以降の ハイヤーポートをランダムで使うことが多く、あらかじめ決めておくことができないためです。
また、UDPにおいても往復の通信が必要なDNSやNTP等は同様にあらかじめ戻りのポートを定義するのは困難です。
そこで、TCPやUDPの通信を管理し、戻りの通信については動的に許可する仕組みがステートフル・インスペクションとなります。
セッション・タイムアウト
一方で、TCP/UDP の返りの通信を動的に許可すると、一度開いた通信のポートからの攻撃が可能となってしまい、悪意あるユーザーからの侵入を許すセキュリティホールになります。
そのため、通信を許可する時間をあらかじめ決めておきます。この時間をセッション・タイムアウトといい、セッション・タイムアウト後は正規の通信相手との通信であっても、FWが通信を止めてしまいます。
そのため、送信側は送信しても応答が来ないため、TCPのタイムアウトが発生し、TCP ResetやFinによりコネクションを閉じ、再接続がされます。受信側はパケットが来ないため、突然再接続が発生することになります。
悪意あるユーザーからの攻撃の例

FWの設定でWEBサーバの80番ポートへの送受信が任意のIPでアクセス許可されていた場合、アクセス制御のみであれば外部(悪意あるユーザー)からPC Aに対する通信は、FWで許可され、PC Aに送信されてしまいます。これにより悪意あるユーザーがPC Aのアプリケーションに不正な動きをさせることも可能です。
ステートフル・インスペクションの機能が働いていた場合、FWの設定でWEBサーバの80番ポートへの送信が任意のIPでアクセス許可とし、復路は動的に許可がされるようになります。
過去にPC AからTCPのセッションの確立(TCP synなど)がされている場合のみ、通信のやり取りが最後の通信から一定時間経過するまで通信は確立されたままとなります。
一方でTCPのセッションの確立がされていない場合には、悪意あるユーザーからいきなりPC Aに80番ポートで送信されたとしてもPC Aへの外部からの通信は許可されていないので通信を止めることが可能です。
また通信確立後、頻繁に通信している場合でパケットを偽装されていると悪意あるユーザーからの通信が許可されてしまいますが、一定時間通信がない状態で、悪意あるユーザーからの通信が来た場合は拒否されます。
このようにセキュリティを高めることが可能です。
対策
対策としては2つあります。使用しているアプリケーションやシステムによって対策を検討する必要があります。
- FWのセッションタイムアウト時間を長く設定する。
ただし、結局セッションタイムアウトが発生するため、永遠に接続が必要なシステムの場合はNG - アプリケーションの改修を行い、再送機能を持たせる。またはTCPコネクションの監視(定周期伝文など)を行い、切断された場合でも再接続可能とする。
まとめ
今回はファイアウォールのステートフル・インスペクションについて紹介しました。現在、様々な会社でセキュリティの感度が高くなってきているので、FWを導入することが多くなっているかと思います。
そのような場合にACLと同じようなアクセス制御のポリシー設定を行ったから大丈夫だろうと既存の経路にFWを入れてしまうと通信がいきなり切れるなどのトラブルが発生することがあります。
FWにはステートフル・インスペクションという機能があると認識して導入してもらえれば、トラブルリスクがさがると思いますので、参考にしてみてください。