如何同时配置 Network Firewall 标准规则组和域列表规则组规则?

3 分钟阅读
0

我想要配置 AWS Network Firewall 标准规则组规则和域列表规则组规则,以便协同工作来按预期控制流量。

简短描述

您可以配置标准规则组规则来丢弃已建立的 TCP 流量。然后,您可以配置域列表规则组规则,以允许 TCP (TLS) 流从域列表规则组发送到允许的域。您可以通过使用“flow”关键字配置域列表规则组和标准规则组规则来实现这一点。

**注意:**Amazon Virtual Private Cloud (Amazon VPC) 控制台仅显示先前配置的规则选项。它不允许您添加规则选项。有关详细信息,请参阅 AWS Network Firewall 中的标准状态规则组

您可以使用 AWS CloudFormation 或 API 来为您的标准规则组规则指定规则选项。本文中的示例使用 AWS 命令行界面 (AWS CLI):

**注意:**如果您在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI

解决方法

先决条件

在配置 Network Firewall 规则之前,请查看以下信息:

  • 本文介绍了一种配置标准规则组规则的方法,该方法允许输入规则选项。在此示例中,向标准规则组规则添加规则选项可以使其与域列表规则组一起使用。这使您能更好地控制流量。
  • 本文使用分布式部署模型之一。此模型保护具有客户端 Amazon Elastic Compute Cloud (Amazon EC2) 实例的工作负载公有子网与互联网网关之间的流量。防火墙策略规则顺序设置为默认操作顺序
  • Amazon EC2 实例能够在 VPC 安全组和网络 ACL 中通过 TCP 端口 443 发送流量。
  • 本文中使用的防火墙规则是供参考的示例。您必须确保为防火墙配置的规则适合您的特定需求并按预期运行。

**注意:**本文的代码示例使用了省略号 (...) 来缩短输出。

不含 flow 关键字的域列表规则组和标准规则组的通用配置

在配置域列表规则组和标准规则组时,您的配置可能与本示例中详述的配置类似。如果创建域列表规则组和标准规则组,则您必须使用 flow 关键字。如果不使用 flow 关键字,则您可能会遇到诸如本示例中详述的问题。

本示例使用了 Amazon VPC 控制台来创建域列表规则组。该规则允许 HTTPS 流量发往 example.com

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 流量被丢弃,并导致连接超时。这包括阻止基于 TCP 的流量发往允许的域 example.com

允许 example.com 通过 HTTPS 传输的域列表规则组规则失败,因为 TCP 协议是第一个出现在初始流中的协议。流从较低层的 TCP 握手开始,然后评估拒绝规则。但是,仍然没有 TLS 协议可以匹配,因此丢弃规则匹配。这导致发往 example.com 的所有流量被丢弃。

**注意:**您可以为防火墙的状态引擎配置日志记录级别,从而访问有关筛选流量的详细信息。有关详细信息,请参阅记录来自 AWS Network Firewall 的网络流量

带有 flow 关键字的域列表规则组和标准规则组规则

您可以使用 Network Firewall describe-rule-groupupdate-rule-group 命令来更新标准规则组规则,使其包含额外的 flow 关键字。

1.    对原始状态规则组对象运行 describe-rule-group 命令。您需要 UpdateToken 值才能运行 update-rule-group 命令。

**注意:**以下命令的部分输出用作 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"
    }
}

**注意:在前面的示例中,“established, to_server”**反映了 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
(...)

在前面的示例中,输出显示,HTTPS 流量按照配置成功传输到允许的域 example.com

在下一个示例中,发往不允许的域的 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 Network Firewall 灵活规则引擎的实践演练 – 第 1 部分

AWS 官方
AWS 官方已更新 2 年前