使用存储桶级权限调用PutObject操作时,拒绝访问


108

我遵循了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

为什么我不能上传到我的存储桶?

Answers:


204

要回答我自己的问题:

该示例策略授予了PutObject访问权限,但是我还不得不授予了PutObjectAcl访问权限。

我不得不改变

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

从示例到:

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

您还需要通过取消选中以下两个框,确保为客户端配置了存储桶以设置可公开访问的ACL:

在此处输入图片说明


2
谢谢!不知道为什么关闭了亚马逊自己的文档。您可能还希望包括“ s3:AbortMultipartUpload”,以便可以正确清除中止的上载。
Hashcut


1
顺便说一句,这对我不起作用。boto3交互,即使使用s3fullaccess策略,我也会感到“ AccessDenied for PutObject”
E.Big

2
在我的情况下,其与AWS CLI的工作,但它不与博托wrokign
Hardik Gajjar

3
我具有S3完全访问权限,但缺少阻止新的公共ACL和上传公共对象的权限。谢谢!
the_ccalderon

37

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

就我而言,我正在做(在无服务器框架 YML中):

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

代替:

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

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

希望这可以帮助。


2
我需要带有/ *的
那个

我也是这样
Visualspark

10

我只是把头撞在墙上,只是想让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用您的存储桶名称替换。我希望这会对其他人有所帮助。


2
这给出:缺少必填字段Principal :(
Sameera K

2
我也收到以下错误:缺少必填字段的负责人
Karan Sharma

您如何在yml中进行此操作
ichimaru

当心:这将使您的IAM用户/角色访问权限可以列出所有存储桶中的密钥。小心使用;理想情况下避免使用"Resource": "*"
达里安·穆迪

添加-“主体”:“ *”,-在“效果”:“允许”下方,以解决缺少必填字段的问题
meck373

9

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

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


这对我有帮助。谢谢!与权限相同的错误,但实际上是加密。
维森特·罗查

6

上传到受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>/*"
            ]
        }
    ]
}

太棒了 我将权限从默认的托管aws/s3密钥复制到了附加到角色的IAM策略(不在KMS策略中),并且效果很好。我需要对KMS ARNS的唯一行动是:kms:Encryptkms:Decryptkms:ReEncrypt*kms:GenerateDataKey*kms:DescribeKey。然后只有标准的S3权限。
z0r

3

我对相同的错误消息也犯了一个错误:请确保您使用正确的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



1

与上面的一篇帖子类似,(除了我当时使用管理员凭据),使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

我检查了存储桶的公共访问设置,所有设置都被允许。因此,我发现可以在帐户级别上阻止所有S3存储桶的公共访问

S3可以在帐户级别阻止公共ACL


1

如果您已为存储桶设置了公共访问权限,但仍无法使用,请编辑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": "*"
        }
    ]
}

为我工作,我创建了一个新的S3存储桶,使其完全公开。它的可写put_object,但是在执行带有ACL =选项的put_object时失败。奇怪吗?
Doug F

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错误


0

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

希望这会有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.