使用 Amazon CloudFront、AWS WAF 和边缘功能保护和加速您的 WordPres
利用 Amazon CloudFront、AWS WAF 和边缘函数保护和加速您的 WordPress CMS
作者:Cheikh MAHAMAN 于 2024 年 8 月 26 日发布于 Amazon CloudFront、AWS WAF、网络与内容交付、技术指南 永久链接 分享
关键要点
本文介绍如何通过 Amazon CloudFront、AWS WAF 和边缘函数来保护和加速 WordPress 网站。WordPress 是全球最受欢迎的内容管理系统,占所有网站的 43 以及 643 的已知 CMS 市场。使用 Amazon CloudFront 可以提高内容交付的安全性和性能,并利用 AWS WAF 进行额外的安全保护。应用程序所有者通常依赖内容管理系统CMS来发布和管理其网站上的内容。WordPress 是全球最受欢迎的内容管理系统,自 2003 年作为博客平台推出以来,如今已支持 43 的所有网站,控制近 643 的 CMS 市场份额。
本文旨在展示如何使用 Amazon Web Services (AWS) 的边缘服务来保护和加速现有的 WordPress 网站,包括 Amazon CloudFront、Amazon CloudFront Functions 和 AWS WAF。
Amazon CloudFront 是一个为高性能、安全性和开发者便利性而设计的内容分发网络CDN服务。它在通过 CDN 提供内容时,无论是静态还是动态内容,都能提高安全性和加速内容交付,得益于 AWS 全球网络基础设施 的支持,包括边缘终端和 WebSockets。
CloudFront Functions 是 Amazon CloudFront 的一个功能,允许您编写轻量级的 JavaScript 函数,进行高规模的延迟敏感性 CDN 自定义操作。CloudFront Functions 可以操作流经 CloudFront 的请求和响应,执行基本的身份验证和授权,在边缘生成 HTTP 响应等。
AWS WAF 是一个 web 应用防火墙,可以帮助保护您的 web 应用程序或 API 免受常见网络攻击和机器人攻击,这些攻击可能会影响可用性、危害安全性或消耗过多资源。它与 Amazon CloudFront 完全集成,为保护应用程序的第 7 层OSI 模型的应用层提供机制。
解决方案概览
关于 CloudFront,您将使用以下更新的CloudFront 参考表 来配置行为和缓存策略,并进行小幅修改。您将把所有 HTTP 流量重定向到 HTTPS:
属性静态动态管理动态前端1路径行为wpcontent/wpadmin/wploginphp默认()2协议HTTP 和 HTTPS 重定向到 HTTPS重定向到 HTTPSHTTP 和 HTTPS 重定向到 HTTPS3HTTP 方法GET HEAD所有4HTTP 标头无所有HostCloudFrontForwardedProtoCloudFrontIsMobileViewerCloudFrontIsTabletViewerCloudFrontIsDesktopViewer5Cookies无所有commentwordpresswpsettings6查询字符串是失效是是两个分发:一个用于应用程序所有者管理员访问,一个用于查看者
在本文中,您将为两种类型的用户设置一个分发:应用程序所有者管理员用户和查看者非管理员用户。这种方法是最佳的,因为它允许每组用户拥有专用的访问、管理和缓存策略。
此外,您将为每个分发配置一个 AWS WAF。
对于查看者,将使用 AWS WAF 阻止所有“管理员”访问wpadmin/,通过 AWS 管理规则,具体为 AWSManagedRulesAdminProtectionRuleSet。该规则组包含允许您阻止外部访问暴露的管理页面的规则。这将降低恶意行为者获得 WordPress 管理访问权限的风险。
您必须将规则组的范围缩小,以允许某些 URIwpadmin/css/、wpadmin/js/ 和 wpadmin/images/,因为这些 URI 被未拥有管理权限的页面调用。
您还将配置其他规则组,例如 AWSManagedRulesWordPressRuleSet,该规则组会阻止与 WordPress 网站特有漏洞利用相关的请求模式。该规则组应与 SQL 数据库 和 PHP 应用 规则组结合使用。用于的规则组详细列表如下:
附加规则
您还定义了附加规则来保护您的分发。虽然这是一项建议,但您可以根据安全需求更新规则。
AWSManagedRulesBotControlRuleSet 该机器人控制托管规则组提供规则以阻止和管理来自机器人的请求。机器人可能会耗尽过多资源,歪曲业务指标,导致停机,以及进行恶意活动。AWSManagedRulesPHPRuleSet PHP 应用规则组包含阻止与 PHP 编程语言使用特定漏洞相关的请求模式的规则,包括注入不安全的 PHP 函数。AWSManagedRulesCommonRuleSet 核心规则集CRS规则组包含通常适用于 web 应用程序的规则。它提供对各种漏洞利用的保护,包括一些在 OWASP 文献中描述的高风险和常见漏洞,如 OWASP Top 10。AWSManagedRulesKnownBadInputsRuleSet 已知不良输入规则组包含阻止已知无效且与漏洞利用或发现相关的请求模式的规则。这可以帮助降低恶意行为者发现易受攻击应用的风险。AWSManagedRulesSQLiRuleSet SQL 数据库规则组包含阻止与 SQL 数据库利用相关的请求模式的规则,例如 SQL 注入攻击。这可以帮助防止非法查询的远程注入。遵循同样的原则,应用程序所有者分发管理员将使用以下规则通过 AWS WAF 进行保护:
您可以选择两种方式来保护应用程序所有者对管理页面的访问。您可以使用 Amazon CloudFront Function 检查 WordPress 在身份验证阶段设置的身份验证 cookie 是否在查询中;否则,您可以将其重定向到登录页面。或者,您可以配置与之前相同的AWSManagedRulesAdminProtectionRuleSet规则组,阻止在未设置身份验证 cookie 的情况下访问管理界面。
在本文中,您将采用第一种选择。您将实现一个 CloudFront 函数,检查会话 cookiewordpressloggedin,如果未设置,则重定向到登录页面。但对于 URI wpadmin/css/、wpadmin/js/ 和 wpadmin/images/,不会重定向。
javascriptfunction handler(event) { var request = eventrequest var cookies = requestcookies var host = requestheadershostvalue var newurl = https// host /wploginphp var uri = requesturi consolelog(Event JSONstringify(event))

var authcookie = Objectkeys(cookies)filter(v =gt vstartsWith(wordpressloggedin))consolelog(size cookies authcookielength)if(authcookielength != 0){ consolelog(Auth cookie JSONstringify(authcookie))}else if(!uriincludes(wpadmin/css) ampamp !uriincludes(wpadmin/js) ampamp !uriincludes(wpadmin/images)){ var response = { statusCode 302 statusDescription Found headers { location { value newurl } } } consolelog(Response JSONstringify(response)) return response}return request}
这样做的好处是重定向将在边缘完成,从而加速流量,而缺点是 CloudFront Functions 的费用每一百万次调用 010。根据 wpadmin 的请求数量,这可能在经济上不划算。此函数将在“wpadmin/”行为的查看请求中被触发。
您可能想要更加严格,强制所有管理分发的请求都经过身份验证。在这种情况下,您将把 CloudFront Functions 应用到所有行为。
另一种未实施的选项是使用 IP 允许列表配置保护管理分发 配置。您可以创建 IP 匹配条件,仅允许一组 IP 访问管理分发。
您还配置了 HTTP 安全标头 的响应,以保护我们的 WordPress 应用程序。HTTP 安全标头提高了 web 应用程序的隐私和安全性,保护其免受客户端漏洞的影响。最常见的 HTTP 安全标头包括:
引用者政策严格传输安全HSTS内容安全政策CSPXContentTypeOptionsXFrameOptionsXXSSProtection前提条件
您需要有一个已部署的 WordPress 实例,并在公共可用的端点上侦听。
解决方案指南:利用 Amazon CloudFront、AWS WAF 和边缘函数保护和加速您的 WordPress CMS
现在,您已了解了提议的配置,接下来您将通过设置进行演示。
在您拥有 WordPress 后端我们将把它作为源的情况下,以下 GitHub 仓库 将部署并配置 Amazon CloudFront 以及 AWS WAF 和 CloudFront Functions,以为匿名查看者、消费者和内容应用程序所有者管理员提供服务。
部署步骤
如果尚未在 wordpresscloudfront 文件夹中,请定位到此文件夹:
bash
如果尚未在 wordpresscloudfront 文件夹中,请定位到此文件夹
cd wordpresscloudfront
在 MacOS 和 Linux 上创建虚拟环境:
python3 m venv venv
激活您的虚拟环境
source venv/bin/activate
安装所需的依赖项。
pip install r requirementstxt
为此代码合成 CloudFormation 模板。
cdk synth
部署堆栈
cdk deploy parameters WordPressOriginURL=XXXXXuseast2elbamazonawscomparameters WordpressOriginIsHTTPS=trueparameters WordPressDomainConsumers=wordpressconsumersparameters WordPressDomainPublishers=wordpresspublishersparameters HostedZoneId=XXXXXXXXXXparameters HostedZoneName=mydomaincomall
蘑菇加速器使用教程参数部署指南
CDK 在启动时需要一些参数。让我们了解这些参数的意义。
WordPress 后端配置
WordPressOriginURL 定义 WordPress 后端端点。这是指向您当前 WordPress 安装的公共域名。该域名必须与用于查看者消费者的域名不同。WordPressOriginIsHTTPS 定义后端侦听 HTTP 或 HTTPS 值为 true 还是 false。WordPress 前端配置
WordPressDomainConsumers 指定消费者查看者用于访问您网站的域名。该域名将映射到将创建以提供流量的 CloudFront 分发。WordPressDomainPublishers 指定由应用程序所有者/发布者或管理员用于连接到您网站的域名。该域名将映射到将创建以提供流量的 CloudFront 分发。Route 53 DNS 配置
HostedZoneId 和 HostedZoneName 用于在 Route 53 托管区中创建“域名”和“管理域名”记录。如果指定了其中一个或两个域名,则该字段是必需的。重要说明
当将“WordpressDomainConsumers”和“WordpressDomainPublishers”中的一个或两个指定为 CloudFront 分发的替代域名时,必须附加经过信任的 TLS 证书,以验证您使用该域名的授权。此部署通过 AWS Certificate Manager (ACM) 创建所需的证书,并使用基于 DNS 的验证来授权该域名的使用。
注意事项
当您指定 WordpressOriginIsHTTPS=true 时,您的源要求以 HTTPS 接收请求并具有有效证书;否则,您在访问 CloudFront 分发时将遇到错误。建议的做法是使用 HTTPS 访问源。
一旦您指定了这些参数,请继续部署 CDK 项目。部署完成后,创建的 AWS 资源将取决于部署时选择的选项。
结论
总而言之,保护和加速您的 WordPress CMS 可能是一项具有挑战性的任务,但通过 Amazon CloudFront、AWS WAF 和边缘函数,这一过程可以大大简化。通过利用 AWS 服务,您可以提升网站性能、保护其免受恶意攻击,并改善用户体验。凭借自定义和扩展这些服务以满足您具体需求的能力,您可以确保您的 WordPress CMS 不仅快速可靠,而且安全。
后续步骤
如果您原始的 WordPress 堆栈已在 AWS 上部署,您可以配置 [Cloud