2011-05-04 34 views
14

我有以下斗政策我斗设置生成的URL没有限制:亚马逊S3斗政策 - 限制被引用者的访问,但如果是通过查询字符串身份验证

{ 

"Version": "2008-10-17", 

"Id": "My access policy", 

"Statement": [ 

    { 

"Sid": "Allow only requests from our site", 

"Effect": "Allow", 

"Principal": { "AWS": "*"}, 

"Action": "s3:GetObject", 

"Resource": "arn:aws:s3:::my_bucket/*", 

"Condition": { 

    "StringLike": { 

     "aws:Referer": [" http://mydomain.com/*"," http://www.mydomain.com/*"] 

     } 

       } 

}, 

{ 

    "Sid": "Dont allow direct acces to files when no referer is present", 

    "Effect": "Deny", 

    "Principal": {"AWS": "*" }, 

    "Action": "s3:GetObject", 

    "Resource": "arn:aws:s3:::my_bucket/*", 

    "Condition": { 

    "Null": {"aws:Referer": true } 

     } 

     } 

] 

    } 

我还配置query string authentication,但它看起来像我不能拥有两个。如果我的存储桶策略设置为拒绝任何不源自mydomain的请求,那么使用查询字符串身份验证的临时URL也将无法提供服务。所以我的问题是,我怎么能有两个?有没有办法检查URL参数,看看它是否有一个名为“签名”的参数,在这种情况下不应用引用策略?

回答

18

删除引用者字符串“http://mydomain.com/ *”中的空格,这是错误的...亚马逊的例子也犯了这个错误。

对于第二个语句来解决它的更简单的方法是删除整个语句,让你的文件的权限(ACL)中设置为私有(所有者读/写和世界拒读/ NOWRITE)

我不确定,但出现即使您有拒绝声明,如果文件具有公共权限(世界读取),仍然可以读取文件。

另外,如果您要在CloudFront上发布文件,请记住允许它读取存储桶。因此,一个完整的桶政策将是这样的:

{ 
"Version": "2008-10-17", 
"Id": "YourNetwork", 
"Statement": [ 
    { 
     "Sid": "Allow get requests to specific referrers", 
     "Effect": "Allow", 
     "Principal": { 
      "AWS": "*" 
     }, 
     "Action": "s3:GetObject", 
     "Resource": "arn:aws:s3:::yourbucket/*", 
     "Condition": { 
      "StringLike": { 
       "aws:Referer": [ 
        "http://www.yourwebsite.com/*", 
        "http://yourwebsite.com/*" 
       ] 
      } 
     } 
    }, 
    { 
     "Sid": "Allow CloudFront get requests", 
     "Effect": "Allow", 
     "Principal": { 
      "AWS": "arn:aws:iam::12345678:root" 
     }, 
     "Action": "s3:GetObject", 
     "Resource": "arn:aws:s3:::yourbucket/*" 
    } 
] 
} 

(改变12345678您的AWS帐户ID号,不含破折号)

+0

感谢您的回答。这些信息稍后会派上用场。目前我使用不同截止时间的签名链接用于不同的目的。 – blushrt 2011-06-29 09:48:20