我使用 Amazon Simple Storage Service(Amazon S3)桶为我的网站存储内容。另一个 AWS 账户的用户将该网站的对象上传到我的桶。我的桶策略是正确的,但是该对象无法加载到网站上。
简短描述
默认情况下,当您的桶激活了访问控制列表(ACL)时,您不拥有其他 AWS 账户上传到您的桶的对象。因此,您可能无法读取该对象。上传账户必须明确授予您(桶所有者)访问该对象的权限。
此外,桶策略不适用于桶中由其他账户拥有的对象。因此,授予您网站用户读取权限的桶策略不会自动应用于其他账户上传的对象。
要修复此问题,请使用以下方法之一:
- 停用 S3 桶上的 ACL(最佳实践)。
- 让对象所有者授予该对象公共读取权限。
- 让对象所有者授予您对对象的完全控制权。
解决方法
停用 S3 桶上的 ACL(最佳实践)
要停用 Amazon S3 桶上的 ACL,请选择桶所有者强制执行的对象所有权设置。当您应用此设置时,ACL 将关闭,您将自动拥有并完全控制桶中的所有对象。即使是跨账户上传的对象,此对象的所有权也属于桶所有者。桶所有者还控制适用于这些对象的授予读取权限的桶策略。
先决条件
在停用 ACL 之前,请参阅停用 ACL 的先决条件。
关闭 ACL
- 打开 Amazon S3 控制台。
- 选择桶,然后选择要对其应用 S3 对象所有权设置的桶的名称。
- 选择权限选项卡。
- 在对象所有权下,选择编辑。
- 在对象所有权下,选择强制桶所有者。
- 选择保存。
如果您的用例不允许您停用 ACL,请使用以下替代方法之一。
让对象所有者向对象授予公共读取权限
**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
上传对象的账户可以向该对象授予公共读取权限。为此,请运行以下 AWS 命令行界面(AWS CLI)命令:
aws s3api put-object-acl --bucket docexamplebucket --key example.jpg --acl public read
**注意:**将 --bucket 替换为存储您的网站内容的桶的名称。
让对象所有者授予你对对象的完全控制权
对象所有者可以自动授予桶所有者对对象的完全控制权。为此,请在目标桶上启用 S3 对象所有权。这允许桶所有者控制对象所有者何时上传对象,并包括 bucket-owner-full-control 预装 ACL。
桶所有者将其 S3 对象所有权配置为首选桶所有者后,桶所有者可以添加另一个桶策略。这项额外的桶策略必须要求所有 Amazon S3 PUT 操作都包含 bucket-owner-full-control 预装 ACL。此 ACL 授予桶所有者对新对象的完全控制权。
要授予桶所有者对对象的完全控制权,上传账户必须在上传对象期间使用 CLI 语法:
aws s3api put-object --bucket docexamplebucket --key example.jpg --acl bucket-owner-full-control
桶所有者现在拥有该对象,并且该对象继承桶策略中设置的权限。
对于在您激活 S3 对象所有权之前上传的现有对象,对象所有者必须向桶所有者授予该对象的权限。然后,桶所有者必须复制对象本身。
要授予桶所有者对对象的完全控制权,上传账户必须使用 CLI 语法:
aws s3api put-object-acl --bucket docexamplebucket --key example.jpg --acl bucket-owner-full-control
要继承对象的对象所有权,桶所有者必须复制对象本身:
aws s3 cp s3://docexamplebucket/example.jpg s3://docexamplebucket/example.jpg --acl bucket-owner-full-control
桶所有者现在拥有该对象,并且该对象继承桶策略中设置的权限。
要求跨账户上传授予桶所有者对对象的完全控制权
要要求其他账户的所有上传(s3:PutObject)都向桶所有者授予完全对象控制权,请使用类似以下示例的桶策略:
{
"Id": "Policy1541018284691",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RequireBucketOwnerFullControlOnPuts",
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:user/iam_user"
]
},
"Action": [
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::docexamplebucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
使用此桶策略,其他账户(111122223333)的用户只有在用户指定对象的 ACL 时才能上传到桶。对象的 ACL 必须授予桶所有者完全控制权。然后,其他账户用户必须上传对象,如以下命令所示:
aws s3 cp path/to/local/file s3://docexamplebucket --acl bucket-owner-full-control
相关信息
Amazon S3 如何授权请求
访问策略指南
设置网站访问权限
使用用户策略控制对桶的访问权限