在使用桶级权限调用PutObject操作时拒绝访问

时间:2016-03-28 22:29:34

标签: amazon-s3

我按照http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3上的示例了解如何授予用户访问一个存储桶的权限。

然后我使用W3 Total Cache Wordpress插件测试了配置。测试失败了。

我也尝试使用

重现问题
aws s3 cp --acl=public-read --cache-control='max-age=604800, public' ./test.txt s3://my-bucket/

并且

失败了
upload failed: ./test.txt to s3://my-bucket/test.txt A client error (AccessDenied) occurred when calling the PutObject operation: Access Denied

为什么我无法上传到我的水桶?

18 个答案:

答案 0 :(得分:105)

回答我自己的问题:

示例策略授予PutObject访问权限,但我还必须授予PutObjectAcl访问权限。

我不得不改变

"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"

从示例到:

"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"

您还需要确保您的存储分区已配置为客户端通过取消勾选这两个框来设置公共可访问的ACL:

enter image description here

答案 1 :(得分:20)

我遇到了类似的问题。我没有使用ACL的东西,所以我不需要s3:PutObjectAcl

就我而言,我在做(Serverless Framework YML):

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName"

而不是:

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName/*"

/*添加到存储桶ARN的末尾。

希望这有帮助。

答案 2 :(得分:8)

如果您为存储桶设置了公共访问权限,但仍无法使用,请编辑bucker策略并粘贴以下内容:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::yourbucketnamehere",
                "arn:aws:s3:::yourbucketnamehere/*"
            ],
            "Effect": "Allow",
            "Principal": "*"
        }
    ]
}

答案 3 :(得分:5)

我只是把头撞在墙上,只是想让S3上传来处理大文件。最初我的错误是:

An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

然后我尝试复制一个较小的文件并得到:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

我可以很好地列出对象,但是即使我的角色策略具有s3:*权限,我也无能为力。我最终为此修改了政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "*"
        }
    ]
}

现在,我可以上传任何文件了。将my-bucket替换为您的存储桶名称。我希望这会对其他人有所帮助。

答案 4 :(得分:3)

类似于上面的一篇文章(除非我使用管理员凭据),以使S3上传文件可以处理50M大文件。

最初我的错误是:

An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

我将multipart_threshold设置为50M以上

aws configure set default.s3.multipart_threshold 64MB

然后我得到了

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

我检查了存储桶的公共访问设置,并且所有设置都被允许。 所以我发现public access can be blocked on account level for all S3 buckets

S3 can block public ACL on account level

答案 5 :(得分:3)

我上载到受KWS加密保护的S3存储桶时遇到了类似的问题。 我有一个最低限度的政策,允许在特定的s3键下添加对象。

我需要在策略中添加以下KMS权限,以允许该角色将对象放入存储桶中。 (可能比严格要求的略多)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:ListKeys",
                "kms:GenerateRandom",
                "kms:ListAliases",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "kms:ImportKeyMaterial",
                "kms:ListKeyPolicies",
                "kms:ListRetirableGrants",
                "kms:GetKeyPolicy",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:ListResourceTags",
                "kms:ReEncryptFrom",
                "kms:ListGrants",
                "kms:GetParametersForImport",
                "kms:TagResource",
                "kms:Encrypt",
                "kms:GetKeyRotationStatus",
                "kms:GenerateDataKey",
                "kms:ReEncryptTo",
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:<MY-REGION>:<MY-ACCOUNT>:key/<MY-KEY-GUID>"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
            <The S3 actions>
            ],
            "Resource": [
                "arn:aws:s3:::<MY-BUCKET-NAME>",
                "arn:aws:s3:::<MY-BUCKET-NAME>/<MY-BUCKET-KEY>/*"
            ]
        }
    ]
}

答案 6 :(得分:3)

如果这对其他人有所帮助,就我而言,我使用的是CMK(使用默认的aws / s3键效果很好)

我必须进入IAM中的加密密钥定义,并将登录到boto3的编程用户添加到“可以使用此密钥从应用程序内部以及使用与KMS集成的AWS服务进行加密和解密数据的用户”列表中。 “。

答案 7 :(得分:2)

我遇到了同样的问题。我的存储桶是私有的,并且具有KMS加密。通过在角色中添加其他KMS权限,我能够解决此问题。以下列表是所需的最低角色集。

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "AllowAttachmentBucketWrite",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "kms:Decrypt",
            "s3:AbortMultipartUpload",
            "kms:Encrypt",
            "kms:GenerateDataKey"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name/*",
            "arn:aws:kms:kms-key-arn"
        ]
    }
  ]
}

参考:https://aws.amazon.com/premiumsupport/knowledge-center/s3-large-file-encryption-kms-key/

答案 8 :(得分:2)

我还通过将以下 KMS 权限添加到我的策略中来解决此问题,以允许角色将对象放入此存储桶(仅此存储桶):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}

您还可以在使用 IAM Policy Simulator 应用之前测试您的策略配置。这对我很有用。

答案 9 :(得分:1)

对我来说,我正在使用过期的身份验证密钥。产生了新的繁荣。

答案 10 :(得分:1)

我因为我犯的错误而收到同样的错误消息: 确保使用正确的s3 uri,例如:s3://my-bucket-name/

(如果my-bucket-name明显位于你的aws s3的根部)

我坚持认为,因为当您从浏览器中复制粘贴s3存储桶时,您会得到类似https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overview

的内容

因此我犯了错误,使用s3://buckets/my-bucket-name提出:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

答案 11 :(得分:1)

在我的例子中,我有一个 ECS 任务,它附加了角色来访问 S3,但我尝试为我的任务创建一个新用户来访问 SES。一旦我这样做了,我想我以某种方式覆盖了一些权限。

基本上,当我向用户授予 SES 访问权限时,我的 ECS 失去了对 S3 的访问权限。

我的解决方法是将 SES 策略与 S3 策略一起附加到 ECS 角色并删除新用户。

我了解到,ECS 在启动任务时和任务的日常需要时需要两个不同阶段的权限。如果您想授予任务中的容器访问其他 AWS 资源的权限,您需要确保将这些权限附加到 ECS 任务。

我在 terraform 中的代码修复:

data "aws_iam_policy" "AmazonSESFullAccess" {
  arn = "arn:aws:iam::aws:policy/AmazonSESFullAccess"
}

resource "aws_iam_role_policy_attachment" "ecs_ses_access" {
  role       = aws_iam_role.app_iam_role.name
  policy_arn = data.aws_iam_policy.AmazonSESFullAccess.arn
}

答案 12 :(得分:0)

如果您为S3加密指定了自己的客户管理的KMS密钥,则还需要提供标志--server-side-encryption aws:kms,例如:

aws s3api put-object --bucket bucket --key objectKey --body /path/to/file --server-side-encryption aws:kms

如果不添加标志--server-side-encryption aws:kms,cli将显示AccessDenied错误

答案 13 :(得分:0)

我能够通过从策略中授予s3对Lambda的完全访问权限来解决此问题。为Lambda扮演新角色,并附加具有完整S3访问权限的策略。

希望这会有所帮助。

答案 14 :(得分:0)

错误:调用PutObject操作时发生错误(AccessDenied):访问被拒绝

我通过传递Extra Args参数解决了此问题,因为公司政策已禁用PutObjectAcl。

s3_client.upload_file('./ local_file.csv','存储桶名称','路径', ExtraArgs = {'ServerSideEncryption':'AES256'}

答案 15 :(得分:0)

通过允许存储桶策略中的所有权限可以解决具有存储桶级别权限的放置对象操作

router.use('/first', cors(corsOptions), firstRouter);

答案 16 :(得分:0)

另外,我已经为用户所属的组设置了权限。 enter image description here

答案 17 :(得分:0)

就我而言,问题是我在命令行中使用“--acl=public-read”上传文件。 但是,该存储桶已阻止公共访问,只能通过 CloudFront 访问。