[安全] Fortinet Fortiweb WAF for AWS 解决方案部署指南

[安全] Fortinet Fortiweb WAF for AWS 解决方案部署指南

Fortinet Fortiweb WAF for AWS 解决方案

AWS China 官方页面

背景

本部署指南详细描述了如何在云上使用 AWS CloudFormation 模板部署 Fortinet FortiWeb WAF(Web application firewall),构建并配置WAF 高可用方案。

概览

该解决方案是基于FortiWeb WAF在云上开发的自动化部署解决方案。用户可以利用预先定义好的CloudFormation 模板文件,结合EC2,VPC,负载均衡等组件快速完成部署。 在使用方面,用户可以依赖 FortiWeb 开箱即用的内置规则进行防护。而无需投入很大精力从零开始设置复杂的WAF规则,同时客户能够快速创建自定义规则。 借助于该解决方案,可以阻止可能影响Web应用可用性、危害安全或消耗过多资源的常见攻击模式。

防护场景

该解决方案有助于阻止以下常见攻击:

SQL注入

攻击者将恶意SQL代码插入Web请求中,以从数据库中提取数据。此解决方案旨在阻止包含潜在恶意SQL代码的Web请求。

跨站点脚本攻击

跨站脚本攻击,也称为XSS。攻击者利用网站中的漏洞将恶意客户端脚本文件注入合法用户的Web浏览器中。此解决方案检查传入请求中常用的元素,可以识别和阻止XSS攻击。

HTTP泛洪

Web服务器和其他后端资源面临HTTP泛洪等分布式拒绝服务(DDoS)攻击的风险。

僵尸程序和爬虫程序

可公开访问的Web应用程序的操作员必须相信,访问其内容的客户端可以准确地标识自己,并且可以按预期使用服务。但是,某些自动客户端(例如内容抓取工具或不良的漫游器)会隐藏自己,以绕过限制。

系统架构

系统架构图

  1. 公有私网及私有子网:此方案创建两种不同的子网,公有子网和私有子网。建议被 Fortiweb 保护的Web 服务器部署在私有子网中。
  2. ALB 及 NLB:此解决方案Fortiweb服务器前端的负载均衡可以是 AWS Application Loadblance ,也可以是 Network Load Balance.
  3. 高可用架构:为了满足用户对Web安全高可用性及冗余性的需求,该方案提供了Active-Active-High volume 的部署模式,在不同的可用区创建 Fortiweb Master 节点及 Fortiweb Slave 节点。如果 Master 节点出现故障,那么 Slave 的节点会自动升级为 Master 节点,确保系统功能的高可用性。
  4. 数据流向:互连网用户如果要访问位于私有子网的 Web 服务器
    1. 第一步,流量会经过 Internet Gateway (IGW)。
    2. 第二步,会经过负载均衡(可以是 ALB类型,也可以是 NLB类型)转发
    3. 第三步,请求会转发到 FortieWeb 服务器,根据配置的 WAF 规则进行请求的检测。如果发现请求是恶意的,可以选择针对请求进行日志的记录或者是阻止。
    4. 第四步,正常请求会发送到受保护的 Web 服务器。
  5. 位于私有网络受保护的 Web Server 如果需要访问互联网,例如更新软件等操作。该种请求会经过NAT Gateway进行流量的转发。

机型选择

决定 FortiWeb 所需机型的因素有许多,请根据应用程序吞吐量、用户数量以及需保护的站点数量综合考虑。建议根据所需包含的 HTTP 带宽进行合适的机型选择。

  • 如果需保护资源的HTTP带宽为25Mpbs,建议选用c5.large机型
  • 如果需保护资源的HTTP带宽为100Mpbs,建议选用c5.xlarge机型
  • 如果需保护资源的HTTP带宽为500Mpbs,建议选用M5.2xlarge机型
  • 如果需保护资源的HTTP带宽为1000Mpbs,建议选用M5.4xlarge机型

部署说明

前提

该方案部署前,需要准备如下文件和资源。

Fortiweb License 文件

需要提前准备好同计划部署 FortiWeb 服务器数量相等的 Liense 文件,并上传到自己的 S3 Bucket 存储桶。并设置好相应的 Prefix。例如:如果把 License 文件存放在S3 存储桶 nx, prefix 为 license

EC2 密钥对(Key Pairs)

该方案需要提前准备好 EC2密钥对。在方案部署完成后,可使用该密钥对远程 SSH 方式登录到 Fortiweb 服务器。

使用 CloudFormation 模板部署应用

第一步:指定模板

