AWS S3预先签署了URL限制

时间:2014-07-22 19:59:19

标签: amazon-web-services amazon-s3

AWS S3预签名网址中每个对象的预签名网址数量是否有限制。说如果我想在2分钟内为每个对象创建1000个预先签名的URL。这是有效的情况吗?

3 个答案:

答案 0 :(得分:17)

您可以根据需要创建任意数量的已签名网址。但是,根据您的动机和策略,对于完全相同的对象,唯一预先签名的URL的数量存在实际限制。

S3(在2014年之前首次部署的S3区域)支持两种身份验证算法V2和V4,签名的URL看起来非常不同,因为算法非常不同。

在V2中,如果使用相同的AWS密钥签名,则给定过期时间的签名URL将始终保持相同。

如果您为某个对象的网址签名,请将其设置为将来一分钟...并立即重复此过程,这两个签名的网址将完全相同。

接下来,恰好一秒钟之后,为同一个对象签署一个URL,以便将来过期59秒,并且新签名的URL 也将是相同的。

为什么呢?因为在V2中,到期时间是UTC的绝对挂钟时间,并且实际生成签名URL时的历史记录中的特定时间不会更改任何内容。

V4与众不同。在上面的场景中,前两个仍然是相同的,但第二个不会,因为V4 auth包含您创建签名URL的日期和时间,或者您说的时间。到期时间相对于签名时间而不是绝对时间。

请注意,这两种形式的签名网址都是防篡改的 - 过期时间会嵌入到网址中,但是在签名后尝试对其进行调整会使签名无效并使其失效。

如果您需要为同一对象生成大量已签名的网址,则需要增加每次单独签名尝试的到期时间,以获取唯一值。 (编辑:或不,如果你感觉聪明......见下文)。

在我看来,您可能会认为S3在签名过程中有积极的作用,但事实并非如此。这一切都在您的本地代码中完成。

S3在任何意义上都不知道您生成的签名网址,除非或直到使用它们。当签名请求到达时,S3会执行与您的代码完全相同的操作 - 它会对请求的某些属性进行规范化,并生成签名。然后,它将生成的内容与代码应生成的内容进行比较,并给出相同的参数。如果他们生成的签名与您提供的签名匹配(并且您使用的密钥有权执行请求的操作),则请求成功。


更新:事实证明,有一种非官方机制允许您在签名过程中嵌入额外的“熵”,为其生成唯一的,每用户(例如)签名的URL对象和到期时间。

在V2身份验证中,它不会非常希望您在签名逻辑中包含非特定于S3的参数,它看起来很像一个错误和一个功能...添加&x-amz-meta-{anything-here}={unique-value-here}查询字符串参数到你的网址。这些在PUT请求中用作标题,但在GET请求中没有意义,但是,如果存在,S3仍然要求它们包含在签名计算中,即使参数键和值将最终被S3丢弃......但增加的值是防篡改的,不会在不使签名失效的情况下被恶意删除或更改。

同样的机制在V4中起作用,即使它有不同的原因。

对此技术的信任:http://www.bennadel.com/blog/2488-generating-pre-signed-query-string-authentication-amazon-s3-urls-with-user-specific-data.htm

答案 1 :(得分:1)

是。事实上,我认为AWS甚至无法限制,因为S3上没有这样的API调用。 URL签名完全由SDK完成。

但是,如果创建如此多的URL是个好主意,那么完全依赖于上下文......

答案 2 :(得分:1)

接受的答案现已过时。对于未来的观众,不需要包含任何额外标题,因为现在AWS在每个签名网址中都包含Signature字段,每次发出请求时都会有不同。