[安全] Fortinet Fortiweb WAF for AWS 解决方案部署指南
![[安全] Fortinet Fortiweb WAF for AWS 解决方案部署指南](../lianhao-qu-LfaN1gswV5c-unsplash.jpg)
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应用程序的操作员必须相信,访问其内容的客户端可以准确地标识自己,并且可以按预期使用服务。但是,某些自动客户端(例如内容抓取工具或不良的漫游器)会隐藏自己,以绕过限制。
系统架构
- 公有私网及私有子网:此方案创建两种不同的子网,公有子网和私有子网。建议被 Fortiweb 保护的Web 服务器部署在私有子网中。
- ALB 及 NLB:此解决方案Fortiweb服务器前端的负载均衡可以是 AWS Application Loadblance ,也可以是 Network Load Balance.
- 高可用架构:为了满足用户对Web安全高可用性及冗余性的需求,该方案提供了Active-Active-High volume 的部署模式,在不同的可用区创建 Fortiweb Master 节点及 Fortiweb Slave 节点。如果 Master 节点出现故障,那么 Slave 的节点会自动升级为 Master 节点,确保系统功能的高可用性。
- 数据流向:互连网用户如果要访问位于私有子网的 Web 服务器
- 第一步,流量会经过 Internet Gateway (IGW)。
- 第二步,会经过负载均衡(可以是 ALB类型,也可以是 NLB类型)转发
- 第三步,请求会转发到 FortieWeb 服务器,根据配置的 WAF 规则进行请求的检测。如果发现请求是恶意的,可以选择针对请求进行日志的记录或者是阻止。
- 第四步,正常请求会发送到受保护的 Web 服务器。
- 位于私有网络受保护的 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 模板部署应用
第一步:指定模板
第二步:指定堆栈详细信息:
参数列表:
参数类型 | 参数项 | 参数说明 | 缺省值 |
---|---|---|---|
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 参数后,该保护规范认为此请求是危险请求,会进行阻止。