如何限制Google Cloud Storage存储桶仅允许特定域名访问
如何让Google Cloud Storage对象仅允许特定网站访问(无需公开存储桶)
你之前尝试用域名作为IAM主体的思路是错的——GCS的IAM系统只认Google Cloud官方的身份类型(比如用户账号、服务账号、allUsers、allAuthenticatedUsers等),域名不属于合法的IAM主体范畴,所以这种配置完全无效。
下面是两种可靠的实现方案:
方案1:签名URL(推荐用于静态资源场景)
签名URL是给对象生成带有效期的临时访问链接,只有持有该URL的请求才能访问对象。你可以在网站后端生成签名URL,用户访问网站时,前端加载的是后端返回的签名链接,直接访问GCS原始路径会被拒绝。
操作步骤:
- 创建一个服务账号,给它赋予目标存储桶/对象的
Storage Object Viewer角色 - 在网站后端用Google Cloud客户端库(Python、Node.js等),通过服务账号密钥生成签名URL
- 网站前端展示生成的签名URL,而非GCS对象的原始路径
Python示例代码:
from google.cloud import storage from datetime import timedelta def generate_gcs_signed_url(bucket_name, blob_name): storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_name) # 生成有效期15分钟的GET请求签名URL signed_url = blob.generate_signed_url( version="v4", expiration=timedelta(minutes=15), method="GET", ) return signed_url
方案2:Cloud CDN + 签名Cookie(适合大量静态资源+自定义域名场景)
如果你的网站使用Cloud CDN加速GCS资源,可以通过签名Cookie限制仅特定域名能访问:
- 将GCS存储桶配置为Cloud CDN的后端存储
- 在Cloud CDN中设置签名Cookie规则,指定允许的访问域名
- 在网站后端生成签名Cookie,用户访问网站时自动带上该Cookie,CDN才会放行请求
辅助补充:CORS规则(仅浏览器端限制)
CORS只能限制浏览器的跨域请求,无法阻止服务器端的直接请求,所以必须配合上面两种方案使用:
- 创建CORS配置文件
cors-config.json:
[ { "origin": ["https://your-website-domain.com"], "method": ["GET"], "responseHeader": ["Content-Type"], "maxAgeSeconds": 3600 } ]
- 用gsutil命令应用配置:
gsutil cors set cors-config.json gs://your-bucket-name
关键注意点:
- 永远不要试图用域名作为IAM主体,这不符合GCS的权限模型
- 签名URL/Cookie是服务端控制访问的核心手段,能确保只有通过你的网站才能获取有效访问路径
- CORS仅作浏览器层面的辅助限制,不能替代IAM或签名机制的安全防护
内容的提问来源于stack exchange,提问作者allforthenoob
相关产品推荐
相关产品推荐

