谷歌云存储中有没有办法让存储桶不公开,但它的对象是公开的

问题描述 投票:0回答:2

我正在使用 golang 存储客户端,并且还通过了 ACL 规则。

cloudObj := StorageClient.Bucket(BucketName).Object(fileName).NewWriter(ctx)
cloudObj.ACL = append(cloudObj.ACL, storage.ACLRule{Entity: storage.AllUsers, Role: storage.RoleReader})

这里我的存储桶是私有的,但上传文件后,当我尝试打开文件链接时,它显示 AccessDenied。不知道我哪里做错了。

go google-cloud-platform google-cloud-storage filewriter
2个回答
1
投票

是的,可以使用私有存储桶公开您的对象。您可以轻松地通过使用签名 URL 签名策略文档 来满足我认为您需要的特定要求(使您的用户能够执行操作,查看文件或上传具有公共访问权限的文件,而无需损害您的存储桶安全)

此外,即使已设置 ACL,您也将无法公开访问对象:

  • 如果存储您的对象的存储桶受 防止公众进入
  • 如果您的存储桶使用统一的存储桶级别访问。这件制服 存储桶级别访问策略有两个后果:
    • 它取消了存储桶和对象级别 ACL 的使用,因此无法在对象上创建新的 ACL 和之前创建的 ACL,如果 任何,均被撤销。
    • 它强制您的存储桶仅在与存储桶相关的所有操作(例如查看、列出和创建)中需要 IAM 权限 对象。因此,授予访问权限的唯一方法是通过 IAM。

您可以使用以下方法检查您的存储桶是否具有统一的存储桶级别访问权限:

gsutil uniformbucketlevelaccess get gs://BUCKET_NAME    //  where BUCKET_NAME is the name of the relevant bucket.

如果启用统一存储桶级别访问,则响应如下所示:

gs://my-bucket/ 的统一存储桶级别访问设置: 启用:真 锁定时间:LOCK_DATE

因此,为了满足您的要求,您必须为您的存储桶设置细粒度权限,这样您就可以一起使用 IAM 和访问控制列表 (ACL) 来管理权限。您可以在存储桶级别和每个单独的对象上指定访问权限并应用权限。

这是将对象的 ACL 设置为公开(单独一次性全部)的方法,尽管你的存储桶是私有的。

如果要使存储桶中的各个对象公开可读,请查看此 Go 代码示例 和 gsutil 命令

gsutil acl ch -u AllUsers:R gs://BUCKET_NAME/OBJECT_NAME

如果要使存储桶中的所有对象公开可读,请查看此 Go 代码示例 和 gsutil 命令

gsutil iam ch allUsers:objectViewer gs://BUCKET_NAME


0
投票

什么对我有用:

  • 删除存储桶上的公共访问阻止 - GCP 文档

然后:

  • 如果您想授予对存储桶中一个文件的访问权限:
    • 在删除公共访问阻止的同一页面中,“切换到细粒度”访问控制
    • 编辑文件的访问权限(就像您所做的那样)
  • 如果您想授予对存储桶中所有文件的访问权限:将“Storage Legacy Object Viewer”授予“allUsers”(注意:如果您使用“Storage Object Viewer”,您的存储桶将变为公开)

请注意,公共 URL 与经过身份验证的 URL 不同:

尝试从隐身浏览器打开第二个将会失败(除非您已公开您的存储桶)。

© www.soinside.com 2019 - 2024. All rights reserved.