计划和实现网络安全组 (NSG) 和应用程序安全组 (ASG)
可以使用 Azure 网络安全组来筛选 Azure 虚拟网络中 Azure 资源之间的网络流量。 网络安全组包含安全规则,这些规则可允许或拒绝多种 Azure 资源的入站和出站网络流量。 对于每个规则,你可以指定源和目标、端口和协议。
网络安全组 (NSG)
安全规则
一个网络安全组包含不超过 Azure 订阅限制的任意数量的规则。 每个规则指定以下属性:
属性 | 解释 |
---|---|
名称 | 网络安全组中的唯一名称。 该名称最长可为 80 个字符。 它必须以单词字符开头,并以单词字符或“_”结尾。 名称可能包含单词字符或“.”、“-”、“_”。 |
优先级 | 介于 100 和 4096 之间的数字。 规则按优先顺序进行处理。先处理编号较小的规则,因为编号越小,优先级越高。 一旦流量与某个规则匹配,处理即会停止。 因此,不会处理优先级较低(编号较大)的、其属性与高优先级规则相同的所有规则。 Azure 默认安全规则的编号最高但优先级最低,这是为了确保始终首先处理自定义规则。 |
源或目标 | 可以是任何值,也可以是单个 IP 地址、无类别域际路由 (CIDR) 块(例如 10.0.0.0/24)、服务标记或应用程序安全组。 如果为 Azure 资源指定一个地址,请指定分配给该资源的专用 IP 地址。 在 Azure 针对入站流量将公共 IP 地址转换为专用 IP 地址后,系统会处理网络安全组,然后由 Azure 针对出站流量将专用 IP 地址转换为公共 IP 地址。 指定范围、服务标记或应用程序安全组时,需要的安全规则较少。 在一个规则中指定多个单独的 IP 地址和范围(不能指定多个服务标记或应用程序组)的功能称为扩充式安全规则。 只能在通过资源管理器部署模型创建的网络安全组中创建扩充式安全规则。 在通过经典部署模型创建的网络安全组中,不能指定多个 IP 地址和 IP 地址范围。 |
协议 | TCP、UDP、ICMP、ESP、AH 或 任何协议。 目前无法通过 Azure 门户使用 ESP 和 AH 协议,但可通过 Azure 资源管理器模板使用。 |
方向 | 该规则是应用到入站还是出站流量。 |
端口范围 | 可以指定单个端口或端口范围。 例如,可以指定 80 或 10000-10005。 指定范围可以减少创建的安全规则数。 只能在通过资源管理器部署模型创建的网络安全组中创建扩充式安全规则。 在通过经典部署模型创建的网络安全组中,不能在同一个安全规则中指定多个端口或端口范围。 |
操作 | 允许或拒绝 |
根据五元组(1. 源、2. 源端口、3. 目标、4. 目标端口、5. 协议)信息评估并应用安全规则。 不能创建两个具有相同优先级和方向的安全规则。 将为现有连接创建流记录。 是允许还是拒绝通信取决于流记录的连接状态。 流记录允许网络安全组有状态。 例如,如果针对通过端口 80 访问的任何地址指定了出站安全规则,则不需要指定入站安全规则来响应出站流量。 如果通信是从外部发起的,则只需指定入站安全规则。 反之亦然。 如果允许通过某个端口发送入站流量,则不需要指定出站安全规则来响应通过该端口发送的流量。
删除允许连接的安全规则时,现有连接不一定会中断。 修改网络安全组规则只会影响新连接。 创建新规则或在网络安全组中更新现有规则时,该规则将仅适用于新连接。 现有连接不会使用新规则重新评估。
网络安全组如何筛选网络流量
可以将资源从多个 Azure 服务部署到一个 Azure 虚拟网络中。 可将零个或一个网络安全组与虚拟机中的每个虚拟网络子网和网络接口相关联。 可将同一网络安全组关联到选定的任意数量的子网和网络接口。 下图说明了如何部署网络安全组以允许通过 TCP 端口 80 向 Internet 或从 Internet 传输网络流量的不同应用场景:
请参考上图及以下文本,了解 Azure 如何处理网络安全组的入站和出站规则:
入站流量
对于入站流量,Azure 先处理与某个子网相关联的网络安全组(如果有)中的规则,然后处理与网络接口相关联的网络安全组(如果有)中的规则。 此过程也包括子网内流量。
- VM1:系统会处理 NSG1 中的安全规则,因为它与 Subnet 1 关联,而 VM1 位于 Subnet 1 中。 除非已创建允许端口 80 入站的规则,否则 DenyAllInbound默认安全规则会拒绝流量。 NSG2 不会评估流量,因为它与网络接口相关联。 如果NSG1在其安全规则中允许端口 80, NSG2会处理流量。 若要允许从端口 80 到虚拟机的流量,NSG1 和 NSG2 必须指定一条规则来允许从 Internet 到端口 80 的流量。
- VM2:系统会处理 NSG1 中的规则,因为 VM2 也在 Subnet 1 中。 VM2 没有关联到其网络接口的网络安全组,因此会接收 NSG1 所允许的所有流量,或者会受到 NSG1 所拒绝的所有流量拒绝。 当网络安全组关联到子网时,对于同一子网中的所有资源,流量要么被允许,要么被拒绝。
- VM3:由于没有网络安全组关联到 Subnet 2,系统允许流量进入子网并由 NSG2 处理,因为 NSG2 关联到已附加到 VM3 的网络接口。
- VM4:允许流量进入 VM4,因为网络安全组未关联到 Subnet 3 或虚拟机中的网络接口。 如果没有关联的网络安全组,则允许所有网络流量通过子网和网络接口。
出站流量
对于出站流量,Azure 先处理与某个网络接口相关联的网络安全组(如果有)中的规则,然后处理与子网相关联的网络安全组(如果有)中的规则。 此过程也包括子网内流量。
- VM1:系统会处理 NSG2 中的安全规则。 除非创建安全规则以拒绝从端口 80 到 Internet 的出站流量,否则NSG1和NSG2中的AllowInternetOutbound默认安全规则都会允许流量。 如果NSG2在其安全规则中拒绝端口 80,则会拒绝流量,并且NSG1永远不会对其进行评估。 若要拒绝从虚拟机到端口 80 的流量,则两个网络安全组或其中的一个必须有一条规则来拒绝从端口 80 到 Internet 的流量。
- VM2:所有流量都会通过网络接口发送到子网,因为附加到 VM2 的网络接口没有关联的网络安全组。 系统会处理 NSG1 中的规则。
- VM3:如果 NSG2 在其安全规则中拒绝端口 80,则会拒绝流量。 如果 NSG2 不拒绝端口 80,NSG2 中的 AllowInternetOutbound 默认安全规则会允许流量,因为没有与 Subnet 2 关联的网络安全组。
- VM4:允许来自 VM4 的所有网络流量,因为网络安全组未关联到已附加至虚拟机的网络接口或 Subnet 3。
子网内部流量
需要注意的是,与子网关联的 NSG 中的安全规则可能会影响子网中 VM 之间的连接。 默认情况下,同一子网中的虚拟机可以基于默认 NSG 规则进行通信,该 NSG 规则允许子网内流量。 如果将规则添加到拒绝所有入站和出站流量的 NSG1,VM1 和 VM2 将无法再相互通信。
可以通过查看网络接口的有效安全规则,轻松查看已应用到网络接口的聚合规则。 还可以使用 Azure 网络观察程序中的 IP 流验证功能来确定是否允许发往或发自网络接口的通信。 可以使用 IP 流验证以确定是允许还是拒绝通信。 此外,使用 IP 流验证以显示负责允许或拒绝流量的网络安全规则的标识。
网络安全组关联到子网或关联到部署在经典部署模型中的虚拟机和云服务,以及关联到资源管理器部署模型中的子网或网络接口。
建议将网络安全组关联到子网或网络接口,但不要二者都关联,除非你有特定的理由来这样做。 由于关联到子网的网络安全组中的规则可能与关联到网络接口的网络安全组中的规则冲突,因此可能会出现意外的必须进行故障排除的通信问题。
应用程序安全组 (ASG)
使用应用程序安全组可将网络安全性配置为应用程序结构的固有扩展,从而可以基于这些组将虚拟机分组以及定义网络安全策略。 可以大量重复使用安全策略,而无需手动维护显式 IP 地址。 平台会处理显式 IP 地址和多个规则集存在的复杂性,让你专注于业务逻辑。 若要更好地理解应用程序安全组,请考虑以下示例:
在上图中,NIC1 和 NIC2 是 AsgWeb 应用程序安全组的成员。 NIC3 是 AsgLogic 应用程序安全组的成员。 NIC4 是 AsgDb 应用程序安全组的成员。 虽然此示例中的每个网络接口 (NIC) 只是一个网络安全组的成员,但一个网络接口可以是多个应用程序安全组的成员,具体取决于 Azure 限制。 这些网络接口都没有关联的网络安全组。 NSG1 关联到两个子网,包含以下规则:
Allow-HTTP-Inbound-Internet
若要让流量从 Internet 流到 Web 服务器,此规则是必需的。 由于 DenyAllInbound 默认安全规则拒绝了来自 Internet 的入站流量,因此 AsgLogic 或 AsgDb 应用程序安全组无需使用额外的规则。
Priority | Source | 源端口 | 目标 | 目标端口 | 协议 | Access |
---|---|---|---|---|---|---|
100 | Internet | * | AsgWeb | 80 | TCP | 允许 |
Deny-Database-All
由于 AllowVNetInBound 默认安全规则允许在同一虚拟网络中的资源之间进行的所有通信,因此需要使用此规则来拒绝来自所有资源的流量。
Priority | Source | 源端口 | 目标 | 目标端口 | 协议 | Access |
---|---|---|---|---|---|---|
120 | * | * | AsgDb | 1433 | 任意 | 拒绝 |
Allow-Database-BusinessLogic
此规则允许从 AsgLogic 应用程序安全组到 AsgDb 应用程序安全组的流量。 此规则的优先级高于 Deny-Database-All 规则的优先级。 因此,此规则在 Deny-Database-All 规则之前处理,这样系统就会允许来自 AsgLogic 应用程序安全组的流量,而阻止所有其他流量。
Priority | Source | 源端口 | 目标 | 目标端口 | 协议 | Access |
---|---|---|---|---|---|---|
110 | AsgLogic | * | AsgDb | 1433 | TCP | Allow |
作为应用程序安全组成员的网络接口会应用将其指定为源或目标的规则。 规则不会影响其他网络接口。 如果网络接口不是应用程序安全组的成员,则即时网络安全组与子网相关联,规则也不会应用于网络接口。
应用程序安全组具有以下约束:
可以在一个订阅中配置的应用程序安全组存在数量限制,并且存在与应用程序安全组相关的其他限制。
分配给应用程序安全组的所有网络接口都必须存在于分配给应用程序安全组的第一个网络接口所在的虚拟网络中。 例如,如果分配给名为 AsgWeb 的应用程序安全组的第一个网络接口位于名为 VNet1 的虚拟网络中,则分配给 ASGWeb 的所有后续网络接口都必须存在于 VNet1 中。 不能向同一应用程序安全组添加来自不同虚拟网络的网络接口。
如果在安全规则中将应用程序安全组指定为源和目标,则两个应用程序安全组中的网络接口必须存在于同一虚拟网络中。
- 例如,如果 AsgLogic 具有来自 VNet1 的网络接口,而 AsgDb 具有来自 VNet2 的网络接口。 在这种情况下,无法在规则中将 AsgLogic 分配为源,也无法将 AsgDb 分配为目标。 源和目标应用程序安全组中的所有网络接口需存在于同一虚拟网络中。
为了尽量减少所需的安全规则数和需要更改规则的情况,请尽可能使用服务标记或应用程序安全组来规划所需的应用程序安全组并创建规则,而不要使用单个 IP 地址或 IP 地址范围。