S3跨帐户访问涉及3个帐户

时间:2018-07-12 11:50:22

标签: amazon-web-services amazon-s3 acl amazon-iam

我有2个AWS账户( accountA accountB )。 A拥有名为bucketA的s3存储桶。 BucketA被配置为我们的CloudFront发行版之一的日志存储桶。因此,bucketA中的对象属于 awsdatafeed 帐户。该存储桶中的示例对象的ACL为:

{
    "Owner": {
        "DisplayName": "awsdatafeeds",
        "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "Grants": [
        {
            "Grantee": {
                "DisplayName": "awsdatafeeds",
                "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        },
        {
            "Grantee": {
                "DisplayName": "accountA",
                "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

现在,我希望accountB中的IAM用户能够访问此S3存储桶中的对象。因此,我遵循了https://docs.aws.amazon.com/AmazonS3/latest/dev/example-walkthroughs-managing-access-example2.html

中的说明

我将以下存储桶策略添加到了bucketA:

{
    "Version": "2012-10-17",
    "Id": "Policy1531389545571",
    "Statement": [
        {
            "Sid": "Bucket Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::accountB:root"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucketA",
                "arn:aws:s3:::bucketA/*"
            ]
        }
    ]
}

现在,在accountB中,我向用户添加了以下IAM策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucketA",
                "arn:aws:s3:::bucketA/*"
            ]
        }
    ]
}

现在,使用AccountB中IAM用户的凭据,我可以列出bucketA中的对象并创建新对象。但是,当我尝试获取属于bucketA(所有者是awsdatafeeds帐户)的现有对象时,出现以下错误:

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

如何从AccountB访问这些日志文件?

1 个答案:

答案 0 :(得分:0)

您已经注意到,在这种情况下,有三个帐户,而不是示例2中的两个帐户。请参见示例4中的注释:

  

桶所有者帐户可以将权限委派给其自己帐户中的用户(请参阅示例3:桶所有者向其用户授予其不拥有的对象的权限),但是它无法将权限委派给其他AWS账户,因为跨账户委派是不支持。

     

https://docs.aws.amazon.com/AmazonS3/latest/dev/example-walkthroughs-managing-access-example4.html

您建议的是两个等级的委派,不支持此授权。

拥有存储桶的帐户可以将对象复制到其顶部,从而获得对象的所有权并使示例2起作用...或者拥有存储桶的帐户可以创建角色,然后两个帐户都可以允许外国用户承担该角色,并且该角色有权访问存储桶。

假定角色就像“身份斗篷”一样,当将角色凭据用于后续请求时(在最初假定角色的位置留下痕迹),隐藏承担该角色的实体的原始身份,因此以这种方式使用角色将不会被视为跨帐户委派,并且应能按预期工作。