😎

AWS Network Firewallが意図しない挙動となる場合がある

2024/07/21に公開1

はじめに

みなさんは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:1Stateful domain list rule groupsを許可リスト形式で利用
priority:2Standard 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-nwfw-single-az-deployment-diagram

挙動解説

本挙動は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 標準ルールグループとドメインリストルールグループルールを一緒に構成する方法を教えてください。」を合わせて確認いただければと思います。

事象回避方法

前提

  1. Strict orderでNW FWを利用
    image

  2. priority:1Stateful domain list rule groupsを許可リスト形式で利用
    image

  3. priority:2Standard stateful rule groupsをTCP/IPの通信をRejectする目的で利用
    image

事象回避設定

以下を設定することで、許可リスト形式で許可したドメインに対する通信のみを許可することが可能となります。

  1. Standard stateful rule groupsのRejectルールのRule optionにkeyword:flow, Settiongs:established, to_serverを設定
    image

おわりに

AWS Network Firewallは完全なドメインベースの通信制御に利用することはできませんが、挙動を理解した上で利用するのであればドメインベースの通信制御目的で利用することができます。

本記事がどなたかのお役に立てば幸甚です。

また、本記事を読んでくださった方が、AWSやネットワークに興味を少しでも持っていただけると嬉しいです。

ここまで読んでくださってありがとうございました。

Accenture Japan (有志)

Discussion