使用Cloudflare Workers修复内容安全策略

本文详细介绍了如何利用Cloudflare Workers来配置和优化网站的内容安全策略(CSP),包括初始测试、Worker构建、策略细化及成本考量,提升网站安全评分并防范浏览器端安全风险。

使用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代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  let originalResponse = await fetch(request)
  let response = new Response(originalResponse.body, originalResponse)
  response.headers.set('X-Frame-Options', 'SAMEORIGIN')
  response.headers.set('Referrer-Policy', 'same-origin')
  response.headers.set('Content-Security-Policy', 'default-src \'self\' \'unsafe-inline\'')
  response.headers.set('Feature-Policy', 'camera \'none\'; geolocation \'none\'')
  response.headers.set('X-Content-Type-Options', 'nosniff')
  response.headers.set('X-XSS-Protection', '1; mode=block')
  response.headers.set('Permissions-Policy', 'camera=(), geolocation=(), microphone=()')
  return response
}

这是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即服务提供商:

资源

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计