AWS Network Firewallが意図しない挙動となる場合がある
はじめに
みなさんはAWS Network Firewall(NW FW)を利用しているでしょうか?
今回はNW FWを利用する際の注意点を共有します。
TL;DR
- NW FWを厳格な評価順序(Strict evaluation order)で利用している場合において優先度(priority)順で評価されない場合がある
- Standard stateful rule groupsに「flow」キーワード
keyword:flow, Settiongs:established, to_server
を設定することで事象回避可能
具体例を挙げると以下の様に設定した場合、priority:1
で許可したドメインに対して通信がDrop/Rejectされます。
priority:1
Stateful domain list rule groupsを許可リスト形式で利用
priority:2
Standard stateful rule groupsをTCP/IPの通信をDrop/Rejectする目的で利用
余談
明示的にReject設定することってどのようなメリットがあるの?と思われた方がいるかもしれません。
Strict evaluation orderにしておくとデフォルトでは暗黙的なDropがおこなわれます。しかし、Dropの場合は通信のタイムアウトまで待つ形になるので、タイムアウトまで待たせたくない(速やかに通信切断したい)場合はRejectを設定することで速やかに通信を切断することが可能となります。
ルールエンジンの振る舞いについてはAWS公式: Network Firewall stateless and stateful rules enginesを参照ください。
以下はcurlコマンドを用いて実際に検証してみた際の挙動となります。
コマンド結果からDrop時においてはタイムアウトとなっていますが、Reject時においてはリセットされていることがわかります。
## Drop時の挙動
sh-5.2$ curl https://www.yahoo.co.jp -m 5
curl: (28) Connection timed out after 5002 milliseconds
## Reject時の挙動
sh-5.2$ curl https://www.yahoo.co.jp
curl: (35) Recv failure: Connection reset by peer
curlコマンドは以下構成のWorkload(EC2)から実行。
AWS公式: Deployment models for AWS Network Firewall
挙動解説
本挙動はAWS公式: AWS Network Firewall Action orderに記載があります。
原文
The protocol layer does not impact the rule evaluation order by default. If you want to avoid matching against lower-level protocol packets before higher-level application protocols can be identified, consider using the flow keyword in your rules. This is needed because, for example, a TCP rule might match on the first packet of a TCP handshake before the stateful engine can identify the application protocol. For information about the flow keyword, see Flow Keywords.
日本語訳(機械翻訳)
プロトコル層は、デフォルトではルール評価順序に影響を与えません。より高レベルのアプリケーションプロトコルが識別される前に、低レベルのプロトコルパケットに対するマッチングを避けたい場合は、ルールでflowキーワードの使用を検討してください。これが必要な理由は、例えば、ステートフルエンジンがアプリケーションプロトコルを識別する前に、TCPルールがTCPハンドシェイクの最初のパケットにマッチする可能性があるためです。flowキーワードに関する情報については、「フローキーワード」を参照してください。
上記公式ドキュメントだけだと理解が難しいかと思いますので、AWS re:Post 「Network Firewall 標準ルールグループとドメインリストルールグループルールを一緒に構成する方法を教えてください。」を合わせて確認いただければと思います。
事象回避方法
前提
-
Strict orderでNW FWを利用
-
priority:1
Stateful domain list rule groupsを許可リスト形式で利用
-
priority:2
Standard stateful rule groupsをTCP/IPの通信をRejectする目的で利用
事象回避設定
以下を設定することで、許可リスト形式で許可したドメインに対する通信のみを許可することが可能となります。
- Standard stateful rule groupsのRejectルールのRule optionに
keyword:flow, Settiongs:established, to_server
を設定
おわりに
AWS Network Firewallは完全なドメインベースの通信制御に利用することはできませんが、挙動を理解した上で利用するのであればドメインベースの通信制御目的で利用することができます。
本記事がどなたかのお役に立てば幸甚です。
また、本記事を読んでくださった方が、AWSやネットワークに興味を少しでも持っていただけると嬉しいです。
ここまで読んでくださってありがとうございました。
Discussion
今日はご一緒させて頂きありがとうございました!