使用Cloudflare Workers修复内容安全策略
背景
四年前,我写过一篇关于通过更新Web服务器配置来修复缺失内容安全策略(Content-Security-Policy, CSP)的博客文章。CSP指示用户的Web浏览器在特定安全考虑上应如何行为。时代已经改变,在Black Hills Information Security(BHIS),我们迁移了Web服务器、托管公司和安全平台。CSP的最佳实践在过去四年中也发生了变化。在新的托管平台上,我们需要再次设置适当的内容安全头。由于我们现在使用Cloudflare作为CDN和WAF提供商,我们有机会在Web服务器之外前置CSP。
初始测试
在更新CSP之前,了解服务器当前如何处理/发送CSP很重要。可以使用第三方工具测试配置,例如SecurityHeaders.io扫描网站CSP配置。
例如,扫描WildWestHackinFest.com网站时,结果可能不理想。但需注意,CSP用于指示浏览器处理安全关切,在用户交互和敏感信息泄露的网站(如银行或健康记录门户)上至关重要。若无用户交互或无敏感信息,CSP配置的安全状态要求较低。
反面示例:美国社会保障局的登录门户https://secure.ssa.gov配置不佳。
Cloudflare Workers
Cloudflare Workers是无服务器端的JavaScript部分,可执行操作或修改与Cloudflare CDN/WAF保护站点相关的Web流量。例如,https://wildwesthackinfest.com由Cloudflare网络服务,允许使用Workers操作流量而无需更新后端(“origin”)Web服务器。BHIS运营多个网站,使用Workers可集中响应头操作到单一程序位置,而非管理多个后端服务器配置。
先决条件
要允许Worker操作Web服务器流量,必须确保Web服务在Cloudflare上配置为“Orange Cloud”。还需启用Workers服务:登录Cloudflare,选择域名,点击“Workers”选项卡启动服务。
构建Worker
启用Workers后,在“Workers”选项卡点击“Manage Workers”,然后“Create Service”。命名新Worker,选择“HTTP Handler”作为起始模板。点击“Quick Edit”访问Worker编辑器/IDE。
替换模板代码为以下Worker代码:
|
|
这是CSP的起始模板,应根据网站需求配置每个策略。添加的头将注入Web服务器的HTTP响应。点击“Save and Deploy”,但尚未生效。
应用Worker
保存Worker后,返回域名的Cloudflare Workers选项卡,点击“Add Route”。此功能将Worker与Web服务器关联。完成后,后端Web服务器的HTTP响应将被Worker拦截,并根据代码注入头。
Worker路由后,Workers选项卡将列出活动路由。
内容安全策略细化
关联Worker后,注意限制性CSP设置可能破坏网站渲染或功能(如果使用JavaScript、CSS或外部资源)。CSP指示浏览器哪些资源安全加载,限制性策略可能阻止必要资源加载。更新CSP时,可能看到与新CSP相关的错误或渲染问题。最简单识别CSP违规的方法是使用浏览器开发者模式(通常按F12)。Network或Console选项卡通常会提醒违规,需在CSP中处理。
例如,控制台错误显示script-src设置中stats.wp.com未显式信任。解决方法之一是添加https://stats.wp.com到script-src设置。更新并重新部署Worker后刷新,资源应被允许加载,控制台无错误。
Worker定价
Cloudflare提供免费层和两种定价方案:Bundled和Unbound。我们使用Unbound(默认),但执行时间少于50ms时可切换到Bundled。Workers仪表板显示执行时间,供决策。
例如,一个月Bundled Worker活动在繁忙网站上成本为$5.38,对应超过100万次点击。
值得注意,可以(且应该)限制Worker路由仅影响会指示浏览器创建额外子查询资源的网站资源(如HTML、PHP、ASP)。图像和视频通常不需要CSP,因为它们不指示浏览器创建额外HTTP请求。例如,可省略仅包含图像的Web服务器目录。Worker路由可堆叠,设置为“None”的服务将阻止Worker执行。
OWASP安全头项目
OWASP文档是安全头类型及其适当使用的良好资源。
内容安全策略参考
Content-Security-Policy.com是另一个更技术性的资源,提供当前CSP机制和浏览器支持矩阵的最新编译。
Cloudflare HSTS设置
设置Worker并根据网站需求配置CSP后,还需配置Cloudflare中的其他设置以完全对齐安全实践(并提高SecurityHeaders.io评分)。注意,如果网站或其子域未对齐这些更改,设置可能头痛。一旦启用HTTP严格传输安全(HSTS),无法轻松退出配置。确保子域和TLD网站适当配置HTTPS后再继续。
在Cloudflare仪表板,跳转到域名,进入SSL/TLS部分,然后Edge Certificate选项卡。配置两个部分:
- 始终使用HTTPS:自动将端口80从Cloudflare边缘重定向到HTTPS(443),无论源服务器是否支持端口80或从中提供其他内容。
- HTTP严格传输安全(HSTS):启用HSTS并根据需要配置设置。最佳实践是将max-age头设置为至少6个月,但此设置带有风险。启用后,必须始终支持HTTPS,否则用户可能无法访问网站。
- 最低TLS版本:除非用户可能使用不受支持或过时的Web浏览器或客户端,通常可安全启用最低TLS版本1.2。版本1.1、1.0和SSL版本2和3被认为不安全,尽管威胁概率低。
- 启用TLS 1.3:支持在Cloudflare边缘为Web服务器启用TLS 1.3。
更改后测试
部署Cloudflare Worker并更新Cloudflare Edge SSL/TLS选项后,检查是否对“安全头”评分产生影响。再次使用SecurityHeaders.io查看是否有改进。
更多工作 — CSP细化
我们评分 capped 在“A”,因为网站CSP中包含“unsafe-inline”选项。最终应去除这些,但可作为权宜之计使网站功能正常,同时构建更限制性CSP。重要的是,网站上使用的每个资源源应显式列在CSP中。“不安全”源包含是…“不安全”的。
辅助配置 — CSP即服务
有新产品可帮助根据现有网站资源确定基线CSP。新CSP方法“report-uri”指示Web浏览器向Web服务报告CSP违规,然后通知Web管理员问题。这类似于DMARC报告,允许域所有者接收潜在欺诈电子邮件报告,但此处警报是关于CSP违规。
存在一些CSP报告服务即服务产品。它们配置为用户浏览器CSP违规报告的接收者,聚合报告后提供适当的更新基线CSP。坦白说,无需产品也可自行完成:加载网页并检查开发者工具控制台中的CSP违规。无论如何,第三方服务可自动化部分单调工作,尤其对于非常大或复杂的网站,手动确认整个网站渲染和功能正常不可行。
CSP即服务提供商:
- https://csper.io/
- https://go.talasecurity.io/content-security-policy
- https://github.com/kravietz/cspbuilder
资源
- Cloudflare Workers: https://workers.cloudflare.com/
- 模板Worker: https://github.com/Relkci/cf-worker-header-injector/blob/main/worker.js
- SecurityHeaders.io: https://www.securityheaders.io
- 内容安全策略参考: https://content-security-policy.com/
- OWASP安全头项目: https://owasp.org/www-project-secure-headers/
- 修复Web服务器上缺失的安全头: https://www.blackhillsinfosec.com/fix-missing-content-security-policy-website/