https://iot-device-simulator-cn-north-1.s3.cn-north-1.amazonaws.com.cn/waf/v1.0.0/fwb-ha-vpc-alb-main.yaml

第二步:指定堆栈详细信息:

参数列表:

参数类型 参数项 参数说明 缺省值
Common configuration Availability Zones 选择 Fortiweb 服务器要部署的可用区,如果部署大于 2 台,请选择至少两个可用区
Common configuration Resource name prefix 该方案所建资源名称的前缀 fwbha
Common configuration S3 bucket name which store fortiweb license file 存放 Fortiweb License 文件的存储桶(您自己拥有的 S3 存储桶)名称
Common configuration S3 key prefix which store fortiweb license file License 文件在存储桶存放的前缀(Prefix)名称,可以理解为目录名称。请注意最后需要加 "/" 字符。
Common configuration Key pair name 选择已经存在的密钥对,用于 SSH 登录 Fortiweb 服务器,
Network configuration VPC CIDR 新建 VPC的CIDR 10.0.0.0/16
Network configuration VPC Public Subnet1 公有子网 1,用于部署 Fortiweb 10.0.0.0/24
Network configuration VPC Public Subnet2 公有子网 1,用于部署 Fortiweb 10.0.1.0/24
Network configuration VPC Private Subnet1 私有子网 1,用于部署 被保护的 Web 服务器 10.0.3.0/24
Network configuration VPC Private Subnet2 私有子网 2,用于部署 被保护的 Web 服务器 10.0.4.0/24
FortiWeb configuration FortiWeb Image Type 只支持 BYOL 模式 BYOL
FortiWeb configuration FortiWeb Image Version Fortiweb最新版本 LATEST
FortiWeb configuration FortiWeb Instance type 请根据受保护的 HTTP服务器带宽选择机型 C5.Large
FortiWeb configuration FortiWeb Instance Count 部署 Fortiweb 服务器数量。请确保在 S3桶中 Licesense 文件数量大于或等于该数值 2
FortiWeb configuration FortiWeb Admin password 用于登录 Fortiweb 系统的密码。密码需要包含大小写,字母,数字 和 @!%*#?& 这些特殊字符
FortiWeb configuration FortiWeb Admin Port Fortiweb 后台管服务端口 8443
FortiWeb configuration FortiWeb Http Port Fortiweb 所保护web server 的Http协议端口 80
FortiWeb configuration FortiWeb Https Port Fortiweb 所保护web server 的Https协议端口 443
FortiWeb HA configuration FortiWeb HA Mode FortiWeb HA 模式,高可用请选择 active-active-high-volume 模式 active-active-high-volume
FortiWeb HA configuration FortiWeb HA Group Name FortiWeb HA Group 名称 FWHAGroup
FortiWeb HA configuration FortiWeb HA GroupID FortiWeb HA Group ID 编号 30
FortiWeb HA configuration FortiWeb HA Override FortiWeb HA Override 模式 disable

Availability Zones: 请选择Fortiweb 服务器所在的 可用区,按照最佳实践,建议选择至少两个可用区。假设选择 ZHY 区域,建议选择 cn-northwest-1a 及 cn-northwest-1b,如下图所示。

Resource name prefix: 该参数是资源名称前缀的自定义标识符,最多10个字符,只包含大写字母、小写字母和数字。最大长度是10。示例:

S3 bucket name which store fortiweb license file: 存储 Fortiweb license 文件的 S3 存储桶的名称 S3 key prefix which store fortiweb license file:存储 Fortiweb license 文件的S3 文件前缀,注意: 请确保输入值以“/”字符为结尾。

Key pair name:指定安装Fortiweb的EC2 所需要的 SSH Key pair 的名称。示例: Network configuration:

按照常用的部署架构,Fortiweb 位于公有子网,而被保护的 Web Server 则需部署在私有子网中。示例:按照高可用架构,需要在两个可用区创建 4 个子网(两个公有子网,两个私有子网)

Fortiweb 配置选项

FortiWeb Image Type: 由于在AWS中国的Market Place只支持 BYOL 的 Liense 模式,所以请确保默认值。

Fortiweb Image version: 请选择默认值 LATEST

Fortiweb Instance type: FortiWeb现在支持的实例类型15 种,请根据实际负载情况选择合适的机型。

]FortiWeb Instance Count:需要部署的 Fortiweb 的数量。缺省值为 2

FortiWeb Admin password:用于部署Fortiweb的admin 用户的管理密码。密码需要包含小写字母、大写字母、数字、特殊字符“$@$!%*#?”,长度在8-16之间。

