【问题标题】:Fetching a deleted object from S3 causes access denied error从 S3 获取已删除的对象会导致访问被拒绝错误
【发布时间】:2020-01-03 14:38:18
【问题描述】:

我有一些从 S3 请求对象的代码。如果它不存在,则会引发一个异常,其中包含消息...

The specified key does not exist.

创建对象后,如果随后将其删除,则重新请求对象时不会引发相同的异常。相反,它说访问被拒绝。

这是为什么?有没有办法删除一个不被 S3 记住的对象?已禁用存储桶上的版本控制。

我正在使用分配给分配给 EC2 实例的角色的策略。如果我删除策略上的权限集并重新创建它,那么问题就会被重置。

此外,如果我将策略设置为所有资源和所有操作,则不会发生此问题。

【问题讨论】:

  • 有趣。您确定您使用的是相同(或等效)的凭据吗?这就是事情的运作方式,afaik。如果对象不存在,您将获得以下两种响应之一:AccessDenied 如果您无权列出该对象,NoSuchKey 如果您有权列出该对象(尽管它可能需要 head,而不是 list,我不是 100% 确定)。前者的原因是为了防止未经授权的攻击者确定对象的存在。
  • 当您在 s3 中创建对象时,您将始终拥有它,并且它还会被复制到其他可用区域,出现访问被拒绝的唯一原因是:1. 您的 iam 角色确实没有附加正确的策略 2. 您使用了错误的凭据或配置文件但是如果您删除它,那么您将拥有最终的一致性,这意味着即使您删除了该对象它可能仍然存在一段时间,这就是为什么 s3 有什么叫eventual consistency
  • 如果你只是等待几分钟然后重试,AccessDenied会被NoSuchKey代替吗?
  • @jarmod 十分钟后仍然拒绝访问。
  • 您从未说明您为实例配置文件使用的角色授予了哪些特定的 S3 权限。如前所述,如果它们不包含s3:ListBucket,那么对不存在对象的请求将返回access denied,而不是大多数人期望的404响应。如果向角色添加管理员权限解决了您的问题,那么您没有正确设置 S3 权限

标签: amazon-web-services amazon-s3


【解决方案1】:

我错过了政策中的ListBucket 操作。

但它只需要读取已删除的对象。

可以说,这是一个错误。至少,这是一个不一致的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 2017-07-28
    • 1970-01-01
    • 2017-06-16
    • 2021-10-14
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多