为什么我在使用 Amazon S3 控制台尝试上传文件时收到 HTTP 403 禁止访问错误?

上次更新时间:2020 年 6 月 29 日

我尝试使用 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 密钥的权限

如果 S3 存储桶使用采用自定义 AWS KMS 密钥的默认加密,您必须拥有使用该密钥的权限才能访问该存储桶。

要获取使用该密钥的权限,密钥管理员必须将您添加为自定义 AWS KMS 密钥的用户。密钥管理员必须遵照以下步骤将您添加为密钥用户:

  1. 打开 AWS KMS 控制台
  2. 从导航窗格中选择客户管理的密钥
  3. 从密钥列表中,选择与存储桶关联的密钥。
  4. 密钥用户下,选择添加
  5. 添加密钥用户 对话框中,选择 IAM 用户,然后选择添加

存储桶策略中的显式 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 功能的更多信息,请参阅启用组织中的所有功能