以下假设存储桶名称为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