Getting Access Denied when calling the PutObject operation with bucket-level permission

前端 未结 14 1229
醉话见心
醉话见心 2020-12-12 13:37

I followed the example on http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3 for how to grant a user access to just one buck

相关标签:
14条回答
  • 2020-12-12 13:42

    I was just banging my head against a wall just trying to get S3 uploads to work with large files. Initially my error was:

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

    Then I tried copying a smaller file and got:

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

    I could list objects fine but I couldn't do anything else even though I had s3:* permissions in my Role policy. I ended up reworking the policy to this:

    {
        "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": "*"
            }
        ]
    }
    

    Now I'm able to upload any file. Replace my-bucket with your bucket name. I hope this helps somebody else that's going thru this.

    0 讨论(0)
  • 2020-12-12 13:44

    I had a similar issue uploading to an S3 bucket protected with KWS encryption. I have a minimal policy that allows the addition of objects under a specific s3 key.

    I needed to add the following KMS permissions to my policy to allow the role to put objects in the bucket. (Might be slightly more than are strictly required)

    {
        "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>/*"
                ]
            }
        ]
    }
    
    0 讨论(0)
  • 2020-12-12 13:44

    Similar to one post above, (except I was using admin credentials) to get S3 uploads to work with large 50M file.

    Initially my error was:

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

    I switched the multipart_threshold to be above the 50M

    aws configure set default.s3.multipart_threshold 64MB
    

    and I got:

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

    I checked bucket public access settings and all was allowed. So I found that public access can be blocked on account level for all S3 buckets:

    0 讨论(0)
  • 2020-12-12 13:45

    I encountered the same issue. My bucket was private and had KMS encryption. I was able to resolve this issue by putting in additional KMS permissions in the role. The following list is the bare minimum set of roles needed.

    {
      "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"
            ]
        }
      ]
    }
    

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

    0 讨论(0)
  • 2020-12-12 13:46

    To answer my own question:

    The example policy granted PutObject access, but I also had to grant PutObjectAcl access.

    I had to change

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

    from the example to:

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

    You also need to make sure your bucket is configured for clients to set a public-accessible ACL by unticking these two boxes:

    0 讨论(0)
  • 2020-12-12 13:48

    I was having a similar problem. I was not using the ACL stuff, so I didn't need s3:PutObjectAcl.

    In my case, I was doing (in Serverless Framework YML):

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

    Instead of:

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

    Which adds a /* to the end of the bucket ARN.

    Hope this helps.

    0 讨论(0)
提交回复
热议问题