预签名的URL和x-amz-acl

时间:2012-12-15 20:12:50

标签: python amazon-web-services amazon-s3 boto

我想创建一个所谓的“预签名”URL,用于将特定对象(PUT)上传到Amazon S3存储桶。

到目前为止一切顺利。我正在使用python库boto来创建一个URL,其中包含所有必需的东西(过期,签名等)。 URL如下所示:

  

https://<bucketname>.s3.amazonaws.com/<key>?Signature=<sig>&Expires=<expires>&AWSAccessKeyId=<my key id>&x-amz-acl=public-read

注意最后一个参数。

至少,正如我所理解的那样,这限制了使用此URL将对象上传到特定存储桶中的特定键的人,并且还将将在对象上设置的固定ACL限制为“公共读取”。 / p>

我的上一个陈述是非常不正确的。

事实证明,如果您使用此网址,则可以使用x-amz-acl 标头执行以下操作(而不是查询字符串参数具有相同名称,您必须设置签名检查才能成功):

  1. 将其设为“公开阅读”。对象的权限将包含两个条目:“读取”表示“所有人”,“完全控制”表示存储桶拥有者。这是非常期待的。
  2. 省略x-amz-acl标头。对象的权限将与每个桶的默认值相同(存储桶拥有者具有完全控制权)。为什么?
  3. 将其设置为“public-read-write”。结果与(1)完全相同。
  4. 将其设置为“authenticated-read”。 “经过身份验证的用户”获得“读取”权限,存储桶拥有者可以完全控制。
  5. 将其设置为“bucket-owner-read”。结果与(2)完全相同。存储桶拥有者具有完全控制权,未定义任何其他权限。
  6. 将其设置为“bucket-owner-full-control”。不出所料,斗主将拥有完全控制权。
  7. 将其设置为不存在的固定ACL名称并收到错误。
  8. 所以看来,

    1. x-amz-acl 标头不参与签名检查,因为您可以随意更改它并且请求成功。但是,在签名检查期间,查询字符串参数肯定是
    2. x-amz-acl 查询字符串参数不会直接影响对象的权限 ,因为它本身没有任何作用。
    3. 如果发送x-amz-acl标头,则生成的权限永远不会
      • 对存储桶拥有者的限制比默认情况下更严格。
      • 对非桶主人的限制较少。
    4. 但是,对于非存储桶拥有者,它们可以更具限制性。也就是说,如果在查询字符串中指定x-amz-acl=public-read,则可以将x-amz-acl标头设置为authenticated-read,而不是公共可读对象获取对象,只能通过身份验证读取用户。
    5. x-amz-acl QS参数与标题之间的真实关系是什么?有没有办法限制对象的权限,即通过PUT请求上传到所谓的“预签名”URL?

2 个答案:

答案 0 :(得分:4)

据我了解(我可能在这里错了),标题x-amz-acl优先于querystring参数 - 它们的作用相同。在签名检查期间仅考虑querystring参数的原因仅仅是因为标头不是策略签名检查的一部分。

This page可能对您有所帮助;在创建直接上传到S3的表单时,它帮了我很多忙。

答案 1 :(得分:-1)

您似乎使用了错误的acl参数名称。根据他们的签名请求指南,尝试使用acl:

Signing and Authenticating REST Requests

  

如果请求解决了子资源,例如?版本控制,?位置,?acl,?torrent,?lifecycle或?versionid附加子资源,其值(如果有)和问号。请注意,在多个子资源的情况下,子资源必须按子资源名称按字典顺序排序,并以“&amp;”分隔。例如?ACL&安培; VERSIONID =值

     

构造CanonicalizedResource元素时必须包含的子资源列表包括:acl,生命周期,位置,日志记录,通知,partNumber,策略,requestPayment,torrent,uploadId,uploads,versionId,版本控制,版本和网站。