CDN 和 Web应用防火墙(Web Application Firewall,简称WAF) 在云计算中具有广泛的应用场景。CDN 主要用来加速静态内容(如 HTML、CSS、JavaScript 等文件),而 WAF 通常用来保护服务器,减少Web 应用程序受到的安全威胁。阿里云WAF支持与阿里云CDN或非阿里云CDN(例如网宿、加速乐、七牛、又拍等)联合部署。本文介绍如何为使用CDN加速的业务部署WAF。
背景
使用一个域名根据URI来实现动静分离的网络架构在实际应用中非常常见,尤其是在高流量网站和复杂的Web应用中。这种网络架构可以显著提高网站性能,优化资源利用,并增强用户体验。通常情况下我们将静态资源(如图片、CSS、JavaScript文件等)通过内容分发网络(CDN)缓存并分发到全球各地的CDN节点,用户请求这些资源时会从最近的CDN节点获取,显著减少加载时间。动态内容的请求,会将请求路由到一个反向代理或负载均衡器(如Nginx、HAProxy、AWS Elastic Load Balancing、阿里云的 SLB),负载均衡器根据预定义的策略(如轮询、最少连接、IP哈希等)将请求分配到后端的一组应用服务器。使用动静分离网站的网络架构如下:
用户请求静态资源:
用户设备请求xxx.xxx.xxx/static/logo.png。
路由到最近的CDN节点,没有缓存资源时将该请求转发到源站。
源站响应请求,并返回数据。
CDN缓存源站返回的数据,并将数据返回到客户端。
用户设备再次请求xxx.xxx.xxx/static/logo.png。
CDN节点检查缓存,如果命中缓存并直接返回资源。
用户请求动态内容:
用户设备请求xxx.xxx.xxx/getInfo,将请求路由至CDN节点。
CDN根据条件回源,将请求回源到源站的地址。
处理动态流量,将数据返回给客户端。
前提条件
网站基于一个域名使用了动静分离的网络架构。
已开通CDN服务,并已将域名添加到CDN。更多信息,请参见新手指引。
已开通WAF实例。
方法概述
WAF和CDN同时部署时采用以下网络架构:CDN(入口层,内容加速)> WAF(中间层,实现应用层防护)> 源站服务器(ECS、SLB、VPC、IDC等)。网站业务流量会先经过CDN,然后转发到WAF过滤Web攻击,最后只有正常的业务流量被转发到源站服务器,保障网站的业务安全和数据安全。
在使用CDN加速的基础上使用WAF防护的网络架构:
步骤一:接入WAF
通过这一步操作,您可以通过域名接入或者云产品接入的方式将您需要防护对象接入到WAF中。
登录Web应用防火墙控制台,在顶部菜单栏,选择WAF实例的资源组和地域(中国内地、非中国内地)。
在左侧导航栏,单击接入管理。
接入WAF。
CNAME接入
使用CNAME的方式接入,在域名接入成功后,会生成一个特定的CNAME域名。
在CNAME接入页签,单击接入。
在配置监听向导页,完成以下配置后,单击下一步。
配置项
说明
域名
填写要防护的网站域名。
协议类型
按实际情况选择网站支持的协议类型。端口填写服务器地址的端口,本实例中端口为8080。
WAF前是否有七层代理(高防/CDN等)
选择是。客户端IP判定方式选择【推荐】取指定Header字段中的第一个IP作为客户端源IP,避免XFF伪造。
在配置转发向导页,填写服务器地址后,单击提交。
在接入管理页,单击目标接入对象CNAME后的复制,获取CNAME。
说明如果您有HTTPS、SSL、负载均衡算法等其他的配置需求,请参考添加域名。
通过CNAME接入方式接入Web业务到WAF防护后,您需要设置源站服务器的安全软件或访问控制策略,放行WAF回源IP段的入方向流量。详细操作参考放行WAF回源IP段。
云产品接入
单击云产品接入页签,在左侧云产品类型列表,选择您要接入的云产品。如果您的动态流量将被CLB(HTTP/HTTPS)处理,您选择CLB(HTTP/HTTPS)作为将要接入的云产品。单击接入。
单击CLB(HTTP/HTTPS),弹出接入资产- 七层CLB面板,在面板中可以看到您已有的CLB实例,选择您的目标CLB实例并添加您的待接入端口。WAF前是否有七层代理(高防/CDN等)选择是,并选择【推荐】取指定Header字段中的第一个IP作为客户端源IP,避免XFF伪造,填写您指定的Header字段。
说明本次操作以接入CLB(HTTP/HTTPS)为例,其他云产品的接入方式请参考云产品接入。
配置项
相关操作
选择需要添加的实例&端口
定位到要添加的实例,单击操作列的添加端口。
选择要添加的HTTP或HTTPS端口,单击确定。
说明如果要添加的实例未同步到实例列表,单击同步最新资产,更新实例列表。
WAF前是否有七层代理(高防/CDN等)
选择是,并选择【推荐】取指定Header字段中的第一个IP作为客户端源IP,避免XFF伪造。
在本示例中,CLB的监听端口为8080,指定的Header字段填写header。
点击确认,在云产品接入页签中看见接入的CLB实例。
完成接入后,WAF会自动生成一个防护对象,并为该防护对象默认开启Web核心防护规则。您可以在
页面,查看自动添加的防护对象,并为其配置防护规则。
如果在页面中Web核心防护规则区域不存在默认模板,则需要手动为防护对象开启Web核心防护规则。
步骤二:为防护对象提供WEB防护
手动为防护对象开启防护,需要您将防护对象添加到对应防护模板的生效对象中。
进入Web应用防火墙控制台在左侧导航栏,选择 。在Web核心防护页面下方Web核心防护规则区域,选择一个规则模板。点击操作列的编辑。
说明如果您需要创建新的模板来满足您的防护需求,请参考创建自定义规则模板。
进入编辑模板 - Web核心防护规则页签,规则动作选择拦截,生效对象添加步骤一中接入的防护对象。
点击确认保存本次编辑。
步骤三:修改CDN的回源地址
静态资源有可能存储在OSS中,也有可能存储在后端服务里。静态资源存储的位置不同,在CDN配置中的源站信息也不一样。根据不同的情况,有不同的配置方式。
静态资源存储在OSS
如果静态资源存储在OSS中并使用CDN加速,在CDN的源站信息中使用基础源站信息搭配条件源站的方式。在CDN源站信息中需要修改条件源站信息。
登录CDN控制台。在左侧导航栏,单击域名管理。在域名列表,定位到要开启WAF防护的域名,单击操作列的管理。
配置条件源站。在基本配置分页,单击目标条件源站后的操作列下的编辑,在条件源站窗口中完成以下配置。
参数
说明
规则条件
规则条件能够对用户请求中携带的各种参数信息进行识别,以此来决定某个配置是否对该请求生效。在本示例中,URI不包含/static/*的请求将被回源到目标地址。
源站地址
如果域名通过CNAME接入模式接入WAF时,填写接入WAF的源站信息。
如果域名通过云产品接入模式接入WAF时,填写云产品接入WAF的公网IP。
重要条件源站中没有端口选项,HTTP默认转发到源站地址的80端口,HTTPS默认转发到源站地址的443端口,如果需要在源站地址指定端口,您可以添加带端口号的IP地址。
点击确定,在条件源站能看到修改后的回源地址。
静态资源存储在后端服务
如果静态资源存储在后端服务中并使用CDN加速,在CDN源站信息中只需要修改基础源站信息。
登录CDN控制台。在左侧导航栏,单击域名管理。在域名列表,定位到要开启WAF防护的域名,单击操作列的管理。
在基本配置分页,单击新增源站信息。完成如下配置后,单击确定。
参数
说明
源站信息
如果域名通过CNAME接入模式接入WAF时,选择源站域名并填写接入WAF的CNAME地址。
如果域名通过云产品接入模式接入WAF时,选择IP并填写云产品接入WAF的公网IP。
优先级
设置支持的主备优先级,主优先级大于备优先级。
权重
当多个源站的优先级相同时,设置源站的权重,实现按权重的负载均衡。
端口
填写CDN节点回到源站的请求端口,本实例中端口为8080。
如果在步骤一中是通过CNAME接入模式接入WAF,需要删除原来的回源地址。
CDN配置完成后,不会立即生效,具体的生效时间受DNS生效时间、CDN配置同步、缓存刷新和预热等因素的影响。为确保配置能够及时生效,建议在配置过完成后执行缓存刷新和预热:主动清除旧缓存,并预热新内容,确保用户访问时能够获取最新配置内容。
步骤四:配置HTTPS证书
HTTPS证书部署至CDN平台,启用HTTPS安全加速服务,实现客户端与CDN节点间请求的加密传输。
在左侧导航栏,单击域名管理。在域名管理页面,找到目标域名,单击操作列的管理。
在指定域名的左侧导航栏,单击HTTPS配置。在HTTPS证书区域,单击修改配置。
在HTTPS设置界面,打开HTTPS安全加速开关,并配置证书相关参数。
如果您已在阿里云数字证书管理服务中购买了证书,请选择云盾(SSL)证书中心,并在证书名称中选择已购买的证书。您可以在证书管理中查看,已有的证书。
说明请检查已购买证书绑定的域名和加速域名是否相同。
如果您使用的是第三方服务商签发的证书,请选择自定义上传(证书+私钥),您需要在设置证书名称后,上传证书(公钥)和私钥,该证书将在阿里云数字证书管理服务中保存。您可以在证书管理中查看。
参数
说明
证书名称
为要上传的证书设置一个名称。
支持使用英文字母、英文句号、数字、下划线(_)和短划线(-)。
说明证书名称不能与已有证书名称重复。已有证书可以在证书管理中查看。
如果系统提示证书重复,请修改证书名称后再重新上传。
证书(公钥)
填写证书文件内容的PEM编码。
您可以使用文本编辑工具打开PEM格式的证书文件,复制其中的内容并粘贴到该文本框。
样例请参见输入框下方的pem编码参考样例。
私钥
填写证书私钥内容的PEM编码。
您可以使用文本编辑工具打开KEY格式的证书私钥文件,复制其中的内容并粘贴到该文本框。
样例请参见输入框下方的pem编码参考样例。
说明如果您得到的是以“-----BEGIN PRIVATE KEY-----”开头,以“-----END PRIVATE KEY-----”结尾的私钥,您需要使用OpenSSL工具执行以下命令进行转换,然后将
new_server_key.pem
的内容粘贴到该文本框。openssl rsa -in old_server_key.pem -out new_server_key.pem
单击确定,完成配置。
验证
在浏览器中输入的URI为xxx.xxx.xxx/123.php,本次访问被拦截,访问服务器的动态流量受到WAF的安全防护。
进入Web应用防火墙控制台,点击左侧 进入页面,在Web核心防护规则区域查看攻击记录。本示例中,该笔URI为xxx.xxx.xxx/123.php的请求被Webshell规则拦截。
访问静态资源路径xxx.xxx.xxxx/static/1.png,按下F12键或右键点击页面并选择检查打开开发者工具,在开发者工具中,点击顶部导航栏上的Network标签,请求的Header中能看到被CDN加速。
说明X-cache表示是否命中缓存,miss表示不命中,hit表示命中。
经过上述的验证,访问静态资源的流量被CDN加速,访问服务器的动态流量受到WAF的安全防护。