亚马逊AWS官方博客
使用 FortiGate 和 FortiWeb 为分布式负载提供纵深防御
1 方案概述
作为安全威胁综合防御场景里的最佳实践之一,本案使用的分布式部署架构,通过对入/出站流量的南北、东西静态路径的详尽分析,展现该方案的灵活性、适用性。
2 适配场景
- 支持多可用区部署。灵活适配单可用区、双可用区和三个可用区的不同业务需求;
- 解决方案符合并支持“信息安全技术:网络安全等级保护基本要求”(GB/T 22239-2019)(等保);
- 支持 FortiGate-VM 防火墙、FortiWeb-VM 应用防火墙的灵活部署。可两者联合组网,也可每种产品独立提供解决方案。
3 方案特点
- 前置防御:FortiGate-VM 防火墙 + AWS Gateway Load Balancer(GWLB),在流量入站时,进入 VPC 的第一时间进行南北向安全检查;
- 分层防御:FortiGate-VM 作为出口防火墙,应对入侵检测、恶意软件/病毒等安全威胁;FortiWeb-VM 作为 WEB 应用防火墙,提供全面的关键业务防护;
- 重点防御:FortiWeb-VM 应用防火墙拥有机器学习引擎,能够防御 OWASP Top10 攻击、机器人威胁,提供 API 防护,可以灵活定制、适配应用场景;
- 南北防护:入站业务流量通过边缘关联拦截进入防火墙做流量清洗,出站返回流量、出站实例流量通过 VPC 路由表引流至防火墙做安全检查;
- 东西检查:无论是同 VPC,还是同账号下的不同 VPC,可以按实际业务要求,分别采用 Transit Gateway(TGW)或者自定义路由引流至防火墙做流量检查;
- 架构解耦:在 VPC-Connect + VPC-Security 的解决方案中,将 FortiGate-VM 防火墙分离为独立的 VPC,可以灵活的 Scale-In/Out;FortiWeb-VM 应用防火墙也可以按需要解耦,独立部署;VPC-Connect 可以承担流量入站、出站,从而使业务 VPC 无需暴露在公网。
4 方案架构示意图
5 方案资源规划
- VPC Connect – Subnets
名称 | CIDR | 说明 |
subnet-natgw-az1 | 172.25.1.0/24 | 部署有 AZ1 的 NAT Gateway (natgw-az1),用于本方案中的 AZ1 实例的出站 |
subnet-natgw-az2 | 172.25.2.0/24 | 部署有 AZ2 的 NAT Gateway (natgw-az2),用于本方案中的 AZ2 实例的出站 |
subnet-public-az1 | 172.25.11.0/24 | 部署有 nlb-public 在 AZ1 的弹性网卡 eni-nlb-az1,公网 IP 为 161.189.90.30,对应 VPC 的内网 AZ1 的 IP 为 172.25.11.23 |
subnet-public-az2 | 172.25.21.0/24 | 部署有 nlb-public 在 AZ2 的弹性网卡 eni-nlb-az2,公网 IP 为 43.192.17.4,对应 VPC 的内网 AZ2 的 IP 为 172.25.21.220 |
subnet-gwlbe-az1 | CIDR 无须展示,请自行定义 | 部署有 GWLB 在 AZ1 的 Endpoint,对应的弹性网卡为 gwlbe-hub-az1 |
subnet-gwlbe-az2 | 部署有 GWLB 在 AZ2 的 Endpoint,对应的弹性网卡为 gwlbe-hub-az2 | |
subnet-tgw-az1 | CIDR 无须展示,请自行定义 | Transit Gateway,即 TGW 在 AZ1 的 Landing Subnet,部署有 TGW 在 VPC Connect 的 landing 弹性网卡 eni-tgw-hub-landing-az1 |
subnet-tgw-az2 | Transit Gateway,即 TGW 在 AZ2 的 Landing Subnet,部署有 TGW 在 VPC Connect 的 landing 弹性网卡 eni-tgw-hub-landing-az2 |
- VPC Connect – 路由表
名称 | 关联的 SUBNETs | 说明 |
VPC Edge Association | N/A | 控制 VPC Connect 的入站路由,即当有目标是 natgw-az1 (172.25.1.0/24)、nagw-az2 (172.25.2.0/24)、nlb-public-az1 (172.25.11.0/24)、nlb-public-az2 (172.25.21.0/24)的入站流量时,流量会被转发到对应 AZ 的 GWLB Endpoint (gwlbe-az*) |
rtb-natgw-az1 | subnet-natgw-az1 | 控制 subnet-natgw 的出站路由表 |
rtb-natgw-az2 | subnet-natgw-az2 | |
rtb-public-az1 | subnet-public-az1 | 控制 subnet-public 的出站路由表,subnet-public 部署有 AWS NLB |
rtb-public-az2 | subnet-public-az2 | |
rtb-gwlbe | subnet-gwlbe-az1 subnet-gwlbe-az2 |
控制 GWLB endpoint 的出站路由表 |
rtb-tgw-az1 | subnet-tgw-az1 | 控制 TGW landing 弹性网卡的出站路由表 |
rtb-tgw-az2 | subnet-tgw-az2 |
- VPC Security – Subnets
名称 | CIDR | 说明 |
subnet-mgmt-az1 | CIDR 无须展示,请自行定义 | 部署有 FortiGate-VM 的 port1 网卡,用于 FortiGate 的许可激活、特征库更新等,仅有管理流量,不承载业务流量 |
subnet-mgmt-az2 | ||
subnet-gwlb-az1 | CIDR 无须展示,请自行定义 | 部署有 FortiGate-VM 的 port2 网卡,用于通过 GENEVE 协议与 AWS 的 GWLB 连接;同时图 1 中的 GWLB 也部署并关联这两个 subnets |
subnet-gwlb-az2 |
- VPC Security – 路由表
名称 | 关联的 SUBNETs | 说明 |
rtb-fgt-mgmt | subnet-mgmt-az1 subnet-mgmt-az2 |
FortiGate-VM 的 port1 作为 out-of-band 管理端口,在本方案中,可以绑定弹性 IP,默认路由指向 igw; FortiGate-VM 的 port2 使用的是 VPC Security 的主路由表,隐式关联 port2 所在的 subnets,无需指定额外的路由。 |
- VPC Spoke1 & VPC Spoke2 – Subnets
名称 | CIDR | 说明 |
subnet-spoke1-private-az1 | CIDR 无须展示,请自行定义 | 在本文的 DEMO 方案中部署有 FortiWeb-VM,每个可用区一台 VM; 同时部署有 TGW 在 VPC Spoke1 的 Landing 弹性网卡,每个可用区一个 |
subnet-spoke1-private-az2 | ||
subnet-spoke2-private-az1 | CIDR 无须展示,请自行定义 | 在本文的 DEMO 方案中部署有模拟 WEB 应用的 EC2 实例,每个可用区一台 VM; 实际生产环境中,WEB 应用实例可以与 FortiWeb-VM 一同部署在同一个 VPC,如 VPC Spoke1 中,而 Spoke2 也可以用来部署数据库实例等; 同时部署有 TGW 在 VPC Spoke2 的 Landing 弹性网卡,每个可用区一个 |
subnet-spoke2-private-az2 |
- VPC Spoke1 & VPC Spoke2 – 路由表
名称 | 关联的 SUBNETs | 说明 |
rtb-spoke1-private | subnet-spoke1-private-az1 subnet-spoke1-private-az2 |
控制 VPC Spoke1 和 VPC Spoke2 中实例的出站路由表,本文的 DEMO 方案中,该路由表的默认路由均指向 TGW |
rtb-spoke2-private | subnet-spoke2-private-az1 subnet-spoke2-private-az2 |
- TGW – 路由表
名称 | 关联的 VPC | 说明 |
tgw-rtb-vpc-connect | VPC Connect | VPC Connect 与 TGW 关联的路由表,用于转发从 VPC Connect 的 TGW Landing 路由表过来的流量 |
tgw-rtb-vpc-spoke | VPC Spoke1 VPC Spoke2 |
VPC Spoke1,VPC Spoke2 与 TGW 关联的路由表,用于转发从这两个 VPC 的 TGW Landing 路由表过来的流量 |
6 方案部署说明
- 首先创建名为 nlb-public 的 Load Balancer,其 type 为 network,而非 application,因为方案中使用了 FortiWeb-VM,即 Fortinet 的 WAF 产品,所以负载均衡选择了 NLB。
- 根据方案架构示意图和方案资源规划,创建 VPC 并按照说明完成相关配置,VPC 组成、子网(subnet)组成、VPC 路由表以及 TGW 路由表的功能如下:
1. VPC Connect (172.25.0.0/16)
此 VPC 内通常不部署 EC2 实例,或者可以将部署在 VPC Spoke1 中的 WAF 实例 FortiWeb,前移至此 VPC,挂载在 NLB 的目标组(Target Group)中;
NAT 网关:用于整个方案中其它 VPC 的 Internet 出站服务
NLB:提供负载均衡服务
GWLB Endpoint:部署在 VPC Security 的 GWLB 在此 VPC 的Service Endpoint
TGW Landing:Transit Gateway(TGW)在此 VPC 的 Landing 弹性网卡
2. VPC Security (192.168.0.0/16)
此 VPC 内部署有 FortiGate-VM;
通常是分配两个弹性网卡,port1 和 port2。
其中 port1 用于管理,绑定弹性 IP;port2 用于流量检查,通过 GENEVE 隧道与 GWLB 连接。
3. VPC Spoke1 (10.10.0.0/16) 和 VPC Spoke2 (10.20.0.0/16)
上述两个 VPC 内部署业务实例,如作为 WAF 的 FortiWeb,以及测试用的 WEB 服务实例。
7 方案效果展示
7.1 用户访问应用的场景
我们把作为 WAF 的 FortiWeb 部署在 VPC Spoke1 中,将应用实例放在了 VPC Spoke2 中,因此用户访问应用的流量路径是从 Spoke1 的 FortiWeb 到挂载在 Spoke2 的真实 WEB 服务器实例的过程,既有应用入站的南北流量安全检查的过程,也有两个 VPC 间的东西流量安全检查的过程,如下:
7.1.1 应用入站的流量路径:南北流量安全检查
1. 用户访问 NLB 的公网 DNS,如下图所示的 nlb-public-xxxxx.elb.cn-northwest-1.amazonaws.com.cn,IP 解析为 161.189.90.30 和 43.192.17.4,Internet Gateway (IGW)将上述两个公网 IP 映射为 VPC Connect 的内网 IP 172.25.11.23 和 172.25.21.220
2. 通过 IGW 后的流量,目标地址是 NLB 在不同可用区的内网地址,即 172.25.11.23 或 172.25.21.220。查询 VPC Connect 的边缘关联(Edge Association)路由表,命中用户定义路由(UDR,User Defined Route)172.25.11.0/24 或 172.25.21.0/24,将前往 NLB 的流量拦截并转发至 GWLB Endpoint(gwlbe-hub)
3. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做南北流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe
4. 返回 subnet-gwlbe 的流量,此时目标地址不变,仍然是 172.25.11.23 或 172.25.21.220。查询路由表 rtb-gwlbe,命中 VPC 的 Local 路由,VPC 会将流量从 gwlbe-hub 转发至 NLB 对应可用区的弹性网卡 eni-nlb
5. NLB 根据监听的端口,将流量转发至目标组(Target Group)的实例。本文方案中,NLB 的 Target Group 挂载了 FortiWeb,CIDR 为 10.10.0.0/16,位于 VPC Spoke1 的多个可用区中。此时,经过 NLB 的处理,目标地址变为 FortiWeb 的内网 IP。查询路由表 rtb-public,命中 UDR-10.10.0.0/16,转发至 tgw
6. VPC Connect 关联了 TGW 路由表 tgw-rtb-vpc-connect,流量命中 TGW 路由表的 UDR-10.10.0.0/16 (spoke1),转发至 VPC Spoke1
7. 流量到达 VPC Spoke1 中的 TGW Landing 弹性网卡 eni-tgw-spoke1-landing
8. 查询 eni-tgw-spoke1-landing 所在 subnet-spoke1-private 的路由表 rtb-spoke1-private,命中 VPC 的 Local 路由,到达 FortiWeb 实例
7.1.2 FortiWeb 到真实 Web 服务器的流量路径:东西流量安全检查
1. 流量经过 FortiWeb 的内容路由(content routing),转发至真实 WEB 服务器实例,目标地址为 Spoke2 的 CIDR(10.20.0.0/16)。查询 subnet-spoke1-private 关联的路由表 rtb-spoke1-private,命中 UDR 默认路由,转发至 tgw
2. 流量从 TGW 在 VPC Spoke1 的弹性网卡 eni-tgw-spoke1-landing 进入 TGW
3. 查询 VPC Spoke1 关联 TGW 的路由表 tgw-rtb-vpc-spoke,命中 TGW 的 UDR 默认路由,转发至 VPC Connect
4. 流量到达 TGW 在 VPC Connect 的弹性网卡 eni-tgw-hub-landing
5. 查询 eni-tgw-hub-landing 所在的子网 subnet-tgw 关联的路由表 rtb-tgw,命中 UDR-10.20.0.0/16 (spoke2),转发至 gwlbe-hub
6. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做东西流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe
7. 返回 subnet-gwlbe 的流量,目标地址不变,仍然是 WEB 服务器实例所在的 Spoke2 的 10.20.0.0/16。查询路由表 rtb-gwlbe,命中 UDR-10.20.0.0/16,转发至 tgw
8. VPC Connect 关联了 TGW 路由表 tgw-rtb-vpc-connect,流量命中 TGW 路由表的 UDR-10.20.0.0/16,转发至 VPC Spoke2
9. 流量到达 VPC Spoke2 中的 TGW Landing 弹性网卡 eni-tgw-spoke2-landing
10. 查询 eni-tgw-spoke2-landing 所在 subnet-spoke2-private 的路由表 rtb-spoke2-private,命中 VPC 的 Local 路由,到达真实 WEB 服务器
7.1.3 真实 Web 服务器到 FortiWeb 的流量路径:东西流量安全检查
1. 返回流量的目标为 FortiWeb,目标 IP 为 FortiWeb 所在的 VPC Spoke1 的 CIDR(10.10.0.0/16),命中 rtb-spoke2-private 的 UDR 默认路由,转发至 tgw
2. 查询 VPC Spoke2 关联 TGW 的路由表 tgw-rtb-vpc-spoke,命中 TGW 的 UDR 默认路由,转发至 VPC Connect
3. 流量到达 TGW 在 VPC Connect 的弹性网卡 eni-tgw-hub-landing
4. 查询 eni-tgw-hub-landing 所在的子网 subnet-tgw 关联的路由表 rtb-tgw,命中 UDR-10.10.0.0/16 (spoke1),转发至 gwlbe-hub
5. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做东西流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe
6. 返回 subnet-gwlbe 的流量,目标地址不变,仍然是 FortiWeb 实例所在的 Spoke1 的 10.10.0.0/16。查询路由表 rtb-gwlbe,命中 UDR-10.10.0.0/16,转发至tgw
7. VPC Connect 关联了 TGW 路由表 tgw-rtb-vpc-connect,流量命中 TGW 路由表的 UDR-10.10.0.0/16,转发至 VPC Spoke1
8. 流量到达 VPC Spoke1 中的 TGW Landing 弹性网卡 eni-tgw-spoke1-landing
9. 查询 eni-tgw-spoke1-landing 所在 subnet-spoke1-private 的路由表 rtb-spoke1-private,命中 VPC 的 Local 路由,返回 FortiWeb
7.1.4 应用出站的流量路径:南北流量安全检查
1. 流量经过 FortiWeb 处理,准备返回 NLB,目标为 NLB 弹性网卡所在的 VPC Connect 子网 subnet-public 的 CIDR(172.25.11.0/24 或 172.25.21.0/24)。查询 subnet-spoke1-private 关联的路由表 rtb-spoke1-private,命中 UDR 默认路由,转发至 tgw
2. 流量从 TGW 在 VPC Spoke1 的弹性网卡 eni-tgw-spoke1-landing 进入 TGW
3. 查询 VPC Spoke1 关联 TGW 的路由表 tgw-rtb-vpc-spoke,命中 TGW 的 UDR 默认路由,转发至 VPC Connect
4. 流量到达 TGW 在 VPC Connect 的弹性网卡 eni-tgw-hub-landing
5. 查询 eni-tgw-hub-landing 所在的子网 subnet-tgw 关联的路由表 rtb-tgw,命 VPC 的 Local 路由
6. 流量从 subnet-tgw 发送至 subnet-public,到达 NLB
7. 经过 NLB 的处理,从 FortiWeb 返回的流量,目标地址变为访问 nlb-public-xxxxx.elb.cn-northwest-1.amazonaws.com.cn 时的 Client IP,查询路由表 rtb-public,命中 UDR 默认路由,转发至 gwlbe-hub
8. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做出站的南北流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe
9. 返回 subnet-gwlbe 的流量,目标地址不变,仍然是访问 NLB 的 Client IP。查询路由表 rtb-gwlbe,命中 UDR 默认路由,从 IGW 出站。
7.2 EC2 访问互联网的场景
VPC Spoke1和VPC Spoke2内的EC2实例需要访问Internet资源,如FortiWeb访问FortiGuard更新特征库、WEB服务器升级更新系统补丁等。
7.2.1 服务器出站的流量路径:南北流量安全检查
1. VPC Spoke2 内的 web-srv 实例访问 Internet 资源,命中路由表 rtb-spoke2-private 中的 UDR 默认路由,转发至 tgw
2. 查询 VPC Spoke2 关联 TGW 的路由表 tgw-rtb-vpc-spoke,命中 TGW 的 UDR 默认路由,转发至 VPC Connect
3. 流量到达 TGW 在 VPC Connect 的弹性网卡 eni-tgw-hub-landing
4. 查询 eni-tgw-hub-landing 所在的子网 subnet-tgw 关联的路由表 rtb-tgw,命中 UDR 默认路由,转发至 NAT 网关(natgw)
5. 流量从 subnet-tgw 发送至 subnet-natgw,到达 NAT 网关
6. 查询 subnet-natgw 关联的路由表 rtb-natgw,命中 UDR 默认路由,转发至 gwlbe-hub
7. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做南北流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe
8. 返回 subnet-gwlbe 的流量,目标仍然是 Internet 资源。查询路由表 rtb-gwlbe,命中 UDR 默认路由,从 IGW 出站
7.2.2 服务器出站流量的返回路径:南北流量安全检查
1. 上一步 8 的返回流量到达 IGW
2. 通过 IGW 后的流量,此时目标地址是部署在不同可用区的 NAT 网关的内网地址,即 CIDR 172.25.1.0/24 或 172.25.2.0/24 范围内。查询 VPC Connect 的边缘关联(Edge Association)路由表,命中 UDR 中 172.25.1.0/24 或 172.25.2.0/24,将前往 NAT 网关的流量拦截并转发至 GWLB Endpoint(gwlbe-hub)
3. 流量从 GWLB Endpoint 进入 GWLB,通过 GENEVE 隧道进入 FortiGate 防火墙,做南北流量的安全检查,并返回 GWLB Endpoint 所在的 subnet-gwlbe
4. 返回 subnet-gwlbe 的流量,目标仍然是对应可用区的 NAT 网关(natgw)。查询路由表 rtb-gwlbe,命中 VPC 的 Local 路由,转发至 subnet-natgw 中的 NAT 网关
5. 流量经过 NAT 网关处理,目标变为 VPC Spoke2 的 web-srv 内网地址,即在 10.20.0.0/16 中。查询路由表 rtb-natgw,命中 UDR-10.20.0.0/16,转发至 TGW
6. VPC Connect 关联了 TGW 路由表 tgw-rtb-vpc-connect,流量命中 TGW 路由表的 UDR-10.20.0.0/16,转发至 VPC Spoke2
7. 流量到达 VPC Spoke2 中的 TGW Landing 弹性网卡 eni-tgw-spoke2-landing
8. 查询 eni-tgw-spoke2-landing 所在 subnet-spoke2-private 的路由表 rtb-spoke2-private,命中 VPC 的 Local 路由
9. 流量返回 web-srv 实例,完成 Internet 访问。
您可以在亚马逊云科技 Marketplace 中订阅并采购本方案中的 Fortinet 相关产品:
FortiGate:
BYOL(Graviton):FortiGate Next-Generation Firewall (ARM64/Graviton)
BYOL:FortiGate Next-Generation Firewall (BYOL)
FortiWeb:
FortiWeb Web Application Firewall WAF VM (BYOL)