FortiWeb Admin Port,可以选择8443,8080,80等,默认选择8443:

FortiWeb Http Port

FortiWeb Https Port

FortiWeb HA configuration:

FortiWeb HA Mode,本场景选择active-active模式 其他HA相关配置

在下一步的堆栈配置选项中直接跳过选择“下一步” 下一步的审核环节,审核前几个步骤配置的内容,并勾选最后的两个确认复选框,之后点击“创建堆栈”

第三步,创建堆栈

系统进入创建堆栈的过程:

验证环境

并不断提示创建的进度,点击右上放的刷新按钮,查看进度,下图显示正在创建VPC: 创建过程中: 最终如图显示三个堆栈创建完成,主堆栈创建完成,确认没有出现创建失败的情况即完成CloudFormation堆栈的创建。 此时可以在VPC,EC2等服务的console界面上检查创建的资源。如VPC和子网: 四个子网:两个公有子网和两个私有子网 两台包含Fortiweb的EC2:

第一步:创建Nginx服务器:

创建两台Ngin 服务器作为要保护的目标Web 服务器,本文以已经安装完成的镜像启动Nginx,在ec2的console上选择AMI,点击“启动”按钮: 在启动Nginx 服务器时,可以通过user data配置安装配置Nginx服务并启动。

1#!/bin/bash
2sudo yum update -y
3sudo amazon-linux-extras install -y nginx1
4sudo systemctl enable nginx
5sudo systemctl start nginx

注意根据本文档的架构,我们会在两个私有子网分别启动一台Nginx,选择子网的时候需要注意,本步骤在private subnet2中创建实例。截图如下: 针对web服务器,选择堆栈中已经建立的安全组,该安全组开放80端口提供web服务,开放22端口以便安装部署和系统管理: 在私有网络创建好 Nginx 服务器后,请记录下该 Nginx 的私有网络 IP 地址。

第三步:配置Fortiweb

在浏览器输入:https://[fortiweb 阶段的ip或域名]:8443,这个端口是在启动CloudFormation堆栈时选择的Fortiweb的端口(例如 L https://52.82.4.168:8443)。由于是自签发的数字证书,请忽略浏览器警告,继续访问。 之后浏览器弹出输入用户名和密码的输入窗口。输入之后登录进入Fortiweb的管理界面。请注意当前的 HA Status 已经是 Active-Active-High Volume 模式。

在如图所示的界面修改系统显示语言为简体中文。

下面我们将配置对相应的web服务器进行防护,以及应用不同场景的策略配置 首先从左边的菜单选择:服务器对象→服务器→虚拟服务器,在编辑虚拟服务器的界面,输入名称,如virtualserver1,之后点击“确认“。 完成后,点击下面“+新建”,弹出编辑界面,在“接口”一栏选择“port1”,点击“确认”保存。 虚拟服务器配置之后的状态为: 下面配置主机池,在左边菜单依次选择服务器对象,服务器,主机池,该池是被保护的主机集合。进入新建主机池的界面,输入主机池名称后,在单服务器/负载均衡处,选择负载均衡(针对需要对多台主机需要保护的情况),点击“确认”。 之后,选择“+新建”,进入主机池规则编辑界面,此处根据需要配置,本文档只需要编辑要被保护的主机的IP。点击“确认”。

之后依次添加多台Nginx实例的私有IP地址,配置如下图所示: 选择web保护规范,缺省情况下请选择 “Inline Standard Protection”-Recommened规范。 在左边菜单依次选择:策略,服务器策略,点击“+新建”,进入策略创建界面。输入策略名称,选择模式为“单一服务器/主机池”,选择虚拟服务器(前文创建)和主机池(前文已经创建),在“安全设置”部分,“web保护规范”处选择需要使用的保护策略,选择对http服务进行保护。根据不同场景,选择不同的保护策略。本文以基本的标准保护为例。选择“Inline Standard Protection”。因为该规范已经内置开箱即用的 WAF 规则。

至此Fortiweb配置完成。

第四步:验证正常web 请求

测试访问,在浏览器输入Application Load Balancer 的域名。 如果显示Nginx的首页,这说明用户请求已经经过 ALB 的转发,经过 Fortiweb 检查后并成功转发给受保护的 Nginx web 服务器。

第五步:验证危险web请求

由于 “Inline Standard Protection”-Recommened Web保护规范已经内置 WAF 规则。例如在正常的请求 URL 中加入 cmd.exe 参数后,该保护规范认为此请求是危险请求,会进行阻止。