Web 安全最佳实践

Web 安全的最佳做法

无论是从 Compute Engine 实例、Cloud Storage 存储桶还是位于 Google Cloud 外部的外部源站提供内容,Cloud CDN 和 Cloud Load Balancing 都可以帮助您遵循 Web 安全最佳实践。

设置安全标头

HTTP 规范具有多个标头,用于控制以下内容:

  • 客户端行为
  • 内容的嵌入方式
  • 如何跨网域传送内容
  • 连接到该网域时是否始终使用 TLS (HTTPS)

这些控制通常表示为 HTTP 响应标头,对于每个后端(在 CDN 术语中称为“源站”),这些标头都可以设置为 外部应用负载均衡器和 Cloud CDN 部署的自定义响应标头

如果您使用的是 Cloud Storage 并从存储桶传送 Web 内容,则可以在存储桶的前面使用 CDN,以设置 Web 安全标头并缓存热门内容。

下表对大部分实用的 Web 安全标头进行了定义。

标头名称 说明 用法示例
Strict-Transport-Security (HSTS) 在设置此标头之前,请确保您的网域具有有效的 SSL (TLS) 证书。

告知客户端必须通过 HTTPS (SSL/TLS) 直接连接到您的网域,从而避免从 HTTP 重定向到 HTTPS(这会导致速度变慢),并引入中间人攻击风险。

设置此标头实际上是不可逆转的。缓存此标头后,现代浏览器客户端不会尝试非 HTTPS 连接,并且即使 SSL 已关闭,用户也无法访问收到此标头的任何网域。此行为可防止攻击者将安全协议降级为不受保护的 HTTP(称为降级攻击)。

传送 Strict-Transport-Security 标头时,请谨慎添加 includeSubdomainspreload 指令。这些指令要求任何子网域都使用 HTTPS,包括同一网域上的所有内部网站。例如,从 example.com 传送时 support.example.com

对于将来的所有连接,都要求客户端直接通过 HTTPS 进行连接,缓存此指令的时间最长为两年:

Strict-Transport-Security: max-age=3104000

X-Frame-Options 指示浏览器是否可以使用 <frame>、<iframe>、<embed> 或 <object> 来呈现页面。这种方法不允许将内容嵌入任何其他网站,有助于防止点击劫持攻击。 拒绝网站的所有 iframe 操作:X-Frame-Options: DENY

仅允许您的网站 iframe (embed) 自身:X-Frame-Options: SAMEORIGIN

Content-Security-Policy 如需评估网站的内容安全政策,可以使用 Google 的 CSP 评估程序 不允许使用内嵌脚本,仅通过 HTTPS 加载脚本: Content-Security-Policy: default-src https:

在向现有网站引入新的安全标头时务必谨慎操作,因为它们可能会破坏第三方脚本、嵌入式内容(例如在 iframe 中)或您网站的其他方面。在更改生产流量之前,我们建议您创建后端存储桶或后端服务的第二个实例并进行测试。

您可以在 web.dev 和 Mozilla 的 infosec 网站上详细了解 Web 安全标头和最佳做法。

TLS 和证书管理

代管式证书具有以下特征:

  • 免费提供
  • 可轻松部署到负载均衡器
  • 自动续展
  • 全球分布于 Google 的所有边缘位置

TLS 可通过验证数据在传输过程中未被修改来提供真实性。TLS 证书通过确保窃听者无法确定用户和服务器之间交换的内容来保证机密性。这对于用户隐私和安全性至关重要。

通过使用 SSL 证书,您可以获得现代传输协议(如 HTTP/2 和 Google 的 QUIC 协议,这两种协议都需要 SSL (TLS))提供的优势。这些协议可直接提高 Web 内容的性能、媒体传送(如流式视频)速度以及拥塞网络的安全性。

Google Cloud 支持在 Cloud Load Balancing 和 Cloud CDN 服务中使用现代 TLS 协议(例如 TLS 1.3)。

您可以使用 SSL 政策提升最低 TLS 版本。如果您不需要支持旧版客户端(例如嵌入式设备)或旧版(超过 10 年以上)非浏览器客户端,我们建议您将版本提升到到 TLS v1.2。从全球范围来看,TLS v1.0 和 TLS v1.1 在 Google Cloud 连接中的占比低于 0.5%。 如果您需要识别或关联使用过时 TLS 版本的特定客户端,可以使用在请求标头中使用 {tls_version}。然后可以记录此信息。

后续步骤

  • 如需检查 Cloud CDN 是否正在从缓存传送响应,请参阅查看日志
  • 如需了解哪些内容可缓存或不可缓存,请参阅缓存概览
  • 如需查看 Cloud CDN 的接入点,请参阅缓存位置