スキップしてコンテンツを表示

Network Firewall 標準ルールグループとドメインリストルールグループのルールを一緒に構成する方法を教えてください。

所要時間4分
0

AWS Network Firewall の標準ルールグループのルールとドメインリストルールグループのルールが連携してトラフィックを期待どおりに制御するように設定したいと考えています。

簡単な説明

標準ルールグループのルールを設定して、確立された TCP トラフィックをドロップします。次に、ドメインリストルールグループのルールを設定して、ドメインリストルールグループから許可されたドメインに TCP (TLS) フローを送信できるようにします。これを行うには、flow キーワードを使用してドメインリストルールグループと標準ルールグループのルールを設定します。

この記事では、分散デプロイモデルの 1 つを使用しています。このモデルは、クライアントの Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを持つワークロードパブリックサブネットとインターネットゲートウェイ間のトラフィックを保護します。ファイアウォールポリシールールの順序は、デフォルトのアクション順序に設定されています。

注: Amazon Virtual Private Cloud (Amazon VPC) コンソールには、以前に設定されたルールオプションのみが表示されます。ルールオプションを追加することはできません。詳細については、「Standard stateful rule groups in AWS Network Firewall」(AWS Network Firewall の標準ステートフルルールグループ) を参照してください。

AWS CloudFormation または API を使用して、標準ルールグループのルールのルールオプションを指定します。この記事の例では、AWS コマンドラインインターフェイス (AWS CLI) を使用しています。

解決策

注: AWS CLI コマンドの実行時にエラーが発生する場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

前提条件

Amazon EC2 インスタンスが、VPC セキュリティグループとネットワーク ACL の TCP ポート 443 でトラフィックを送信できることを確認します。

注: この記事のコード例では、省略記号 (...) を使用して出力を短縮しています。

ドメインリストルールグループと標準ルールグループを flow キーワードなしで設定する

ドメインリストルールグループと標準ルールグループを設定する場合、設定はこの例で示しているものと同様になります。ドメインリストルールグループと標準ルールグループを作成する場合は、flow キーワードを使用する必要があります。flow キーワードを使用しないと、この例で示しているような問題が発生する可能性があります。

次の例では、Amazon VPC コンソールがドメインリストルールグループを作成します。このルールは example.com への HTTPS トラフィックを許可します。

Domain name source: example.com
Source IPs type: Default
Protocol: HTTPs
Action: Allow

注: アクションが Allow に設定されたドメインリストルールグループでは、別のルールが生成されます。このルールは、ドメインの仕様と一致しない指定されたプロトコルタイプのトラフィックを拒否します。詳細については、「Domain filtering」(ドメインフィルター) を参照してください。

Amazon VPC コンソールは、次の設定で標準ルールグループのルールを作成します: プロトコル TCP、送信元 Any、送信先 Any、送信元ポート Any、送信先ポート Any、方向 Forward、アクション Drop

許可されたドメインにリクエストを送信してルール設定をテストすると、トラフィックがブロックされ、"connection timed out" というエラーが表示されます。

$ curl -kv -so /dev/null https://example.com
* Trying [IP_ADDRESS]...
* connect to [IP_ADDRESS] port 443 failed: Connection timed out
* Failed to connect to example.com port 443 after 129180 ms: Connection timed out
* Closing connection 0

この設定により、すべての TCP トラフィックがドロップされ、接続がタイムアウトします。これには、許可されたドメイン example.com への TCPベースのトラフィックのブロックも含まれます。

HTTPS 経由の example.com を許可するドメインリストルールグループのルールは失敗します。これは、TCP が最初のフローで最初に表示されるプロトコルだからです。フローは下位レイヤーの TCP ハンドシェイクから始まり、拒否ルールが評価されます。その時点では、一致する TLS プロトコルがないため、ドロップルールが一致します。これにより、example.com へのすべてのトラフィックがドロップされます。

注: ファイアウォールのステートフルエンジンのログレベルを設定して、フィルタリングされたトラフィックに関する詳細情報にアクセスできます。詳細については、「Logging network traffic from AWS Network Firewall」(AWS Network Firewall からのネットワークトラフィックのログ記録) を参照してください。

flow キーワードを使用してドメインリストルールグループと標準ルールグループのルールを設定する

