Google Cloud Storage安全配置:限制存储桶仅对指定域名及认证用户开放
好问题!要实现这个需求,你可以通过**Google Cloud Storage的Bucket Policy(存储桶策略)或者IAM权限搭配Signed URLs(签名URL)**来搞定,分场景给你拆解:
一、仅允许特定网站域名(比如你的GCP应用)访问
这种场景适合让你的应用页面能直接发起下载请求,但禁止第三方直接访问文件链接。核心是通过IAM条件检查请求的Referer头:
- 打开GCP控制台,进入目标存储桶的页面
- 切换到「权限」标签页,点击「添加权限」
- 在「新成员」输入框中填
allUsers(先开放公开请求入口,再通过条件限制范围) - 选择角色为
Storage Object Viewer(授予查看/下载对象的权限) - 点击「添加条件」,设置规则:
- 条件类型选「请求」
- 运算符选「匹配」
- 属性选「referer」
- 值填入你的域名,比如
https://your-gcp-app-domain.com/*(支持通配符匹配子路径) - 若需要允许多个域名,可添加多条条件并设置为「OR」关系
- 保存配置后,只有来自指定域名的请求(比如你GCP应用页面发起的下载)能成功访问,直接在浏览器输入链接会因
Referer不匹配被拒绝。
注意:
Referer头存在被篡改的可能,若需要更严格的控制,建议结合下文的Signed URLs方案。
二、仅允许已认证用户下载
这里分两种常用实现方式,按需选择:
方式1:直接通过IAM授权给特定用户/组
适合固定的内部用户或团队成员访问:
- 若之前给
allUsers加过权限,先移除该配置 - 在存储桶权限页添加目标用户、服务账号或Google组,授予
Storage Object Viewer角色 - 配置完成后,只有已登录的授权用户(比如你GCP项目的成员)才能通过GCP控制台或授权客户端访问下载文件。
方式2:用Signed URLs临时授权已认证用户
适合需要给用户分发临时下载链接的场景(比如用户登录后获取专属链接):
- 你的后端服务(比如Cloud Function/Cloud Run)先完成用户身份验证(比如用Firebase Auth、Google Sign-In)
- 验证通过后,生成带过期时间的Signed URL——只有持有该URL的用户才能在有效期内下载
- 生成示例:
- 用
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
相关产品推荐
相关产品推荐

