有权限向我的 Amazon S3 存储桶添加对象的用户收到拒绝访问错误。为什么?

2 分钟阅读
0

AWS Identity and Access Management (IAM) 用户有权限在我的 Amazon Simple Storage Service (Amazon S3) 存储桶上进行 s3:PutObject 操作。但是,他们在尝试上传对象时收到 HTTP 403:访问被拒错误。如何修复此问题?

简短描述

如果 IAM 用户具有上传到存储桶的正确权限,则检查以下策略是否有会阻止上传的设置:

  • 对 s3:PutObjectAcl 的 IAM 用户权限
  • 存储桶策略中的条件
  • Amazon Virtual Private Cloud (Amazon VPC) 终端节点策略允许访问
  • AWS KMS 加密

解决方法

对 s3:PutObjectAcl 的 IAM 用户权限

如果 IAM 用户必须在上传期间更新对象的访问控制列表 (ACL),则用户还必须拥有其 IAM 策略中的 s3:PutObjectAcl 权限。有关如何更新用户的 IAM 策略的说明,请参阅更改 IAM 用户的权限

存储桶策略中的条件

检查您的存储桶策略有无限制您的存储桶上传的以下示例条件。如果存储桶策略中包含某个条件且该条件有效,则 IAM 用户必须满足该条件才能进行上传。

重要提示:当您审查条件时,请务必验证条件与Allow 语句 ("Effect": "Allow") 或 Deny 语句 ("Effect": "Deny") 相关。要进行正常上传,用户必须符合 Allow 语句的条件或者避免 Deny 语句的条件。

检查仅允许从特定 IP 地址上传的条件,类似条件如下:

"Condition": {
  "IpAddress": {
    "aws:SourceIp": "54.240.143.0/24"
  }
}

如果您的存储桶策略具有此条件,IAM 用户必须从允许的 IP 地址访问您的存储桶。

检查仅允许在对象为特定存储类时上传的条件,类似条件如下:

"Condition": {
  "StringEquals": {
    "s3:x-amz-storage-class": [
      "STANDARD_IA"
    ]
  }

如果您的策略具有此条件,则用户必须使用允许的存储类上传对象。例如,前一条件语句需要 STANDARD_IA 存储类。这意味着用户必须使用类似于以下内容的 AWS 命令行界面 (AWS CLI) 命令上传对象:

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --storage-class STANDARD_IA

**注意:**如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

检查仅允许在对象分配有特定访问控制列表 (ACL) 时进行上传的条件,类似条件如下:

"Condition": {
                "StringEquals": {
                    "s3:x-amz-acl":["public-read"]
                }
            }

如果您的策略具有此条件,则用户必须用允许的 ACL 上传对象。例如,由于上一个条件需要 public-read ACL,用户必须使用类似于以下内容的命令上传对象:

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --acl public-read

检查要求上传授予存储桶拥有者(典型用户 ID)对象完全控制权的条件,类似条件如下:

"Condition": {
  "StringEquals": {
    "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
  }
}

如果您的策略具有此条件,则用户必须使用类似于以下内容的命令上传对象:

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --grant-full-control id=CanonicalUserID

检查仅允许在 AWS Key Management System (AWS KMS) 密钥加密对象时进行上传的条件,类似条件如下:

"Condition": {<br>"StringEquals": {<br>"s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd"<br>}<br>}

如果您的策略具有此条件,则用户必须使用类似于以下内容的命令上传对象:

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --server-side-encryption aws:kms --ssekms-key-id arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd

检查仅允许在对象使用特定类型服务器端加密时进行上传的条件,类似条件如下:

"Condition": {
  "StringEquals": {
    "s3:x-amz-server-side-encryption": "AES256"
  }
}

如果您的策略具有此条件,用户必须使用类似于以下内容的命令上传对象:

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --server-side-encryption "AES256"

VPC 终端节点策略允许的访问

如果 IAM 用户使用 Amazon Elastic Compute Cloud (Amazon EC2) 实例上传对象到 Amazon S3,且该实例被 VPC 终端节点路由到 Amazon S3 中,则您必须检查 VPC 终端节点策略。确保终端节点策略允许对您的存储桶进行上传。

例如,以下 VPC 终端节点策略仅允许访问 DOC-EXAMPLE-BUCKET。如果您的存储桶未被列为允许的资源,则用户将无法使用 VPC 中的实例向您的存储桶进行上传。

{
  "Statement": [{
    "Sid": "Access-to-specific-bucket-only",
    "Principal": "*",
    "Action": [
      "s3:PutObject"
    ],
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
  }]
}

此外,如果用户使用 ACL 上传对象,则 VPC 终端节点策略还必须授予对 s3:PutObjectAcl 操作的访问权限,类似于以下内容:

{
  "Statement": [{
    "Sid": "Access-to-specific-bucket-only",
    "Principal": "*",
    "Action": [
      "s3:PutObject",
      "s3:PutObjectAcl",
    ],
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
  }]
}

AWS KMS 加密

根据您收到的错误消息,更新 IAM 用户或角色的 AWS KMS 权限。要解决这些 Access Denied(访问被拒绝)错误,请参阅当我将文件上传到使用 AWS KMS 默认加密的 Amazon S3 存储桶时,为什么会收到“访问被拒绝”错误消息?

重要提示:如果 AWS KMS 密钥和 IAM 角色属于不同的 AWS 账户,则必须更新 IAM 策略和 KMS 密钥策略。确保将 KMS 权限添加到 IAM 策略和 KMS 密钥策略。此外,如果跨账户 IAM 委托人正在上传对象,则不能将具有“aws/s3”别名的 AWS KMS 密钥用于默认存储桶加密。任何对象上传、复制,或配置为使用 SSE-KMS 的 S3 存储桶密钥的存储桶,都必须具有 kms:Decrypt 权限。有关 AWS KMS 密钥和策略管理的更多信息,请参阅 AWS 托管式 KMS 密钥和客户托管式密钥


相关信息

Amazon S3 条件键示例

为 Amazon S3 存储桶设置默认服务器端加密行为

 

 

相关视频

AWS 官方
AWS 官方已更新 2 年前