我有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访问这些日志文件?
答案 0 :(得分:0)
您已经注意到,在这种情况下,有三个帐户,而不是示例2中的两个帐户。请参见示例4中的注释:
桶所有者帐户可以将权限委派给其自己帐户中的用户(请参阅示例3:桶所有者向其用户授予其不拥有的对象的权限),但是它无法将权限委派给其他AWS账户,因为跨账户委派是不支持。
https://docs.aws.amazon.com/AmazonS3/latest/dev/example-walkthroughs-managing-access-example4.html
您建议的是两个等级的委派,不支持此授权。
拥有存储桶的帐户可以将对象复制到其顶部,从而获得对象的所有权并使示例2起作用...或者拥有存储桶的帐户可以创建角色,然后两个帐户都可以允许外国用户承担该角色,并且该角色有权访问存储桶。
假定角色就像“身份斗篷”一样,当将角色凭据用于后续请求时(在最初假定角色的位置留下痕迹),隐藏承担该角色的实体的原始身份,因此以这种方式使用角色将不会被视为跨帐户委派,并且应能按预期工作。