2026-01-27 13:55:18
20
by Ajinkya Patil 和 Stephan Traub 于 2024年2月16日发布于 中级(200) 安全性、身份与合规性 技术实用指南永久链接评论 分享
AWS 网络防火墙是一种有状态的管理型网络防火墙和入侵检测与预防服务,专为 Amazon 虚拟私有云 (Amazon VPC) 设计。本文专注于通过使用分布式防火墙配置来自动化中央网络防火墙中的规则更新。如果您对网络防火墙不熟悉或寻求有关规则管理的技术背景,请查看 AWS Network Firewall 新管理型防火墙服务 。
网络防火墙提供三种 部署模型:分布式、集中式和组合式。许多客户选择集中式模型以降低成本。在此模型中,客户将规则集管理的责任分配给被保护的 VPC 基础设施分支账户的所有者,从而转移责任并为分支账户提供灵活性。没有适当的输入验证、状态管理和请求限流控制,在共享防火墙策略中管理由分布式输入配置生成的规则集是具有挑战性的。
日本加速器下载在本文中,我们将展示如何通过分布式防火墙配置自动化中央防火墙中的规则管理。 anfwautomate 解决方案提供输入验证、状态管理和限流控制,将防火墙规则变更的更新时间从分钟减少到秒。此外,该解决方案降低了包括规则管理在内的运营成本,同时与现有的持续集成和持续交付 (CI/CD) 流程无缝集成。
在本步骤中,您需要满足以下前提条件:
具备网络概念的基础知识,例如路由和无类域间路由 (CIDR) 范围分配。具备 YAML 和 JSON 配置格式、定义及模式的基础知识。具备 Suricata 规则格式 和 网络防火墙规则管理 的基础知识。具备基础的 CDK 部署知识。具备使用 AWS 身份与访问管理 (IAM) 的权限,以使用 AWS 云开发工具包 (AWS CDK) 引导 AWS 账户。中心账户中的防火墙 VPC 必须能够从分支账户访问见集中式部署模型。对于此解决方案,您需要两个来自集中式部署模型的 AWS 账户:分支账户是定义防火墙规则的消费账户,并使用中心防火墙端点进行流量过滤。至少年需要一个分支账户来模拟验证阶段的用户工作流。中心账户是包含防火墙端点的账户。此账户供应用程序和网络防火墙使用。必须在 AWS 组织 中启用带服务管理权限的 StackSets 部署为 AWS 组织启用受信任访问。需要 委派管理员账户 来部署 AWS CloudFormation 堆栈至组织中的任何账户。该账户中的 CloudFormation StackSets 部署必要的 CloudFormation 堆栈到分支账户。如果不具备委派管理员账户,您必须手动在分支账户中部署资源。生产环境中不建议手动部署。资源账户是用于部署所需 AWS CodePipeline 堆栈的 CI/CD 账户。管道将相关的跨账户跨 AWS 区域堆栈部署到前述 AWS 账户。IAM 权限以在资源账户中部署 CDK 堆栈。在网络防火墙中,每个防火墙端点连接到一个防火墙策略,该策略定义网络流量监控和过滤行为。行为的详细信息在规则组中定义这是一组可重用的规则,用于检查和处理网络流量。规则组中的规则提供包检查的详细信息,并指定当数据包符合检查标准时需要采取的操作。网络防火墙使用 Suricata 规则引擎 处理所有有状态规则。目前,您可以在网络防火墙中创建与 Suricata 兼容的基本规则例如域列表。我们在本文中使用与 Suricata 兼容的规则字符串,以保持与大多数用例的最大兼容性。
下图描述了如何使用 anfwautomate 解决方案的分布式防火墙规则配置简化多个团队的规则管理。规则在中央 AWS 网络防火墙策略中进行验证、转换和存储。该解决方案将规则生成隔离到分支 AWS 账户,但仍使用共享防火墙策略和中心 ANFW 进行流量过滤。这种方法赋予 AWS 分支账户拥有者管理其自身防火墙规则的灵活性,同时对其规则在防火墙策略中的责任进行追溯。该解决方案使中央安全团队在将用户定义的防火墙规则推送到生产防火墙策略之前,能够验证并覆盖这些规则。操作中央防火墙的安全团队还可以定义适用于所有分支账户的额外规则,从而加强组织范围内的安全政策。然后,防火墙规则以秒为单位编译并应用于网络防火墙,在涉及关键安全事件的情况下提供接近实时的响应。
网络防火墙的防火墙端点和 anfwautomate 解决方案都部署在中心账户中。分支账户使用此应用程序进行规则自动化,并利用网络防火墙进行流量检查。

