当我尝试使用 Amazon S3 控制台上传文件时,为什么会收到“HTTP 403 禁止”错误?

上次更新日期:2020 年 10 月 20 日

我尝试使用 Amazon S3 控制台将文件上传到 Amazon Simple Storage Service (Amazon S3) 存储桶。但是,我收到了 HTTP 403 禁止访问错误。我应该如何排查此问题?

简短描述

要从 Amazon S3 控制台排查 HTTP 403 禁止访问错误,请检查以下各项:

  • 缺少 s3:PutObject 或 s3:PutObjectAcl 的相关权限
  • 缺少使用 AWS Key Management Service (AWS KMS) 密钥的权限
  • 存储桶策略中的显式 deny 语句 
  • 存储桶访问控制列表 (ACL) 不允许 AWS 账户根用户写入对象
  • AWS Organizations 服务控制策略不允许访问 Amazon S3

解决方法

缺少 s3:PutObject 或 s3:PutObjectAcl 的相关权限

验证您正在使用的 AWS Identity and Access Management (IAM) 用户或角色具有对存储桶上的 s3:PutObject 操作的权限。如果没有此权限,您会收到“HTTP 403 禁止”错误。 

如果您尝试在上传期间修改对象的 ACL,则您的 IAM 用户或角色必须还具有对 s3:PutObjectAcl 操作的权限。 

缺少使用 AWS KMS 密钥的权限

要访问结合使用默认加密和自定义 AWS KMS 密钥的 S3 存储桶,您必须拥有使用该密钥的权限。 

要获取使用密钥的权限,密钥管理员必须授予您对密钥策略的权限。要将对象上传至已加密的存储桶,您的 IAM 用户或角色必须至少拥有 kms:Encrypt kms:GenerateDataKey 权限。 

存储桶策略中的显式 deny 语句

查看存储桶策略中显示拒绝 ("Effect": "Deny") s3:PutObject 权限的任何语句,除非已满足特定条件。验证您的上传符合访问 s3: PutObject 操作的存储桶策略要求。 

例如,如果您的存储桶策略显式拒绝 s3:PutObject,则验证您正在使用正确的加密标头上传对象,除非请求包括使用 AWS KMSAmazon S3 托管加密密钥的服务器端加密。

存储桶策略中的以下示例语句显式拒绝对存储桶 awsdoc-example-bucket 上的 s3:PutObject 的任何访问,除非上传请求包括使用 AWS KMS 密钥 arn:aws:kms:us-east-1:111122223333:key 进行的加密:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ExampleStmt",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Deny",
      "Resource": "arn:aws:s3:::awsdoc-example-bucket/*",
      "Condition": {
        "StringNotLikeIfExists": {
          "s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/*"
        }
      },
      "Principal": "*"
    }
  ]
}

警告:在保存具有显式 deny 语句的存储桶策略之前,您必须仔细检查显式拒绝访问的参数。如果您被意外锁定,请参阅我意外拒绝了所有人对我的 Amazon S3 存储桶的访问。如何重新获得访问权限?

存储桶 ACL 不允许根用户写入对象

如果您使用根用户账户将对象上传至 S3 存储桶,则验证存储桶 ACL 授予根用户对写入对象的访问权。有关更多信息,请参阅如何设置 ACL 存储桶权限? 

AWS Organizations 服务控制策略不允许访问 Amazon S3

如果您使用的是 AWS Organizations,则检查服务控制策略以确保允许访问 Amazon S3。

例如,当您尝试访问 Amazon S3 时,以下策略将导致 HTTP 403 禁止访问错误,因为它会显式拒绝访问:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Deny",
    "Action": "S3:*",
    "Resource": "*"
  }]
}

有关 AWS Organizations 功能的更多信息,请参阅启用组织中的所有功能