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

Google Cloud Storage安全配置:限制存储桶仅对指定域名及认证用户开放

好问题!要实现这个需求,你可以通过**Google Cloud Storage的Bucket Policy(存储桶策略)或者IAM权限搭配Signed URLs(签名URL)**来搞定,分场景给你拆解:

一、仅允许特定网站域名(比如你的GCP应用)访问

这种场景适合让你的应用页面能直接发起下载请求,但禁止第三方直接访问文件链接。核心是通过IAM条件检查请求的Referer头:

  1. 打开GCP控制台,进入目标存储桶的页面
  2. 切换到「权限」标签页,点击「添加权限」
  3. 在「新成员」输入框中填allUsers(先开放公开请求入口,再通过条件限制范围)
  4. 选择角色为Storage Object Viewer(授予查看/下载对象的权限)
  5. 点击「添加条件」,设置规则:
    • 条件类型选「请求」
    • 运算符选「匹配」
    • 属性选「referer」
    • 值填入你的域名,比如https://your-gcp-app-domain.com/*(支持通配符匹配子路径)
    • 若需要允许多个域名,可添加多条条件并设置为「OR」关系
  6. 保存配置后,只有来自指定域名的请求(比如你GCP应用页面发起的下载)能成功访问,直接在浏览器输入链接会因Referer不匹配被拒绝。

注意:Referer头存在被篡改的可能,若需要更严格的控制,建议结合下文的Signed URLs方案。

二、仅允许已认证用户下载

这里分两种常用实现方式,按需选择:

方式1:直接通过IAM授权给特定用户/组

适合固定的内部用户或团队成员访问:

  • 若之前给allUsers加过权限,先移除该配置
  • 在存储桶权限页添加目标用户、服务账号或Google组,授予Storage Object Viewer角色
  • 配置完成后,只有已登录的授权用户(比如你GCP项目的成员)才能通过GCP控制台或授权客户端访问下载文件。

方式2:用Signed URLs临时授权已认证用户

适合需要给用户分发临时下载链接的场景(比如用户登录后获取专属链接):

  1. 你的后端服务(比如Cloud Function/Cloud Run)先完成用户身份验证(比如用Firebase Auth、Google Sign-In)
  2. 验证通过后,生成带过期时间的Signed URL——只有持有该URL的用户才能在有效期内下载
  3. 生成示例:
    • 用gcloud命令生成:
      gcloud storage sign-url gs://your-bucket/your-file.txt --duration 1h --service-account your-service-account@your-project.iam.gserviceaccount.com
      
    • 用Python代码生成:
      from google.cloud import storage
      from datetime import timedelta
      
      def generate_signed_url(bucket_name, blob_name):
          storage_client = storage.Client()
          bucket = storage_client.bucket(bucket_name)
          blob = bucket.blob(blob_name)
      
          url = blob.generate_signed_url(
              version="v4",
              expiration=timedelta(hours=1),
              method="GET",
          )
          return url
      

这种方式无需公开存储桶权限,安全性更高,还能灵活控制链接有效期。

三、混合场景:允许特定域名 + 已认证用户

如果想同时满足两种访问条件(要么来自指定域名,要么是已认证用户),可以在IAM条件中设置OR规则:

  • 给allUsers添加Storage Object Viewer权限,条件设置为:
    (request.referer matches "https://your-domain.com/*") OR (principal.type = "user")
    

这样来自指定域名的请求,或是已登录的Google用户都能正常访问文件。

内容的提问来源于stack exchange,提问作者Tiocrash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:11:13