身份验证后无法访问匿名上传的 S3 对象

Posted

技术标签:

【中文标题】身份验证后无法访问匿名上传的 S3 对象【英文标题】:Unable to access anonymously uploaded S3 objects when authenticated 【发布时间】:2016-01-28 00:04:22 【问题描述】:

我有一个采用此策略的 S3 存储桶:


    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        ,
        
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::my-bucket"
        
    ]

无需任何身份验证即可从任何 Web 客户端上传和删除对象,例如卷曲。

但是,如果我作为 IAM 用户进行身份验证(没有任何策略,甚至没有 AmazonS3ReadOnlyAccess 策略),我在尝试访问 (GET) 匿名上传的对象时会收到 403 错误.可以访问非匿名(例如通过 S3 控制台)上传的其他对象。发生了什么?

回顾一下:

匿名用户: 可以上传文件到桶中 可以自己或任何其他用户从bucket上传中下载文件 经过身份验证的 IAM 用户: 可以上传文件到桶中 可以自己从bucket上传下载文件 无法下载匿名用户上传的文件

PS:根据 IAM Policy Simulator,匿名上传的文件应该是 IAM 用户可以下载的。

【问题讨论】:

【参考方案1】:

这其实是expectedbehavior:

不可能有一个匿名的 Put 到 S3 和一个私有的 Get。原来匿名用户拥有该对象。

我犯的错误是假设使用* 主体设置策略意味着“每个人”,而实际上只意味着“匿名用户”。一个用户(包括特殊的匿名用户)“拥有”的对象不能被另一个用户访问(除非你要对我假设的对象本身设置策略)。其他用户可以“看到”该对象,因为它有权“列出”存储桶,但这并不意味着它可以读取其内容。

【讨论】:

+1 用于寻找解决方案。我怀疑* 不限于唯一的匿名用户,但实际上我或其他任何人都可以使用我的凭据上传到您的存储桶,然后我将拥有该对象。如果我没有授予您阅读它的权限,您就不能——您所能做的就是删除它,因为我拥有该对象,但您拥有存储桶。允许匿名上传到 S3 的好案例并不多。 其实我很确定,即使桶上允许匿名上传,但如果经过身份验证,您将无法上传。因为只允许匿名用户。下载时肯定会发生这种情况。

以上是关于身份验证后无法访问匿名上传的 S3 对象的主要内容,如果未能解决你的问题,请参考以下文章

我在服务器上的iis上的身份验证选项中去掉了匿名访问,启用了集成windows身份验证

Spring Security 3.1.4:由于anonymousUser身份验证无法访问目标页面

即使 IAM 策略授予访问权限,Web 应用程序也无法访问私有 s3 文件

在 IIS 中禁用匿名身份验证后 WebServiceHost 无法正常工作

使用 AWS cognito 进行匿名身份验证

Blazor 使用 Azure AD 身份验证允许匿名访问