预签名的URL和x-amz-acl

shy*_*ent 9 python amazon-s3 boto amazon-web-services

我想创建一个所谓的"预签名"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限制为"公共读取".

我的最后一句话是非常不正确的.

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

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

所以看来,那样

  1. x-amz-acl 标头不参与签名检查,因为您可以随意更改它并且请求成功.但是,在签名检查期间肯定考虑查询字符串参数.
  2. x-amz-acl 查询字符串参数不会直接影响对象的权限,因为它本身不执行任何操作.
  3. 如果您发送x-amz-acl标头,则生成的权限永远不会
    • 对于存储桶拥有者而言,它们比默认情况下更具限制性.
    • 对非桶主人的限制较少.
  4. 但是,对于非桶主人来说,它们可能更具限制性.也就是说,如果x-amz-acl=public-read在查询字符串中指定,则可以将x-amz-acl标头设置为authenticated-read而不是公共可读对象获取对象,该对象只能由经过身份验证的用户读取.

x-amz-acl QS参数与标题之间的真实关系是什么?有没有办法限制对象的权限,即通过PUT请求上传到所谓的"预签名"URL?

jdo*_*dot 6

据我了解(我在这里可能是错的),标头x-amz-acl优先于查询字符串参数——并且它们确实具有相同的目的。在签名检查期间仅考虑查询字符串参数的原因仅仅是因为标头不是策略签名检查的一部分。

此页面可能对您有帮助;在创建直接上传到 S3 的表单时,它对我帮助很大。