我使用 Amazon Simple Storage Service (Amazon S3) 存储桶来存储我的网站内容。其他 AWS 账户的用户向我的存储桶上传了一个网站对象。我的存储桶策略是正确的,但无法在网站上加载该对象。如何修复此问题?

如果其他 AWS 账户将对象上传到您的存储桶,默认情况下您没有该对象的所有权,因此您可能无法读取该对象。上传账户必须明确授予您(即存储桶拥有者)该对象的权限。

此外,存储桶策略不适用于存储桶中归其他账户所有的对象。这就是为什么向您网站的用户授予读取访问权限的存储桶策略不会自动应用到由其他账户上传的对象。

要修复此加载问题,请使用以下任一方法更改对象的访问控制列表 (ACL):

  • 对象拥有者授予对象的公共读取访问权限。
  • 对象拥有者授予存储桶拥有者完全控制对象的权限。然后,存储桶拥有者将对象复制到自身以继承该对象的所有权。

请注意有关向其他账户授予存储桶访问权限的以下注意事项:

  • 默认情况下,存储桶的账户无法读取由其他账户上传到该存储桶的对象。上传对象的账户必须明确更新 ACL 才能授予读取权限。
  • 由其他账户上传到存储桶的对象不会自动继承在存储桶策略中定义的权限。存储桶拥有者必须获取对象的所有权才能应用存储桶策略。
  • 如果您想允许其他账户访问您的存储桶,我们建议您使用存储桶策略作为更加集中和全面的方法来管理权限。
  • 如果您想允许其他账户将对象上传到您的存储桶,我们建议在您的账户中创建一个其他账户可以代入的 AWS Identity and Access Management (IAM) 角色。当其他账户使用该 IAM 角色上传对象后,您的账户便具有该对象的所有权,因为该角色属于您的账户。有关跨账户配置使用 IAM 角色的示例,请参阅存储桶拥有者针对不属于自己的对象授予跨账户权限

对象拥有者授予对象公共读取访问权限

上传该对象的账户可通过运行以下 AWS 命令行界面 (AWS CLI) 命令,授予对象公共读取访问权限:

注意:对于 --bucket 的值,请输入用于存储您网站内容的存储桶的名称。

aws s3api put-object-acl --bucket awsexamplebucket --key example.jpg --acl public read

然后,如果必须限制对象流量,存储桶拥有者可以使用存储桶策略来仅允许来自特定 IP 地址或特定 Amazon Virtual Private Cloud (VPC) 的访问请求。

例如,此存储桶策略可以拒绝访问 awsexamplebucket 中的对象,除非访问请求来自列为 "aws:SourceIp" 的 IP 地址,或来自指定为 "aws:sourceVpc" 的 VPC:

{
    "Version": "2012-10-17",
    "Id": "Policy1415115909152",
    "Statement": [
        {
            "Sid": "Deny-Access-Except-For-Trusted-IPs-and-VPC",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::awsexamplebucket/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "1.1.1.1/32",
                        "2.2.2.2/32",
                        "3.3.3.3/32"
                    ]
                },
                "StringNotEquals": {
                    "aws:sourceVpc": "vpc-12345abc"
                }
            }
        }
    ]
}

对象拥有者授予存储桶拥有者完全口控制对象的权限

上传该对象的账户可以通过运行以下 AWS CLI 命令授予存储桶拥有者完全控制对象的权限:

aws s3api put-object-acl --bucket awsexamplebucket --key example.jpg --acl bucket-owner-full-control

然后,存储桶拥有者必须将对象复制到自身以继承对象的所有权。存储桶拥有者可以运行以下命令:

aws s3 cp s3://awsexamplebucket/example.jpg s3://awsexamplebucket/example.jpg --storage-class STANDARD

存储桶拥有者现在拥有该对象,这意味着该对象会继承在存储桶策略中设置的权限。

要求跨账户上传向存储桶拥有者授予完全控制对象的权限

如需要求来自其他账户的所有上传 (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:::awsexamplebucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

使用此存储桶策略,仅当其他账户 (111122223333) 的用户指定对象的 ACL 授予存储桶拥有者完全控制权限时,他们才可上传到存储桶。用户必须使用以下类似的命令以上传对象:

aws s3 cp path/to/local/file s3://awsexamplebucket --acl bucket-owner-full-control

此页面对您有帮助吗? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS Support 中心

发布时间:2019 年 3 月 19 日