- 方案概述:
AWS-Fortinet关键应用联合防御解决方案通过整合AWS资源和Fortinet产品的优势,可以为客户量身打造既有针对性又满足适用性的个性化安全防护解决方案。作为安全威胁综合防御场景里的最佳实践之一,本方案使用集中式部署架构,通过自动化部署快速完成整套AWS云上基础设施搭建以及Fortinet产品开箱即用,展示在生产流量通过TLS加密的背景下FortiGate-VM是如何有效承担病毒威胁防御任务。
- 适配场景:
- 支持多可用区部署。灵活适配单可用区、双可用区和三个可用区的不同业务需求;
- 解决方案符合并支持“信息安全技术:网络安全等级保护基本要求”(GB/T 22239-2019) (等保);
- 支持FortiGate-VM防火墙、FortiWeb-VM应用防火墙的灵活部署。可两者联合组网,也可每种产品独立提供解决方案。
- 方案特点:
- 前置防御:FortiGate-VM防火墙 + AWS Gateway Load Balancer (GWLB),在流量入站时,进入VPC的第一时间进行南北向安全检查;
- 分层防御:FortiGate-VM作为出口防火墙,应对入侵检测、恶意软件/病毒等安全威胁;FortiWeb-VM作为WEB应用防火墙,提供全面的关键业务防护;
- 重点防御:FortiWeb-VM应用防火墙拥有机器学习引擎,能够防御OWASP Top10攻击、机器人威胁,提供API防护,可以灵活定制、适配应用场景;
- 南北防护:入站业务流量通过边缘关联拦截进入防火墙做流量清洗,出站返回流量、出站实例流量通过VPC路由表引流至防火墙做安全检查;
- 东西检查:无论是同VPC,还是同账号下的不同VPC,可以按实际业务要求,分别采用Transit Gateway (TGW) 或者自定义路由引流至防火墙做流量检查;
- 紧密聚合:FortiGate-VM防火墙、FortiWeb-VM应用防火墙共同部署在业务VPC中,使业务流量的调度更加紧凑
- 自动化:通过Terraform自动化部署脚本,可以轻松快速的实现按需配置整套AWS云上基础设施以及Fortinet产品的开箱即用。
- 方案架构示意图:
- 方案资源规划:
- VPC Prod SecOps的子网概述
名称 | CIDR | 说明 |
subnet-natgw-az1 | 172.25.211.0/24 | 部署有AZ1的NAT Gateway (natgw-az1),用于本方案中的AZ1实例的出站 |
subnet-natgw-az2 | 172.25.212.0/24 | 部署有AZ2的NAT Gateway (natgw-az2),用于本方案中的AZ2实例的出站 |
subnet-nlb-public-az1 | 172.25.201.0/24 | 部署有nlb-public在AZ1的弹性网卡eni-nlb-az1 |
subnet-nlb-public-az2 | 172.25.202.0/24 | 部署有nlb-public在AZ2的弹性网卡eni-nlb-az2 |
subnet-gwlbe-az1 | CIDR无须展示,请自行定义 | 部署有GWLB在AZ1的Endpoint,对应的弹性网卡为gwlbe-hub-az1 |
subnet-gwlbe-az2 | 部署有GWLB在AZ2的Endpoint,对应的弹性网卡为gwlbe-hub-az2 | |
subnet-fgt-port1-az1 | CIDR无须展示,请自行定义 | 部署有FortiGate-VM的port1网卡,用于FortiGate的许可激活、特征库更新等,仅有管理流量,不承载业务流量。 |
subnet-fgt-port1-az2 | ||
subnet-fgt-port2-az1 | CIDR无须展示,请自行定义 | 部署有FortiGate-VM的port2网卡,用于通过GENEVE协议与AWS的GWLB连接;同时图1中的GWLB也部署并关联这两个subnets |
subnet-fgt-port2-az2 | ||
subnet-fwb-az1 | CIDR无须展示,请自行定义 | 部署有FortiWeb-VM |
subnet-fwb-az2 | ||
subnet-app-az1 | CIDR无须展示,请自行定义 | 部署有WEB服务器实例,以及DVWA靶场服务器 |
subnet-app-az2 | 部署有WEB服务器实例 | |
subnet-faz-az1 | CIDR无须展示,请自行定义 | 部署有Fortinet的日志分析产品FortiAnalyzer-VM |
- VPC Prod SecOps的路由表概述
名称 | 关联的SUBNETs | 说明 |
VPC Edge Association | N/A | 控制VPC Connect的入站路由,即当有目标是natgw-az1 (172.25.211.0/24)、nagw-az2 (172.25.212.0/24)、nlb-public-az1 (172.25.201.0/24)、nlb-public-az2 (172.25.202.0/24)的入站流量时,流量会被转发到对应AZ的GWLB Endpoint (gwlbe-az*) |
rtb-natgw-az1 | subnet-natgw-az1 | 控制subnet-natgw的出站路由表,默认路由指向gwlbe |
rtb-natgw-az2 | subnet-natgw-az2 | |
rtb-nlb-public-az1 | subnet-nlb-public-az1 | 控制subnet-nlb-public的出站路由表,subnet-nlb-public部署有AWS NLB,默认路由指向gwlbe |
rtb-nlb-public-az2 | subnet-nlb-public-az2 | |
rtb-gwlbe | subnet-gwlbe-az1 subnet-gwlbe-az2 | 控制GWLB endpoint的出站路由表,默认路由指向IGW |
rtb-nva-mgmt | subnet-fgt-port1-az1 subnet-fgt-port1-az2 subnet-fwb-az1 subnet-fwb-az2 subnet-faz-az1 | 控制网络虚拟设备(NVA)的出站路由表,FortiGate-VM防火墙、FortiWeb-VM应用防火墙、FortiAnalyzer-VM日志分析的EIP弹性公网IP均使用该路由表出站,默认路由指向IGW |
rtb-app-az1 | subnet-app-az1 | 控制应用服务实例的出站,默认路由指向各可用区的NAT网关(natgw) |
rtb-app-az2 | subnet-app-az2 |
- 方案部署说明:
- Terraform概述
可以通过Github Fortinet 中国区的仓库获取Fortinet 中国区工程师已经编写完成的Terraform自动化部署工程,解决方案对应的Terraform工程,在Github上terraform-fortinet-china/terraform-awschina/fgtvm-gwlb-with-fwb/的目录找到,如下图:
- 红色圈出的文件:表示将要部署的AWS的云上资源。文件名中的数字不代表Terraform部署的顺序,仅作为逻辑上梳理架构的提示。云上资源的部署顺序由Terraform代码和AWS共同决定。这些AWS的云上基础设施资源包括:VPC (可使用已有VPC)、子网、安全组、Internet网关(可使用已有IGW)、GWLB、Endpoint Service、VPC路由表。
- 蓝色圈出的文件:代表Terraform模块,感兴趣的朋友可以查看modules目录,观察到FortiGate-VM,FortiWeb-VM,NLB和用于测试的Ubuntu实例均实现了模块部署,不但方便对上述资源的大规模部署,也方便这部分代码移植到其它的工程项目中。
- 绿色圈出的文件:代表需要修改的部分,terraform.tfvars文件中包括了VPC和Subnet的CIDR,可用区信息,需要自定义的资源名称,Fortinet产品的管理信息等等。
-
- Terraform部署
- 初始化工程项目
确保进入fgtvm-gwlb-with-fbw工程目录后,再运行下列命令;
如果您已经按照Github Fortinet 中国区的仓库的说明指导完成了初始化,请忽略这一步。
terraform init |
- 修改terraform.tfvars以适配您的项目需求
ProjectName = "fgtvm-gwlb-with-fwb" | # 您的项目名称 |
CompanyName = "FTNT" | # 您的公司名称 |
enableNewVpcNgfw = true | # 是否新建VPC和Internet网关。如果false,请参照文件中的指导,在DryRun时传入ID |
enableNlbPreserveClientIp = true | # 是否开启NLB的保持ClientIP功能 该功能在本工程配置下,后续仅能通过CLI控制 |
enableDemoBastion = false | # 是否部署用于演示用途的堡垒机 (VNC) |
该堡垒机不支持GB/T 22239-2019 | |
regionName = "cn-northwest-1" | # 您项目部署的AWS Region |
# azList = ["a"] # azList = ["b"] # azList = ["c"] azList = ["a", "b"] # azList = ["a", "c"] # azList = ["b", "c"] # azList = ["a", "b", "c"] | # 您将要使用的可用区,以及可用区数量 选择单AZ,双AZ,三AZ,其余保持注释状态即可 |
vpcName = "VPC-NGFW" | # 您的VPC名称,当上方enableNewVpcNgfw为false时,仅需要修改VPC的CIDR,与您实际的CIDR保持一致即可 |
cidrVpcNgfw = "172.25.0.0/16" | |
cidrSubnetFgtPort1 | # cidrSubnetFgtPort1为FortiGate-VM防火墙Port1对应3个可用区的子网。如果仅有1个可用区,则实际仅第一组IP会生效。其它的子网以此类推。 |
cidrSubnetFgtPort2 | |
cidrSubnetFwbPort1 | |
cidrSubnetNlbPublic | |
cidrSubnetNatgwVpcNgfw | |
cidrSubnetGwlbeNgfw | |
cidrSubnetApp | |
cidrSubnetBastionVncAz1 | # 演示用VNC堡垒机的子网 |
cntFgtByol = 0 | # FortiGate-VM BYOL许可的部署数量 |
licenseFiles | # BYOL的许可文件,请copy到本目录下 |
cntFgtPayg = 1 | # FortiGate-VM PAYG的部署数量 |
instanceTypeFgtFixed = "c5.large" | # BYOL和PAGY实例的类型。对于BYOL许可,请确保许可vCPU数量与实例类型匹配 |
portFgtHttps = "8443" | # FortiGate-VM防火墙的GUI管理端口 |
versionFgt = "fgtvm70" | # FortiGate-VM防火墙部署的版本,可后续升级 |
cntFwbByol = 1 | # FortiWeb-VM应用防火墙的部署数量 |
instanceTypeFwbFixed = "m5.large" | # FortiWeb-VM应用防火墙的实例类型 |
portFwbHttps = "8443" | # FortiWeb-VM应用防火墙的GUI管理端口 |
portsNlb | # NLB的监听、业务、健康检查端口定义 |
versionUbuntu = "bionic1804" | # 测试Ubuntu实例的版本, 18.04, 20.04, 22.04 |
keynameUbuntu = "kpc_ubuntu" | # 测试Ubuntu实例的KeyPair名称 |
- DryRun
当您完成上步,即Terraform工程与您AWS环境的适配后,您就可以执行下面的命令,测试Terraform是否满足部署条件。
terraform plan -out=tfplan |
[注] 期间可能会弹出Warning或者Error,主要是由于镜像市场Marketplace订阅导致的,如上图,请点击进入FortiGate-VM的产品,选择订阅即可。
- 部署
如果上步的DryRun通过,您可以观察到terraform输出的FortiGate-VM登录信息以及业务NLB的访问URL,取决于您是否选择部署堡垒机,输出会有不同。
terraform apply tfplan |
-
- FortiGate 演示配置
我们选择Let’s Encrypt作为可信CA,为NLB和FortiGate-VM办法证书。下面我们一起配置FortiGate-VM防火墙,并使能Anti-Virus能力。
6.3.1 为NLB域名申请服务器证书
请SSH登录上章Terraform自动化部署在subnet-app中的Ubuntu web-srv,参考下列步骤操作:
- 初始化Let’s Encrypt证书申请环境
sudo snap install --classic certbot |
- 为NLB的域名申请服务器证书(请按您的场景,修改 ”${}” 中的内容)
sudo certbot certonly --manual --preferred-challenges http \ --email ${YOUR-EMAIL} \ -d ${YOUR-NLB.elb.cn-northwest-1.amazonaws.com.cn} |
- 由于无法使用DNS做preferred-challenges,我们可以利用Ubuntu web-srv做基于http的网站有效性验证,出现的提示,请参照下步操作
进入WEB服务器根目录,如:/usr/share/nginx/html
cd ${YOUR-WEB-ROOT-FOLDER} |
创建Let’s Encrypt 验证文件的目录
sudo mkdir -p .well-known/acme-challenge |
创建Let’s Encrypt 验证文件,填入验证内容,如上图所示
sudo bash -c "cat > ${[1]文件名称}<<EOF ${[2]文件内容} EOF" |
- 回车确认后,Let’s Encrypt会输出下图的结果,其中包括
服务器私钥:privkey.pem
服务器证书链(包含服务器证书):fullchain.pem
通过下列命令提取密钥及证书,”${}”中的内容参见下图红框
cd ~ |
sudo bash -c "cp ${服务器证书路径} ." |
sudo bash -c "cp ${服务器密钥路径} ." |
- 安装并配置aws-cli,参见AWS链接
- 使用aws-cli上传证书到AWS IAM服务,命令参考如下:
cd ~ |
aws iam upload-server-certificate \ --server-certificate-name ${YOUR-CERT-NAME} \ --certificate-body file://fullchain.pem \ --private-key file://privkey.pem \ --tags '{"Key": "KeyName", "Value": "${YOUR-CERT-NAME}"}' |
6.3.2 NLB启动HTTPS监听
- 返回AWS控制台,导航至Load Balancer,找到Terraform创建的nlb-public,选择“Add listener”,进入下图界面
- Protocol选择TLS,Port为443
- 转发 (Forward to) 至 Terraform创建的HTTP目标组
- Security Policy如图选择一致即可
- SSL/TLS证书,选择从IAM导入,找到上节通过aws-cli上传的证书名称,即${YOUR-CERT-NAME}
- 点击“添加”,完成TLS监听的配置
- 创建完成后,如下图所示
6.3.3 为FortiGate-VM申请服务器证书
FortiGate-VM同样需要向Let’s Encrypt申请服务器证书。
- 生成CSR (Certificate Sign Request),如下图所示:
- 选择”FG-traffic” VDOM
- 导航至System –> Certificates
- 选择“生成CSR (Generate CSR)”
- 填写CSR,如下图所示:
- Subject Information中ID Type为Domain Name,填入nlb-public的域名,如nlb-public-xxxxxxxx.elb.cn-northwest-1.amazonaws.com.cn
- 点击OK,返回Certificate界面
- 选择刚刚生成的fg-nlb-public,下载到本地,文件名为”fg-nlb-public.csr”
- 将下载的CSR文件”fg-nlb-public.csr”上传至Ubuntu web-srv中,按下步操作向Let’s Encrypt申请FortiGate-VM的服务器证书
cd ~ |
sudo certbot certonly --csr fg-nlb-public.csr \ --manual --preferred-challenges http |
- 执行命令输出如下图,将Let’s Encrypt颁发的FortiGate服务器证书0000_cert.pem下载到本地
- 回到FortiGate-VM,导航至System -> Certificates,选择创建Certificate,如下图
- 在打开的页面中,选择Import Certificate,如下图
- 选择Local Certificate,并上传Let’s Encrypt颁发的证书,如0000_cert.pem,参见下图
- 证书导入成功
- 可以在FortiGate防火墙上查看Let’s Encrypt颁发的针对nlb-public域名的证书
6.3.4 FortiGate-VM启动SSL-Inspection
- FortiGate防火墙,导航至Security Profiles -> SSL/SSH Inspection,如下图所示
- 新建一个名为”letsencrypt_aws_nlb”的profile
- 选择”Protecting SSL Server”
- 在Server Certificate处,可以看到导入的fg-nlb-public证书
- FortiGate防火墙,导航至Policy & Objects -> Firewall Policy,如下图所示:
- 在awsgeneve这条策略中,启用SSL Inspection,并选择上步创建的letsencrypt_aws_nlb
- 方案效果展示:
- 通过访问DVWA靶场URL,尝试上传病毒文件进行测试,如下图所示:(病毒样本可以从www.eicar.org 获取)
- 当点击Upload后,浏览器会弹出阻止上传的拦截界面,如下图所示
- 回到FortiGate防火墙,导航至Log & Report -> AntiVirus,可以查看被拦截的病毒文件,其中有HTTPS和HTTP
您可以在亚马逊云科技 Marketplace 中订阅并采购本方案中的 Fortinet 相关产品:
FortiGate:
BYOL(Graviton):FortiGate Next-Generation Firewall (ARM64/Graviton)