1.
目标:在内容从发布端到用户浏览器的链路上,尽量防止第三方(包括 CDN 配置被攻破的场景)篡改页面或静态资源,并在发生篡改时能及时发现与回滚。
威胁点:发布者端上传(CI/CD)、构建产物、Origin 源站、CDN 控制台/API、CDN 缓存内容、传输层(HTTP)被劫持、浏览器端资源加载被替换。
2.
要点:最小权限原则、可验证性(签名/哈希)、可追溯性(审计日志)、快速回滚(版本化 + 缓存控制)、检测与告警。
实现方向:在构建产物上生成不可篡改的校验(SRI/签名/清单),通过强 TLS 和 origin-auth 保证传输与源站认证,限制 CDN 控制台权限并启用监控比对。
3.
步骤一(生成哈希):在 CI 中对所有静态资源(JS/CSS/图片)计算 SHA-256 哈希,例如:
命令示例:openssl dgst -sha256 -binary file.js | openssl base64 -A (结果用于 SRI:sha256-xxxxx)
步骤二(生成清单 manifest.json):将资源 URL、版本号、sha256 哈希放入 manifest.json,示例字段:{ "file.js":"sha256-XXX", "v":"20260701-001" }。
步骤三(对 manifest.json 签名):使用机构或产品私钥签名 manifest,示例命令:
openssl dgst -sha256 -sign private.pem -out manifest.sig manifest.json;openssl base64 -in manifest.sig -A > manifest.sig.b64
4.
将构建好的 SRI 值注入到 HTML/模板:
<script src="/static/file.js" integrity="sha256-BASE64..." crossorigin="anonymous"></script>
对于动态注入脚本也应使用 nonce 或 CSP(见下一段)。SRI 可阻止 CDN 返回被篡改的脚本被执行(适用于静态文件)。
5.
在页面首次加载时通过 HTTPS 请求获取 manifest.json 与 manifest.sig.b64,然后在客户端用预置的公钥验证签名(或由服务端验证后注入可信 manifest)。
若验证失败,客户端应拒绝加载对应资源并上报错误:示例流程:获取 manifest → base64 解码签名 → 使用 WebCrypto verify/或由后端验证再决定加载。
6.
步骤:关闭 CDN 控制台的公共权限,启用 IAM 角色与最小权限,强制 MFA;对 API Key 设 IP 白名单与访问时限。
启用 Origin Authentication:在 CDN 上配置“Origin Pull Headers”或使用客户端证书(mTLS)。示例:设置 CDN 在向 Origin 拉取时追加自定义头 X-Origin-Auth:
设置缓存规则:静态资源使用版本化 URL(带 hash 或版本号),缓存长期有效;变更通过版本化和缓存清理控制。避免在未版本化的 URL 上缓存可写内容。
7.
在 Origin 与 CDN 之间、以及 CDN 与浏览器之间均强制 HTTPS,最小 TLS 版本 1.2/1.3,并开启 OCSP stapling 和 HSTS。
配置 HTTP 安全头:Content-Security-Policy(限定脚本源)、X-Content-Type-Options: nosniff、Referrer-Policy、Cross-Origin-Resource-Policy。CSP 可限制内联脚本并与 SRI 结合使用。
8.
CI/CD 流程示例:
1) 构建静态资源;2) 生成 SRI 哈希与 manifest.json;3) 用私钥签名 manifest;4) 将资源上传到 Origin + CDN(通过认证);5) 更新页面模板引用新的版本化 URL 与 SRI。
回滚:若发现篡改或错误,立即切回上一版本化 URL,或禁用 CDN 的可疑节点并触发缓存清除(CDN API),同时撤销被泄露的 API Key 并重新签发。
9.
持续比对:定时脚本从 CDN 拉取资源并校验 SHA-256 与签名;若校验失败,触发自动告警(短信/邮件/PagerDuty)。
日志与审计:启用 CDN 与源站的访问日志、控制台操作日志并将其集中到 SIEM。对异常配置变更(如新增边缘规则)要有审批流程与邮件确认。
10.
答:SRI 可以阻止被篡改的静态资源在浏览器端执行,但前提是资源使用了 SRI 且是静态可哈希的文件。对于 HTML 页面或动态生成的内容,SRI 无效,因此还需签名清单、CSP、以及对 manifest 的签名与运行时验证来实现更全面保护。
11.
答:优先三步走:1) 在构建阶段为静态资源生成 SRI 并注入到 HTML(自动化改造最小);2) 对 manifest.json 进行签名并由后端在渲染时验证后注入可信 manifest;3) 逐步强化 CDN 配置(启用 origin auth、锁控制台权限)和开启监控。这样能在最小入侵下获得显著安全提升。
12.
答:立即执行:1) 通过 CDN 控制台或 API 禁用可疑节点/边缘规则;2) 回滚到已签名的上一版本 URL 并清除 CDN 缓存;3) 撤销与重置可能泄露的 API Key/凭证与密钥;4) 启动事后审计与补救(收集日志、通知用户、修复漏洞)。
