1.
概述:为什么要对CDN资源URL做安全性检查
- CDN加速静态/动态资源,但公开URL容易被滥用导致带宽盗用或热链。
- 未受控的资源访问会增加源站负载,造成额外流量费用或服务故障。
- 在DDoS/爬虫高并发下,必须有访问控制以保护VPS/主机与域名资源。
- 合理校验可实现按需付费控制、带宽节约与合规审计。
- 本文针对签名URL、Referer校验、IP/地理限制、速率限制与日志监控给出实践与配置示例。
2.
签名URL(Signed URL)与短时Token机制
- 签名URL通过在URL中附带expire和signature参数,常见过期时间为300秒或3600秒。
- 推荐使用HMAC-SHA256对path+expiry+secret做签名,示例:sig=HMAC_SHA256("/file.jpg|1600000000", secret)。
- 示例生成(伪代码):signature = base64url(hmac_sha256(secret, path+"|"+expiry)); final_url = https://cdn.example.com/file.jpg?exp=1600000000&sig=xxxx。
- CloudFront/Cloudflare、Nginx+lua都支持签名校验,过期后返回403或410。
- 签名策略应包含nonce或IP绑定以防重放,建议short-lived token(<=600s)并配合Referer/UA检查。
3.
Referer与User-Agent联合校验
- Referer白名单可防止第三方站点热链,但Referer可伪造,需配合签名使用。
- 推荐策略:签名URL + 强制Referer校验(仅允许主站域名)作为二次校验。
- Nginx示例(伪配置): if ($http_referer !~* "^(https?://(www\.)?example\.com/)") { return 403; }。
- 对于API或内网调用,优先使用IP白名单或TLS客户端证书而非Referer。
- 对于移动App,可将签名与设备指纹/Authorization头绑定以提高安全性。
4.
IP白名单、地理封禁与速率限制
- 对管理面板、上传接口应仅允许固定IP或VPN段,例如:allow 203.0.113.0/24; deny all;。
- Geo-block可在CDN侧(按国家/地区)阻断异常流量,减少骨干带宽成本。
- 速率限制(rate limit)推荐在边缘实现:比如每IP每秒10个请求,burst=20。
- Nginx limit_req示例:limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;。
- 对于登录/上传等敏感接口,组合验证码、频率与IP惩罚机制(临时封禁)提升防护。
5.
源站防护与TLS/SNI配置(VPS/主机视角)
- 源站应仅允许来自CDN的回源访问:在防火墙中放行CDN IP段,其他IP阻断。
- 示例UFW规则(Ubuntu VPS):ufw allow from 198.51.100.0/24 to any port 443 proto tcp。
- 强制TLS 1.2+/ECDHE套件并启用HSTS,证书可用Let's Encrypt并绑定SNI到域名。
- Nginx回源头部需设置X-Forwarded-For与真实IP模块以便日志审计。
- 对高并发场景启用origin shielding或中间缓存层减少直接到源的连接数。
6.
日志、监控与告警(可操作的数据展示)
- 边缘与源站均应保留访问日志并推送到集中式系统(ELK、Prometheus、Grafana)。
- 建议日志字段:time, client_ip, url, referer, user_agent, status, bytes_sent, edge_node。
- 通过阈值告警(如5分钟内错误率>5%或每秒请求数>10000)触发自动化响应。
- 下表示例展示了某日边缘请求统计(单位:次/秒,错误率%):
| 时间窗口 | 平均RPS | 错误率 |
| 00:00-00:05 | 1200 | 0.4% |
| 12:00-12:05 | 5200 | 2.1% |
| 18:00-18:05 | 8900 | 5.6% |
- 结合日志可定位异常来源并调整防护规则或出具白名单/黑名单。
7.
真实案例:中小型站点抗带宽盗用方案(含配置数据)
- 背景:某电商站点,源站为Ubuntu 20.04 VPS(4 vCPU、8GB RAM、公网IP 203.0.113.10),峰值带宽30Gbps由CDN承担。
- 方案:使用CloudFront作边缘+源站仅允许CloudFront回源+签名URL(300s)+Nginx limit_req。
- 源站UFW配置示例:ufw default deny incoming; ufw allow from 13.32.0.0/15 to any port 443; ufw enable。
- Nginx回源日志示例行:203.0.113.10 - - [30/Jul/2026:12:00:01 +0800] "GET /file.jpg?exp=... HTTP/1.1" 200 10234 "-" "CloudFront"。
- 结果:实施后盗用流量下降95%,源站带宽占用从峰值120Mbps降至6Mbps,月度流量费用下降约70%。
8.
运维建议与总结性最佳实践清单
- 必须实现签名URL或短时Token并将过期时间控制在300-3600秒内,敏感资源建议<=300秒。
- 源站防火墙只放行CDN回源IP段,其他直接请求一律拒绝。
- 在边缘启用速率限制与WAF规则,结合Referer/UA做二次校验。
- 配置完善的日志采集与实时告警,异常带宽或错误率应自动触发防护策略。
- 定期演练(包括回源IP变更、证书更新、签名算法切换)确保在DDoS和业务高峰期稳定运行。