amazon-web-services - AWS S3:无法从具有公共访问权限的存储桶中获取非拥有对象(通过非身份验证方式)
问题描述
所以情况如下:
- 我有一个 Bucket B。它由帐户 A_1 所有
- 此存储桶对所有内容都具有公共读取访问权限(通过存储桶策略和 ACL。我将两者都放在只是为了尝试,但没有结果)
- 这个bucket可以被账户A_2写入,只有bucket-owner-full-control ACL
- 存储桶配置为通过 Cloudfront 为对象提供服务
--> 在 S3 控制台中浏览时,A_2 上传的文件正确地将完全控制权交给了 A_1
但是 - Cloudfront 在 A_2 拥有的文件上获得访问被拒绝(在 A_1 拥有的文件上运行良好) - 使用 S3 Web url,我可以访问 A_1 拥有的文件(存储桶上的公共 ACL)但不是 A_2 拥有
问题:为什么存储桶策略不适用于 A_2 拥有的 A_1 具有 FULL_CONTROL 的文件?
注意 - 我能够通过为我的云端创建访问身份并要求 A_2 专门读取云端规范帐户 ID 来“规避”该问题,但这很麻烦。
桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Grant read access to the world",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/*"
},
{
"Sid": "Grant write access to other account user",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::8566072xxxxx:root"
},
"Action": [
"s3:ListBucket",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my_bucket/*",
"arn:aws:s3:::my_bucket"
]
}
]
}
解决方案
S3 访问权限受制于三组概念上不同的测试——IAM 主体(用户或角色)、存储桶和对象上下文。
如果存储桶和对象所有者相同,则可以在存储桶策略中授予对对象的访问权限,该策略在存储桶上下文中进行评估。如果所有者不同,则对象所有者必须使用对象 ACL 来授予权限。
https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-auth-workflow-object-operation.html
固定 ACL在bucket-owner-full-control
历史上并没有改变实际的对象所有权,它只是让存储桶拥有者能够通过用户和角色策略授予对对象的访问权限,而不是存储桶策略。
在 2020 年,AWS 引入了一项名为S3 对象所有权的新功能,该功能允许配置存储桶,以便bucket-owner-full-control
在创建对象期间使用 ACL 时,其行为更直观并自动将对象所有权分配给存储桶所有者。
这个问题是在引入该功能之前提出的,用户策略是可以在控制台中访问对象的原因。
存储桶策略可以明确拒绝对不属于存储桶所有者的对象的访问,但不能授予它们。
推荐阅读
- python - 你将如何在 python 中创建变量(你会看到)
- google-cloud-run - 如何获取 Google Cloud Run 服务器的 IP 地址?
- python - Jupyterlab:绘图不适合 jupyter 单元格
- node.js - 使用另一种策略序列化时出现护照错误
- c# - 无法使用 C# 通过 .Net Core 调用 AWS API Gateway 资源/方法
- c - Dijkstra算法~
- android - Android Seekbar 多个刻度
- clion - 虚幻引擎告诉我要下载 Visual Studio,即使我想使用 CLion
- python - Django referrer 在模板中获取短域
- c# - C# BeginConnect 在同一个套接字上正在进行另一个异步操作时无法调用