安全组对比网络ACL:如何选择您的AWS VPC防火墙

通过掌握安全组(SG)和网络ACL(NACL)之间的区别,驾驭AWS VPC安全的复杂性。这份专家指南解释了这两种控制措施的范围、状态性以及规则评估。了解为何安全组(SG)是细粒度、有状态实例保护的理想选择,而网络ACL(NACL)对于广泛的、无状态子网分段和明确拒绝策略至关重要。为您的云基础设施实施一个强大、多层次的防火墙策略。

42 浏览量

安全组与网络 ACL:如何选择您的 AWS VPC 防火墙

在 Amazon Web Services (AWS) 中设计安全的虚拟私有云 (VPC) 环境时,管理员依赖多层控制来管理网络流量。在网络层面过滤流量的两个基本组件是安全组 (SG) 和网络访问控制列表 (NACL)。

虽然两者都充当虚拟防火墙并使用规则来控制入站和出站流量,但它们在 VPC 架构的基本不同层级上运行,并使用不同的机制进行规则评估。理解这些差异——特别是它们的范围、状态性以及规则处理方式——对于建立健壮且合规的网络安全态势至关重要。本指南提供了全面的比较,并解释了如何有效利用 SG 和 NACL 来实现深度防御。

AWS VPC 中防火墙的作用

AWS 在 VPC 内部的两个主要层面提供网络安全:

  1. 实例级别(安全组): 作为特定 EC2 实例或资源(如 RDS 数据库或弹性负载均衡器)的防火墙。它控制进出网络接口的流量。
  2. 子网级别(网络 ACL): 作为整个子网的无状态防火墙,控制进出子网边界的流量流。

深入了解安全组 (SG)

安全组充当单个资源的初级、细粒度防火墙。它们是有状态的,并在 OSI 模型中工作在第 4 层(传输层)。

安全组的关键特性

特性 描述 对使用的影响
范围 直接应用于实例的网络接口 (ENI)。 控制进出实例本身的流量流。
状态性 有状态。如果明确允许了入站请求,相应的返回流量(出站响应)会自动允许,而无需考虑出站规则。 简化配置;只需定义初始流量方向。
规则类型 仅允许。不可能有明确的拒绝规则。不匹配明确 ALLOW 规则的流量将被隐式拒绝。 侧重于定义允许的内容。
评估 在做出决定之前评估所有规则。它们没有编号,并且在所有 ALLOW 规则失败之前不会处理隐式 DENY 顺序不重要;所有规则同等对待。

安全组配置示例

要允许 SSH 访问 (端口 22) 到 EC2 实例,您只需要一个入站规则。SSH 响应的出站规则由 SG 的有状态特性自动处理。

类型 协议 端口范围 描述
入站 TCP 22 0.0.0.0/0 (或特定的管理员 IP) 允许 SSH 访问
出站 所有 所有 0.0.0.0/0 (默认:允许所有流量,但如有需要可以限制)
# 有状态流的概念表示
用户 (源 IP) --> [入站 SG 规则: 允许 22] --> EC2 实例
EC2 实例 (响应) --> [隐式状态跟踪] --> 用户 (收到响应)

最佳实践提示: 始终遵循最小权限原则定义安全组规则。尽可能限制源 IP 范围,而不是允许 0.0.0.0/0


深入了解网络 ACL (NACL)

网络 ACL 提供第二层防御,充当子网边界上的无状态过滤器。它们在网络分段和广泛拒绝策略方面非常强大。

网络 ACL 的关键特性

特性 描述 对使用的影响
范围 应用于整个 VPC 子网。一个子网一次只能与一个 NACL 相关联。 控制进出子网的所有流量,影响其中的所有实例。
状态性 无状态。必须明确允许入站请求和相应的出站响应。 需要仔细配置返回流量(临时端口)。
规则类型 允许和拒绝。您可以明确定义规则来允许或阻止流量。 非常适合在整个网络中阻止已知的恶意 IP 或拒绝特定的协议。
评估 规则被编号 (1 到 32766) 并按顺序评估,从最小数字开始。第一个匹配的规则立即应用。 规则顺序至关重要。隐式拒绝规则(最后处理的规则)拒绝所有未明确允许的内容。

处理无状态流量(临时端口)

