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) 终端节点策略允许访问

对 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 my_bucket --key examplefile.jpg --body c:\examplefile.jpg --storage-class STANDARD_IA

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

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

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

aws s3api put-object --bucket my_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 my_bucket --key examplefile.jpg --body c:\examplefile.jpg --acl bucket-owner-full-control

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

"Condition": {
  "StringEquals": {
    "s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/*"
  }
}

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

aws s3api put-object --bucket my_bucket --key examplefile.jpg --body c:\examplefile.jpg --ssekms-key-id arn:aws:kms:us-east-1:111122223333:key/*

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

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

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

aws s3api put-object --bucket my_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 终端节点策略仅允许访问 other_bucket。如果您的存储桶未被列为允许的资源,则用户将无法使用 VPC 中的实例向您的存储桶进行上传。

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

此页面对您有帮助吗? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS 支持中心

发布时间:2019 年 3 月 1 日