Network Firewall の describe-rule-group コマンドと update-rule-group コマンドを使用して、標準ルールグループのルールを更新して追加の flow キーワードを含めます。

  1. ステートフルルールグループの UpdateToken 値を取得するには、次の AWS CLI コマンド describe-rule-group を実行します。

    $ aws network-firewall describe-rule-group --rule-group-arn "arn:aws:network-firewall:us-east-1:XXXXXXXX0575:stateful-rulegroup/stateful-rg-5-tuple" --output json

    注: XXXXXXXX0575 を実際の AWS アカウント ID に置き換えてください。stateful-rg-5-tuple を実際のルールグループ名に置き換えてください。このコマンドの出力の一部は、後で他の調整を行うための JSON テンプレートとして使用されます。

    出力は次のようになります。

    {
        "UpdateToken": "40b87af5-a20c-4f8c-8afd-6777c81add3c",
        (...)
            "RulesSource": {
                "StatefulRules": [{
                    "Action": "DROP",
                    "Header": {
                        "Protocol": "TCP",
                        "Source": "Any",
                        "SourcePort": "Any",
                        "Direction": "FORWARD",
                        "Destination": "Any",
                        "DestinationPort": "Any"
                    },
                    "RuleOptions": [{
                        "Keyword": "sid",
                        "Settings": [
                            "5"
                        ]
                    }]
                }]
            }
        (...)
    }
  2. JSON ルールファイルの内容を確認するには、ルール設定を変更した JSON ルールファイルを作成し、次のコマンドを実行します。

    $ cat tcp-drop-rule-updated.json
    {
      "RulesSource": {
        "StatefulRules": [
          {
            "Action": "DROP",
            "Header": {
              "Direction": "FORWARD",
              "Protocol": "TCP",
              "Destination": "Any",
              "Source": "Any",
              "DestinationPort": "Any",
              "SourcePort": "Any"
            },
            "RuleOptions": [
              {
                "Keyword": "sid",
                "Settings": [
                  "5"
                ]
              },
              {
                "Keyword": "flow",
                "Settings": [
                  "established, to_server"
                ]
              }
            ]
          }
        ]
      }
    }

    この例では、flow キーワードを使用すると、example.com にリクエストを送信するときに TCP ドロップルールが評価される前に TCP ハンドシェイクを完了できます。これ以降は、ルールのデフォルトのアクション順序が優先されます。このドメインリストは example.com の一致に対して HTTPS ルールを許可し、残りのトラフィックはそのフローを通過できます。許可されていないドメインへのトラフィックは、他の確立された TCP トラフィックと同様にブロックされます。

  3. 標準ルールグループを更新するには、UpdateToken 値と JSON ルールファイルを使用して次の AWS CLI コマンド update-rule-group を実行します。

    $ aws network-firewall update-rule-group --rule-group-arn "arn:aws:network-firewall:us-east-1:XXXXXXXX0575:stateful-rulegroup/stateful-rg-5-tuple" --update-token 40b87af5-a20c-4f8c-8afd-6777c81add3c --rule-group file://tcp-drop-rule-updated.json --output json

    注: XXXXXXXX0575 を実際の AWS アカウント ID に置き換えてください。stateful-rg-5-tuple を実際のルールグループ名に置き換えてください。40b87af5-a20c-4f8c-8afd-6777c81add3c をステップ 1 の UpdateToken の値に置き換えてください。

    結果は次の出力のようになります。

    {
        "UpdateToken": "bf8fe6d4-f13e-406c-90c1-9e3bad2118a7",
        "RuleGroupResponse": {...},
            "LastModifiedTime": "2023-02-07T14:12:14.993000+11:00"
        }
    }
  4. ステートフルルールグループへの変更を確認するには、次の AWS CLI コマンドdescribe-rule-group を実行します。

    $ aws network-firewall describe-rule-group --rule-group-arn "arn:aws:network-firewall:us-east-1:XXXXXXXX0575:stateful-rulegroup/stateful-rg-5-tuple" --output json

    注: XXXXXXXX0575 を AWS アカウント ID に、stateful-rg-5-tuple をルールグループ名に置き換えてください。

    出力は次のようになります。

    {(...)
            "RulesSource": {
                "StatefulRules": [
                    {
                        "Action": "DROP",
                        "Header": {
                            "Protocol": "TCP",
                            "Source": "Any",
                            (...)
                        },
                        "RuleOptions": [
                            {
                                "Keyword": "sid",
                                "Settings": [
                                    "5"
                                ]
                            },
                            {
                                "Keyword": "flow",
                                "Settings": [
                                    "established, to_server"
                               ]
               (...)
            }
        },
        "RuleGroupResponse": {...},
            "LastModifiedTime": "2023-02-07T14:12:14.993000+11:00"
        }
    }

    注: 上記の出力では、established, to_serverupdate-rule-group コマンドからの変更を反映しています。

  5. ドメインリストルールグループと標準ルールグループの両方がトラフィックを正しくフィルタリングすることを確認するには、次のコマンドを実行します。

    $ curl -kv -so /dev/null https://example.com
    *   Trying [IP_ADDRESS]...
    * Connected to example.com ([IP_ADDRESS]) port 443 (#0)
    (...)
    > GET / HTTP/1.1
    > Host: example.com
    (...)
    < HTTP/1.1 200 OK
    (...)

    出力には、許可されたドメイン example.com への HTTPS トラフィックが設定どおりに成功することが示されています。

    次の例では、許可されていないドメインへの HTTPS トラフィックが想定どおりにブロックされます。

    $ curl -m 5 -kv -so /dev/null https://www.amazon.com
    *   Trying [IP_ADDRESS]...
    * Connected to www.amazon.com ([IP_ADDRESS]) port 443 (#0)
    (...)
    * TLSv1.2 (OUT), TLS handshake, Client hello (1):
    (...)
    * Operation timed out after 5000 milliseconds with 0 out of 0 bytes received
    * Closing connection 0

オプションで、確立されている他の TCP トラフィックもブロックされていることを確認するには、次の AWS CLI コマンド s3 ls を実行します。

aws s3 ls --cli-read-timeout 30 --debug

関連情報

Hands-on walkthrough of the AWS Network Firewall flexible rules engine – Part 1 (AWS Network Firewall のフレキシブルルールエンジンのハンズオンウォークスル — パート 1)

AWS公式更新しました 7ヶ月前
1コメント

This article was reviewed and updated on 2026-02-22.

エキスパート

応答済み 1ヶ月前

関連するコンテンツ