如何同时配置 Network Firewall 标准规则组和域列表规则组规则?
我想要配置 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-group 和 update-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 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 4 个月前