谷歌存储桶文件链接可公开访问,即使不公开?

时间:2018-10-30 18:22:58

标签: google-cloud-platform google-cloud-storage google-cloud-functions

我在和Google bucket玩耍。该存储桶不是公开的。这些文件也不公开。

上传.csv文件后。我单击它,它在谷歌浏览器的浏览器中显示带有复杂的URL链接的文件。

现在,如果我采用该链接并在没有google帐户登录的IE之类的其他浏览器中打开。我可以获取数据。这是缺陷吗? Google小组说这是权限问题。我尝试通过删除所有权限来尝试该操作,但该文件仍可访问。您是否在使用存储桶时遇到同样的问题?

1 个答案:

答案 0 :(得分:1)

以下内容假设存储桶名称为xtest,对象名称为test.txt

这个冗长而复杂的URL包含一个签名,该签名提供了访问对象的权限。

如果该URL看起来非常复杂并且看起来不是这样,则它可能具有签名作为URL的一部分。

http://xtest.storage.googleapis.com/test.txt

OR

http://storage.googleapis.com/xtest/test.txt

如果URL不包含允许任何人访问存储桶对象的签名,则下一步是确定已应用了哪些权限以允许匿名访问。

弄清楚对存储桶和对象应用了哪些权限。

我更喜欢使用CLI gsutil,以便使用精确的JSON描述所有权限。

有两种方法可以授予对存储桶和对象的访问权限。值区ACL和值区IAM策略。

PART 1-存储段ACL

获取存储桶ACL。

gsutil acl get gs://xtest

这将返回JSON响应。如果存储桶acl包含以下任一条目,则您的存储桶已暴露。

[
  {
    "entity": "allUsers",
    "role": "READER"
  },
  {
    "entity": "allAuthenticatedUsers",
    "role": "READER"
  }
]

删除公共权限。

allUsers实体允许任何人使用role指定的权限。 allAuthenticatedUsers实体允许拥有Google帐户的任何人获得role指定的权限。

此命令将从存储桶ACL中删除allUsers

gsutil acl ch -d allUsers gs:/xtest

此命令将从存储桶ACL中删除allAuthenticatedUsers

gsutil acl ch -d allAuthenticatedUsers gs:/xtest

更改存储桶或文件上的ACL时,大约需要一分钟时间才能生效。

重复该对象的过程:

gsutil acl get gs://xtest/test.txt

使用类似的命令删除所有公共ACL:

gsutil acl ch -d allUsers gs://xtest/test.txt

gsutil acl ch -d allAuthenticatedUsers gs://xtest/test.txt

重复验证是否已删除公共ACL。

gsutil acl get gs://xtest

gsutil acl get gs://xtest/test.txt

第2部分-存储区IAM策略

获取存储区IAM策略。

gsutil iam get gs://xtest

这将返回JSON响应。如果存储区IAM策略包含以下任一条目,则显示您的存储区。

{
  "bindings": [
    {
      "members": [
        "allUsers"
      ],
      "role": "roles/storage.legacyBucketReader"
    },
    {
      "members": [
        "allAuthenticatedUsers"
      ],
      "role": "roles/storage.objectViewer"
    }
  ],
  "etag": "CBM="
}

删除公共权限。

allUsers实体允许任何人按角色指定权限。 allAuthenticatedUsers实体允许具有Google帐户的任何人按角色指定的权限。

此命令将从存储区IAM策略中删除所有用户。

gsutil iam ch -d allUsers gs://xtest

此命令将从存储区IAM策略中删除所有AuthenticatedUsers。

gsutil iam ch -d allAuthenticatedUsers gs://xtest

重复该对象的过程:

gsutil iam get gs://xtest/test.txt

使用类似的命令来删除所有公共对象IAM策略:

gsutil iam ch -d allUsers gs://xtest/test.txt

gsutil iam ch -d allAuthenticatedUsers gs://xtest/test.txt

重复验证是否已删除公共IAM策略。

gsutil iam get gs://xtest

gsutil iam get gs://xtest/test.txt