当前位置: 首页 > 知识库问答 >
问题:

AWS S3:调用GetObject操作时发生错误(AccessDenied):拒绝访问

卜飞鸣
2023-03-14

我想让IAM用户可以从S3存储桶下载文件,但在执行aws S3 sync S3://

  1. 创建了一个名为s3完全访问的用户
  2. 在my CLI中执行aws configure,并为上述用户输入生成的访问密钥id和机密访问密钥
  3. 创建了一个bucket策略(如下所示),我希望它能够授予在第一步中创建的用户访问权限

我的bucket有一个文件夹名AffectivaLogs,其中的文件是由不同的用户匿名添加的,看起来虽然bucket是公共的,但里面的文件夹不是,我甚至无法将其公开,这导致了以下错误。

以下是公共访问设置:

更新:我更新了bucket策略,如下所示,但它不起作用。


共有3个答案

薛元忠
2023-03-14

您可以使用所需的主体配置S3策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListBucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::accountId:user/*
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucket"
        },
        {
            "Sid": "GetObjects",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::accountId:user/*
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket/*"
        }
    ]
}

或者,您可以创建IAM策略并将其附加到角色

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListBucket",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::bucket"
        },
        {
            "Sid": "GetObject",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::bucket/*"
        }
    ]
}
百里秋月
2023-03-14

如果您在bucket上使用启用了KMS加密,那么还应该添加允许您使用KMS密钥解密数据的策略。

宰宣
2023-03-14

为了测试情况,我做了以下操作:

  • 创建一个没有附加策略的IAM用户
  • 创建了一个Amazon S3桶
  • 关闭S3块公共入口设置:
    • 阻止新的公共桶策略
    • 阻止公共和跨帐户访问,如果桶有公共策略

    然后我运行了aws s3 sync,访问被拒绝。

    然后我修改了策略,允许访问bucket本身:

    {
        "Id": "Policy",
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "statement",
                "Action": "s3:*",
                "Effect": "Allow",
                "Resource": [
                    "arn:aws:s3:::my-bucket/*",
                    "arn:aws:s3:::my-bucket"
                ],
                "Principal": {
                    "AWS": [
                        "arn:aws:iam::123456789012:user/stack-user"
                    ]
                }
            }
        ]
    }
    

    这起作用了。

    底线:除了bucket的内容之外,还添加访问bucket的权限。(我怀疑这是因为除了访问对象本身之外,awss3sync还需要列出bucket内容。)

 类似资料: