【问题标题】:google storage bucket file link publicly accessible even though not public?即使不公开,谷歌存储桶文件链接也可以公开访问?
【发布时间】:2019-04-03 20:45:40
【问题描述】:

我在玩谷歌存储桶。存储桶不是公开的。这些文件也不公开。

上传 .csv 文件后。我点击它,它会在 google chrome 的浏览器中显示带有 loooong 复杂 url 链接的文件。

现在,如果我使用该链接并在没有登录谷歌帐户的 IE 等其他浏览器中打开。我可以访问数据。这是一个缺陷吗?谷歌团队说这是权限问题。我通过删除所有权限进行了尝试,但该文件仍然可以访问。您是否看到与您的存储桶相同的问题。

【问题讨论】:

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


    【解决方案1】:

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

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

    如果 URL 看起来很复杂并且看起来不像这样,那么它可能有一个签名作为 URL 的一部分。

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

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

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

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

    我更喜欢使用 CLI gsutil,这样我就有准确的 JSON 描述所有权限。

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

    第 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 策略中删除 allAuthenticatedUsers。

    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

    【讨论】:

    • loooong 复杂链接实际上是一个临时链接,它会在几分钟内到期。但我正在与谷歌核实,看看我们如何进一步限制。
    • 告诉我你学到了什么。我正在撰写有关 Google Cloud 身份验证、凭据和访问令牌的文章。我也打算深入研究临时对象授权 (URL)。链接:jhanley.com
    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 2017-02-10
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多