调用具有桶级权限的 PutObject 操作时访问被拒绝

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

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

260385 次浏览

回答我自己的问题:

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

我必须改变

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

从例子到:

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

您还需要确保为您的 bucket 配置了客户端设置公共可访问的 ACL,方法是取消勾选以下两个框:

enter image description here

我也有类似的问题,我没有使用前交叉韧带,所以我不需要 s3:PutObjectAcl

在我的例子中,我正在做(在 无服务器框架 YML 中) :

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

而不是:

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

它将 /*添加到 bucket ARN 的末尾。

希望这个能帮上忙。

对于我犯的一个错误,我得到了相同的错误消息: 确保使用正确的 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

如果这对其他人有帮助的话,在我的例子中,我使用的是 CMK (使用默认的 aws/s3键可以很好地工作)

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

我有一个类似的问题上传到 S3桶与 KWS 加密保护。 我有一个允许在特定 s3键下添加对象的最小策略。

我需要将以下 KMS 权限添加到策略中,以允许角色将对象放入 bucket 中。(可能略高于严格要求)

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

我只是想把 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替换为您的桶名。我希望这能帮助别人度过难关。

对我来说,我用的是过期的认证密钥,生成新的密钥,然后就爆炸了。

如果您已经为 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错误

如果您已经为 bucket 设置了公共访问权限,并且它仍然无法工作,请编辑 bucket 策略并粘贴以下内容:

{
"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上传工作与大型50M 文件。

最初我的错误是:

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

我将 multipart _ 阀值切换到50M 以上

aws configure set default.s3.multipart_threshold 64MB

然后我得到了:

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

我检查了桶公共访问设置,一切都被允许。 所以我发现 所有 S3存取桶的公共存取可在帐户层面被阻塞:

S3 can block public ACL on account level

我可以通过授予策略对 Lambda 的完全 s3访问权限来解决这个问题。为 Lambda 创建一个新角色,并将策略与完整的 S3Access 一起附加到它。

希望这个能帮上忙。

我也遇到了同样的问题。我的桶是私人的,有 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/

错误: 调用 PutObject 操作时发生错误(AccessDenied) : Access Denied

我通过传递额外的 Args 参数来解决这个问题,因为公司策略禁用了 PutObjectAcl。

S3 _ client. load _ file (’./local _ file. csv’、‘ bucket-name’、‘ path’、 ExtraArgs = {‘ ServerSideEncryption’: ‘ AES256’})

我还通过在策略中添加以下 KMS 权限来解决这个问题,以允许角色将对象放入这个 bucket (并且只放入这个 bucket) :

{
"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 政策模拟器应用策略配置之前测试它们。

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

在我的例子中,问题是我在命令行中用“—— acl = public-read”上传文件。 但是,bucket 的公共访问被阻塞,只能通过 CloudFront 访问。

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

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

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

我所了解到的是,ECS 需要在两个不同的阶段获得权限,一个是在处理任务时,另一个是在处理任务的日常需求时。如果希望让任务中的容器访问其他 AWS 资源,则需要确保将这些权限附加到 ECS 任务。

我在地形上的代码修正:

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
}

我也得到了这个错误: ERROR AccessDenied: Access Denied

我在一个 NodeJS 应用程序中工作,该应用程序试图使用 s3.putObject 方法。通过阅读上面的许多答案,我得到了一些线索,所以我去了 S3 Bucket,点击了 Permission 选项卡,然后滚动到 Bucket Policy 部分,注意到访问需要一个条件。

Condition in the Bucket Policy

因此,我在 putObject 调用的 params 中添加了一个 ServerSideEncryption 属性。

Added ServerSideEncryption attribute to params

我终于成功了。PutObject 的工作不需要其他更改,例如消息的任何加密。

我的问题是,我的源(一个 ec2实例)附加了一个 IAM 角色,该角色不允许任何写操作,所以即使 bucket 策略是正确的,我也不能从它写任何东西到任何地方。我通过将这一政策加入 IAM 的角色来解决这个问题:

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

我面临着类似的问题,所以检查了 AWS bucket 中的权限选项卡。在我的案例中,公共访问被阻止,这导致了问题,所以我取消了选项,它工作了。 在此输入图像描述