首页 > 解决方案 > 授予 S3 存储桶访问权限的跨账户角色 - 权限被拒绝

问题描述

我有两个帐户,帐户 ACCOUNTAAAA 和 ACCOUNTBBBB。账户 ACCOUNTAAAA 中存在存储桶 (BUCKETAAAA),并且在 ACCOUNTBBBB 中具有角色 (ROLEBBBB) 的实例需要能够从中读取。

我已向存储桶添加以下权限:

{
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::ACCOUNTBBBB:role/ROLEBBBB"
        },
        "Action": [
            "s3:*"
        ],
        "Resource": "arn:aws:s3:::BUCKETAAAA/*"
    }

我对以下角色具有以下权限ACOUNTBBBB

        "Sid": "",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::BUCKETAAAA/",
            "arn:aws:s3:::BUCKETAAAA/*"
        ]
    }

我的假设是我应该能够aws s3 ls s3://BUCKETAAAA在附加了 IAM 角色的 EC2 实例上运行,并查看 BUCKETAAAA 的内容。当我尝试这个时,我得到An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied.

我在这里想念什么?

标签: amazon-web-servicesamazon-s3permissionsamazon-iam

解决方案


为了重现您的情况,我执行了以下操作:

  • 在 Account-B 中创建Role-B ,其中 EC2 作为受信任实体(“允许 EC2 实例代表您调用 AWS 服务”)和授予对 Bucket-A 访问权限的策略
  • 在 Account-A 中创建Bucket- A
  • 向 Bucket-A添加了Bucket Policy,授予对 Role-B 的访问权限
  • 将角色 B分配给 Amazon EC2 实例

Bucket-A 上的Bucket Policy是:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<account>:role/role-b"
            },
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-a",
                "arn:aws:s3:::bucket-a/*"
            ]
        }
    ]
}

Role-B 的权限为:

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

我能够成功使用aws s3 ls s3://bucket-a并能够将文件复制到 Bucket-A。

我在您的尝试中看到的主要区别是您的存储桶策略仅授予以下权限:

"Resource": "arn:aws:s3:::BUCKETAAAA/*"

This means "anything within Bucket-A" but does not include Bucket-A itself. The command aws s3 ls s3://BUCKETAAAA operates on the bucket, for which the role has no permissions.

Thus, you should also add permissions for the bucket itself:

        "Resource": [
            "arn:aws:s3:::BUCKETAAAA",
            "arn:aws:s3:::BUCKETAAAA/*"

推荐阅读