我的存储桶中的某些文件设置为 public-read
(ACL) . 所以我在某处读到设置存储桶策略可以自动将存储桶中的所有文件设置为私有 .
bucketname
是实际存储桶名称的占位符 . 我的存储桶政策是:
{
"Version": "2008-10-17",
"Id": "Policy1331182170360",
"Statement": [
{
"Sid": "Stmt1331182162671",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucketname/*"
}
]
}
在我的一个控制器中,我有:
s3 = Aws::S3.new(APP_CONFIG['amazon_access_key_id'], APP_CONFIG['amazon_secret_access_key'])
bucket_gen = Aws::S3Generator::Bucket.create(s3, APP_CONFIG['amazon_bucket_name'])
signed_url = bucket_gen.get("#{URI.unescape(URI.parse(URI.escape(@song.encoded_file_url)).path[1..-1])}", 10.minute)
redirect_to signed_url and return
我被重新指挥,但我一直拒绝访问 . 但是,如果我删除了存储桶策略,我会被重定向到已签名的网址,一切正常 .
最初,我认为我的网址签名方式存在问题 . 所以我打开了Amazon Web Console,并手动将文件权限设置为private . 对于此测试,我删除了存储桶策略 . 导航到文件URL(未签名),无法访问 . 这是正常的 . 在第二次测试中,我签署了URL并可以访问该文件 . 这意味着我签约的方式没有错 .
存储桶策略和签名网址之间是否存在冲突?
1 回答
这归结为身份验证(你是谁)与授权不同(你可以做什么) . 签名URL只是一种将自己作为特定AWS用户进行身份验证的方式(而不仅仅是匿名),它不会授予任何特殊授权 .
一旦身份验证发生并且亚马逊知道您是谁,它仍然需要决定是否允许您执行所请求的操作 . 您的存储桶策略说没有人可以访问文件,因此请求被拒绝see the policy docs为什么您的存储桶策略评估这种方式
如果您的策略说您的用户可以访问文件但是其他任何人都无法访问您的签名网址(这基本上是私有方式,当您执行单独的文件权限时)
如果您在策略中添加一个语句
然后你应该可以使用你签名的网址(显然用你的aws账号替换1234-5678-9012 . 如果你使用的是IAM,那么网络控制台的iam位有这些用户的标识符)