如图1所示,每个分支账户包含以下内容:
一个 Amazon Simple Storage Service (Amazon S3) 存储桶,用于存储多个配置文件,每个区域一个。配置文件中定义的规则适用于分支账户中的 VPC 流量。配置文件必须符合定义的命名约定Regionconfigyaml并经过验证,以确保每个区域每个账户中只有一个配置文件。S3 存储桶已启用事件通知,所有配置文件的更改都会发布到 Amazon EventBridge 的局部默认总线中。EventBridge 规则监视默认总线并将相关事件转发到中心账户中的自定义事件总线。EventBridge 规则专门监视由 Amazon CloudTrail 和 S3 事件通知发布的 VPCDelete 事件。当从分支账户中删除 VPC 时,VPCDelete 事件将导致从防火墙策略中删除对应的规则。此外,来自 Amazon S3 事件通知的所有创建、更新和删除事件都会调用防火墙策略上的相应操作。两个 AWS 身份与访问管理 (IAM) 角色,关键字为 xaccountlmbrc 和 xaccountlmbre,分别由中心账户中的 RuleCollect 和 RuleExecute 函数假设。一个 CloudWatch Logs 日志组,用于存储由中心 AWS Lambda 应用程序发布的事件处理日志。在中心账户中:
EventBridge 规则监视自定义事件总线,并调用名为 RuleCollect 的 Lambda 函数。事件桥规则附带死信队列,用于存储未能调用 Lambda 函数的事件。RuleCollect 函数通过假设跨账户角色从分支账户检索配置文件。该角色由创建其他分支账户资源的相同堆栈部署。Lambda 函数验证请求,将请求转换为 Suricata 规则语法,并首先将规则发布到 Amazon Simple Queue Service (Amazon SQS) fifo 队列中。输入验证控制至关重要,以确保用户不滥用解决方案的功能并绕过中央治理控制。Lambda 函数具有输入验证控制,以验证以下内容:配置文件中的 VPC ID 在配置的区域和 S3 存储桶中的同一 AWS 账户中存在。接收到的事件中的 Amazon S3 对象版本 ID 与最新版本 ID 匹配,以降低竞争条件。规则中不应仅包含顶级域名例如 com、de。自定义 Suricata 规则的目标 IP 地址或域不应为 any。VPC 标识符必须符合所需格式,即 a(AWS 账户 ID)(没有 vpc 前缀的 VPC ID),确保规则组中的规则变量唯一。规则中不得使用 sid、priority 或 metadata 等安全敏感关键字。这些关键字保留给防火墙管理员和 Lambda 应用程序。配置的 VPC 连接到 AWS Transit Gateway。规则配置中仅存在通过pass规则。VPC 的 CIDR 范围被使用 IP 集变量适当映射。输入验证确保一个分支账户定义的规则不会影响其他分支账户的规则。应用于防火墙规则的验证可以根据您的需求更新和管理。创建的规则必须遵循严格的格式,偏离前述规则将导致请求被拒绝。
Amazon SQS fifo 队列保存分支账户配置存储桶中创建、更新和删除操作的顺序。这些状态管理控制维护 S3 存储桶中的配置文件与防火墙政策中的规则之间的一致性。如果未遵循分布式配置提供的更新顺序,防火墙政策中的规则可能与预期的规则集不匹配。未处理的规则超出 maxReceiveCount 阈值后,将移至死信 SQS 队列以进行故障排除。
之后,Amazon SQS 消息由另一个名为 RuleExecute 的 Lambda 函数消费。对一个配置的多个更改合并在一条消息中。RuleExecute 函数解析消息并在网络防火墙中生成所需的规则组、IP 集变量和规则。此外,Lambda 函数建立保留规则组,供解决方案管理员管理并用于定义全局规则。适用于参与 AWS 账户的全局规则可以由中央安全团队在 data/defaultdenyyaml 文件中进行管理。RuleExecute 函数还实施限流控制,以确保规则在不触发网络防火墙 ThrottlingException 的情况下应用于防火墙策略。该函数还实现后退逻辑以处理此异常。如果对网络防火墙 API 发出了过多请求,则会发生这种限流效果。
该函数根据用户配置中提供区域的信息发起跨区域对网络防火墙的调用。除非用例需要,否则无需在多个区域中部署 RuleExecute 和 RuleCollect Lambda 函数。
接下来的部分将指导您完成规则管理引擎的部署。
部署:概述将解决方案部署到目标 AWS 账户的步骤。验证:描述验证部署并确保解决方案功能的步骤。清理:提供清理部署的说明。在此阶段,您将在资源账户中部署应用程序管道。该管道负责在中央账户和委派管理员账户中部署多区域跨账户 CDK 堆栈。
如果您在中央账户中没有正在使用的集中式部署模型的网络防火墙,请参阅 README 中的说明,在继续之前部署 Amazon VPC 和网络防火墙堆栈。您需要在每个被分支账户 VPC 基础设施使用的区域和可用区域中部署网络防火墙集中式版本。
应用程序管道堆栈 在所有配置的区域中部署三个堆栈:中心账户中的 LambdaStack 和 ServerlessStack,以及委派管理员账户中的 StacksetStack。建议仅在主要区域中部署这些堆栈,因为该解决方案可以有效管理所有受支持区域的防火墙策略。
LambdaStack:部署 RuleCollect 和 RuleExecute Lambda 函数、Amazon SQS FIFO 队列和 SQS FIFO 死信队列。ServerlessStack:部署 EventBridge 总线、EventBridge 规则和 EventBridge 死信队列。StacksetStack:在委派管理员账户中部署服务管理的堆栈集。堆栈集包括在分支账户中部署 IAM 角色、EventBridge 规则、S3 存储桶和 CloudWatch 日志组。如果您是在分支账户中手动部署 CloudFormation 模板templates/spokeserverlessstackyaml,您可以选择在应用程序配置中禁用此堆栈。准备引导安装 并使用 Amazon 命令行接口 (AWS CLI) 为所有 AWS 账户配置配置文件。安装 云开发工具包 (CDK)。安装 Git,并克隆 GitHub 仓库。安装 并启用 Docker Desktop。准备部署根据 README 和 CDK 引导指南 引导资源账户。然后,引导中央账户和委派管理员账户如果 manually 部署 StacksetStack 则可选以信任资源账户。分支账户无需引导。创建一个文件夹,称为 ,其中 STAGE 是您部署阶段的名称例如,本地 (local)、开发 (dev)、集成 (int) 等在克隆的仓库的 conf 文件夹中。部署阶段随后将作为 STAGE 参数被设置并用于 AWS 资源名称。在 文件夹中创建 globaljson。根据 README 更新参数值。样本 JSON 文件位于 conf/sample 中。运行以下命令以配置本地环境:
bashnpm installexport STAGE=ltSTAGEgtexport AWSREGION=ltAWSRegiontodeploypipelinestackgt
部署应用程序管道堆栈在 文件夹中创建一个名