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

所要時間3分
0

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

簡単な説明

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

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

AWS CloudFormation または API を使用して、標準のルールグループルールのルールオプションを指定できます。この記事の例では、AWS Command Line Interface (AWS CLI) を使用しています:

**メモ:**AWS CLI コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

解像度

前提条件

ネットワークファイアウォールルールを設定する前に、次の情報を確認してください:

  • この記事では、ルールオプションを入力できる標準ルールグループルールを設定する方法を紹介します。この例では、標準ルールグループのルールにルールオプションを追加すると、ドメインリストのルールグループと連携できるようになります。これにより、トラフィックをより適切に制御できます。
  • この記事では、分散展開モデルの1つを使用しています。このモデルは、クライアントの Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを持つワークロードパブリックサブネットとインターネットゲートウェイ間のトラフィックを保護します。ファイアウォールポリシーのルール順序は、デフォルトのアクション順序に設定されています。
  • Amazon EC2 インスタンスは、VPC セキュリティグループとネットワーク ACL の TCP ポート 443 でトラフィックを送信できます。
  • この記事で使用しているファイアウォールルールは参考になる一例です。ファイアウォールに設定するルールが特定のニーズに適していて、期待どおりに機能することを確認する必要があります。

**メモ:**この記事のコード例では、出力を短くするために省略記号 (...) が使用されています。

フローキーワードなしのドメインリストルールグループと標準ルールグループの共通設定

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

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

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

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

Amazon VPC コンソールを使用して標準ルールグループルールの共通設定を作成すると、次の表のような出力が生成されます:

プロトコルソース宛先送信元ポート宛先ポート方向アクション
TCP任意任意任意任意前へ進むドロップ

許可されたドメインにリクエストを送信してルール設定をテストすると、トラフィックがブロックされ、「接続がタイムアウトしました」というエラーが表示されます:

$ curl -kv -so /dev/null https://example.com
* Trying 93.184.216.34:443...
* connect to 93.184.216.34 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 へのすべてのトラフィックがドロップされます。

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

ドメインリストルールグループとフローキーワードがある標準ルールグループルール

ネットワークファイアウォールのdescribe-rule-group コマンドとupdate-rule-group コマンドを使用して、標準のルールグループルールを更新して追加のフローキーワードを含めることができます。

1.describe-rule-group コマンドを元のステートフルルールグループオブジェクトに対して実行します。****update-rule-groupコマンドを実行するには、UpdateToken 値が必要です。

**メモ:**次のコマンドの出力の一部は、後で他の調整を行うための JSON テンプレートとして使用されます。

$ 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
{
    "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 ルールファイルを使用して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

結果は次の出力と同じようになります:

{
    "UpdateToken": "bf8fe6d4-f13e-406c-90c1-9e3bad2118a7",
    "RuleGroupResponse": {(...)},
        "LastModifiedTime": "2023-02-07T14:12:14.993000+11:00"
    }
}

4.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

出力は次のメッセージとおなじようになります:

{(...)
        "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"
    }
}

メモ:前述の例では、「確立済み、\ _サーバーへ」 は** update-rule-group** コマンドからの変更を反映しています。

5.ドメインリストのルールグループと標準ルールグループの両方がトラフィックを正しくフィルタリングしていることを確認します:

$ curl -kv -so /dev/null https://example.com
*   Trying  93.184.216.34 :443...
* Connected to example.com ( 93.184.216.34 ) 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  93.184.216.34 :443...
* Connected to www.amazon.com ( 93.184.216.34 ) 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 s3 ls --cli-read-timeout 30 --debug
(...)
Read timeout on endpoint URL: "https://s3.amazonaws.com/"

関連情報

AWS ネットワークファイアウォールのフレキシブルルールエンジンのハンズオンウォークスル — パート 1

AWS公式
AWS公式更新しました 1年前
コメントはありません