由于 NACL 是无状态的,您必须考虑客户端连接服务器时使用的临时端口。当客户端发起连接时,它使用一个目标端口(例如,HTTP 的 80 端口)和一个高编号的源端口(临时端口范围,通常为 1024-65535)。

要允许 Web 流量 (HTTP) 进入子网,您需要两条规则:

  1. 入站规则: 允许目标端口上的流量(例如 80)。
  2. 出站规则: 允许使用临时源端口返回客户端的流量。
规则编号 类型 协议 端口范围 源/目标 规则操作
100 入站 TCP 80 0.0.0.0/0 允许 (Web 流量进入)
110 出站 TCP 1024-65535 0.0.0.0/0 允许 (Web 响应出去 - 临时端口)
* 隐式拒绝 所有 所有 所有 拒绝 (最后处理)

警告: 如果在 NACL 中遗漏了临时端口对应的出站规则,流量会到达实例(由于入站规则),但响应会在子网边界被丢弃,从而导致连接超时。


比较总结:SG 与 NACL

下表总结了两种防火墙类型的关键区别:

特性 安全组 (SG) 网络 ACL (NACL)
适用范围 实例/ENI 级别 子网级别
状态 有状态 无状态
规则类型 仅允许 允许和拒绝
规则评估 评估所有规则,无特定顺序。 按编号顺序评估规则(从最小的开始);首个匹配的获胜。
默认行为 拒绝所有入站,允许所有出站(除非限制)。 默认 NACL 允许所有入站/出站。自定义 NACL 拒绝所有入站/出站。
对流量的影响 仅在流量目标是或源自关联资源时应用规则。 过滤穿过子网边界的流量,影响子网中的所有资源。

选择正确的防火墙:场景与最佳实践

成功的 VPC 安全依赖于将 SG 和 NACL 作为一个分层方法(深度防御)一起使用。

何时优先考虑安全组

由于其有状态特性以及引用其他 SG 的能力,安全组应该是过滤网络访问的主要工具,这简化了应用程序配置。

  • 细粒度应用控制: 使用 SG 来精确定义特定应用程序所需的端口和协议(例如,只允许来自 Web 服务器 SG 到数据库 SG 的端口 3306 流量)。
  • 内部通信: 管理同一子网内或跨子网实例之间的流量安全(例如,确保负载均衡器可以与其目标组通信)。
  • 易于管理: 由于它们是有状态的,SG 需要比使用 NACL 管理临时端口更少的规则,且不易出错。

何时实施网络 ACL

NACL 最适合用于设置广泛的网络范围边界和分段策略。

  • 广泛拒绝策略: 使用明确的 DENY 规则(规则 #100)来阻止整个子网中特定、恶意的 IP 地址或 IP 范围,甚至在流量到达实例之前就进行拦截。
  • 子网分段: 在架构的不同层级之间强制执行严格的边界(例如,确保数据库子网 NACL 明确拒绝来自互联网的所有入站流量,无论 SG 如何配置)。
  • 合规性要求: 某些合规性标准可能要求进行子网级别的过滤,这使得 NACL 至关重要。
  • 无状态协议过滤: 如果需要过滤 SG 无法有效独立管理的无状态协议(尽管对于标准的 TCP/UDP 流量这种情况很少见),则需要 NACL。

深度防御方法

在典型的、设计良好的 VPC 中,流量必须同时通过 NACL 和安全组。如果任一安全控制拒绝了流量,数据包将被丢弃。

  1. 入站流: 流量进入子网 -> NACL 检查规则 -> 流量到达实例 ENI -> 安全组检查规则 -> 流量到达应用程序。
  2. 出站流: 应用程序生成响应 -> 安全组(状态检查通过)-> 流量离开实例 ENI -> NACL 检查规则 -> 流量离开子网。

通过利用 NACL 进行粗略分段和拒绝规则,以及利用 SG 进行精确、有状态的应用程序级别权限,您可以最大程度地提高安全有效性,同时保持配置的简便性。

结论

安全组和网络 ACL 不能互换;它们是旨在保护 AWS VPC 不同层的互补工具。安全组在实例级别提供操作性、面向应用的安全性,通过有状态性优先考虑简便性。网络 ACL 在子网级别提供了一个强大的、强制性的屏障,提供明确的拒绝功能,并保护网络边界。掌握它们在范围和状态性上的差异,可确保您设计的 VPC 架构不仅功能正常,而且能够抵御未经授权的网络访问。