You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:53:20