私有云存储安全加速与防盗链中转方案
1. 方案架构图
本方案通过 Nginx 作为中转网关,屏蔽存储原站(OSS/S3 等)地址,利用后端程序的动态签名机制实现极高安全性的资源访问。
访问链路:
用户浏览器 <——> Nginx 中转服务器 (cdn.example.com) <——> 私有对象存储 (OSS/S3)
2. Nginx 中转配置(全量模板)
在 Nginx 中,通过校验 Sec-Fetch-Dest 和 Referer 实现行为级拦截,并强制浏览器不缓存敏感文件的授权状态。
Nginx
server {
listen 80;
listen 443 ssl;
listen [::]:443 ssl;
listen [::]:80;
server_name example.com; # 替换为你的域名
location / {
# --- 核心转发:指向 OSS 外网域名 ---
proxy_pass http://your-bucket.oss-cn-region.aliyuncs.com;
proxy_set_header Host your-bucket.oss-cn-region.aliyuncs.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# --- 缓存配置 ---
proxy_cache your_cache_zone; # 替换为你的缓存空间名
proxy_cache_valid 200 1h;
proxy_cache_key $host$uri$is_args$args;
add_header X-Cache-Status $upstream_cache_status;
add_header Cache-Control "public, max-age=3600";
}
# SSL 基础配置
http2 on;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
ssl_certificate /etc/nginx/ssl/fullchain.pem; # 替换为实际证书路径
ssl_certificate_key /etc/nginx/ssl/privkey.pem; # 替换为实际私钥路径
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}
3. 存储策略与动态签名设置
仅靠 Nginx 拦截 Referer 是不够的,核心安全在于存储策略的“签名 URL”。
3.1 存储原站设置
- 访问权限:必须设置为 “私有”(Private)。禁止任何不带签名的直接访问。
- 跨域 (CORS):在存储后台设置允许的
Origin(如https://cloud.example.com)。
3.2 业务系统设置
在业务系统(如 Cloudreve 或其他网盘程序)中进行如下配置:
- CDN 域名:填写 Nginx 中转域名
https://cdn.example.com。 - 安全链接/签名 URL:
- 开启状态:开启(强制所有外链带 Signature 参数)。
- 有效期:建议设置为 60~300 秒。短时效链接即使被抓包,也会在极短时间内失效。
4. 防御逻辑分析
| 防护维度 | 实现逻辑 | 攻击者视角 | |||
|---|---|---|---|---|---|
| 物理阻断 | OSS 私有读写 | 直接访问原站 URL,OSS 提示 AccessDenied。 |
|||
| 时效锁定 | 动态签名 URL | 拿到带签名的 URL 转发给别人,1 分钟后链接自动作废。 | |||
| 行为识别 | Sec-Fetch-Dest拦截 |
在浏览器地址栏输入图片 URL,Nginx 直接返回 403。 | |||
| 来源锁定 | valid_referers |
在其他网站盗链使用 <img>标签,Nginx 校验失败。 |
|||
| 零信任缓存 | no-cache响应头 |
浏览器无法“记忆”访问权限,每次打开文件都必须经过服务器实时审查。 |
5. 运维注意事项
在更新 Nginx 配置或修改签名规则后,由于 Nginx 磁盘缓存可能存有旧的授权记录,建议执行以下清理命令:
Bash
# 物理清理缓存目录(路径需对应配置)
rm -rf /www/sites/cdn.example.com/cache/*
# 重载 Nginx 服务
nginx -s reload
这份文档已经完全去标识化。如果你的 Cloudreve 后台版本更新导致界面变化,只需要记住核心逻辑:开启签名、缩短有效期、并在 Nginx 中透传 $args 参数即可。
文章作者:Kaelen
文章链接:https://kaelen.top/archives/wei-ming-ming-wen-zhang-nSnzD5wA
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议,转载请注明出处!
评论