如何对来自 Amazon S3 的“403 访问被拒绝”错误进行故障排除?

4 分钟阅读
1

我的用户尝试访问我的 Amazon Simple Storage Service (Amazon S3) 存储桶中的对象,但 Amazon S3 返回“403 访问被拒绝”错误。

解决方案

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

使用 AWS Systems Manager 自动化文档

为了帮助您确定从指定的公有 S3 存储桶读取对象时出现的问题,请使用 AWS Systems Manager 上的 AWSSupport-TroubleshootS3PublicRead 自动化文档。

检查您的存储桶和对象所有权设置

对于来自 GetObjectHeadObject 请求的 AccessDenied 错误,请检查对象和存储桶的拥有者是否相同。此外,请检查存储桶拥有者是否具有读取或完全控制访问控制列表 (ACL) 权限

**注意:**当创建新的存储桶时,ACL 默认处于关闭状态。最佳做法是使用 AWS Identity and Access Management (IAM) 策略(而不是 ACL)来控制对 S3 资源的访问。

确认拥有这些对象的账户

默认情况下,拥有用于存储对象的存储桶的 AWS 账户也拥有该对象。如果其他账户可以将对象上传到您的存储桶,请检查您的用户无法访问的对象的权限。

要检查存储桶和对象的拥有者是否相同,请完成以下步骤:

  1. 运行 AWS CLI 命令 list-buckets 以获取您账户的 Amazon S3 规范 ID:

    aws s3api list-buckets --query "Owner.ID"
  2. 运行 list-objects 命令以获取您的用户无法访问的对象所属账户的 Amazon S3 规范 ID:

    aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix exampleprefix

    **注意:**请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称,将 exampleprefix 替换为您的前缀值。您可以使用 list-objects 命令同时检查多个对象。

  3. 如果规范 ID 不匹配,则表示您不拥有该对象。对象拥有者可以通过运行 put-object-acl 命令授予您对该对象的完全控制权限:

    aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key exampleobject.jpg --acl bucket-owner-full-control

    **注意:**请将 DOC-EXAMPLE-BUCKET 替换为包含对象的存储桶的名称,将 exampleobject.jpg 替换为密钥名称。

  4. 在对象拥有者将对象的 ACL 更改为 bucket-owner-full-control 后,存储桶拥有者可以访问该对象。要将对象拥有者更改为存储桶的账户,请从存储桶账户运行 cp 命令,将对象复制到其自身上。

创建具有存储桶权限的 IAM 角色

如果 IAM 角色和存储桶拥有者属于同一个账户,那么 IAM 角色或存储桶之一必须具有权限。您不需要同时具有 IAM 角色和存储桶的权限。

要在不同的账户中添加权限,请在您的账户中创建一个具有存储桶权限的 IAM 角色。然后,授予另一个账户代入该 IAM 角色的权限。有关详细信息,请参阅 IAM 教程: 使用 IAM 角色委托跨 AWS 账户的访问权限

检查存储桶策略或 IAM 用户策略

查看存储桶策略或关联的 IAM 用户策略中是否存在可能拒绝访问的语句。验证对存储桶的请求是否满足存储桶策略或 IAM 策略中的条件。检查策略中是否存在不正确的拒绝语句、缺失的操作或拼写错误。

拒绝语句条件

根据以下内容检查拒绝语句中是否存在阻止访问的条件:

  • 多重身份验证 (MFA)
  • 加密密钥
  • 特定的 IP 地址
  • 特定的虚拟私有云 (VPC) 或 VPC 端点
  • 特定的 IAM 用户或角色

**注意:**如果您要求进行 MFA,且用户使用 AWS CLI 发送请求,请确保用户配置 AWS CLI 以使用 MFA

例如,在下面的存储桶策略中,Statement1 允许公共访问权限从 DOC-EXAMPLE-BUCKET 下载对象 (s3:GetObject)。然而,Statement2 明确地拒绝所有人从 DOC-EXAMPLE-BUCKET 下载对象,除非请求来自 VPC 端点 vpce-1a2b3c4d。由于拒绝语句优先于允许语句,因此尝试从 vpce-1a2b3c4d 外部下载对象的用户将被拒绝访问。

{  
  "Id": "Policy1234567890123",  
  "Version": "2012-10-17",  
  "Statement": [  
    {  
      "Sid": "Statement1",  
      "Action": [  
        "s3:GetObject"  
      ],  
      "Effect": "Allow",  
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",  
      "Principal": "*"  
    },  
    {  
      "Sid": "Statement2",  
      "Action": [  
        "s3:GetObject"  
      ],  
      "Effect": "Deny",  
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",  
      "Condition": {  
        "StringNotEquals": {  
          "aws:SourceVpce": "vpce-1a2b3c4d"  
        }  
      },  
      "Principal": "*"  
    }  
  ]  
}

存储桶策略或 IAM 策略

检查存储桶策略或 IAM 策略是否允许用户必须执行的 Amazon S3 操作。例如,以下存储桶策略不包含 s3:PutObjectAcl 操作的权限:

{  
  "Id": "Policy1234567890123",  
  "Version": "2012-10-17",  
  "Statement": [  
    {  
      "Sid": "Stmt1234567890123",  
      "Action": [  
        "s3:PutObject"  
      ],  
      "Effect": "Allow",  
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",  
      "Principal": {  
        "AWS": [  
          "arn:aws:iam::111122223333:user/Dave"  
        ]  
      }  
    }  
  ]  
}

如果 IAM 用户尝试修改对象的 ACL,则用户会收到 Access Denied(访问被拒绝)错误。

其他策略错误

检查存储桶策略或 IAM 用户策略中是否存在多余的空格、不正确的 ARN 或其他拼写错误。

如果 IAM 策略的 ARN 中存在多余空格,则对 ARN 的评估将不正确,且用户会收到 Access Denied(访问被拒绝)错误。例如,ARN 中存在多余空格的 IAM 策略:arn:aws:s3::: DOC-EXAMPLE-BUCKET/* 将被评估为 arn:aws:s3:::%20DOC-EXAMPLE-BUCKET/

确认 IAM 权限边界允许访问 Amazon S3

确认在 IAM 实体上设置的 IAM 权限边界允许访问 Amazon S3。

检查存储桶的 Amazon S3 屏蔽公共访问权限设置

如果您在被允许的公共读取请求上收到 Access Denied(访问被拒绝)错误,请检查账户和存储桶上的 Amazon S3 屏蔽公共访问权限设置。这些设置会覆盖允许公共读取访问的权限。

查看用户凭证

查看用户已配置用于访问 Amazon S3 的凭证。用户必须将 AWS SDK 和 AWS CLI 配置为使用有权访问您的存储桶的 IAM 身份的凭证。

对于 AWS CLI,运行 configure 命令以检查凭证:

aws configure list

如果用户使用 Amazon Elastic Compute Cloud (Amazon EC2) 实例访问您的存储桶,请验证该实例是否使用了正确的角色。连接到实例,然后运行 get-caller-identity 命令:

aws sts get-caller-identity

查看临时安全凭证

如果用户收到 AWS Security Token Service (AWS STS) 授予的临时安全凭证发出的 Access Denied(访问被拒绝)错误,请查看关联的会话策略。当管理员使用 AssumeRole API 调用或 assume-role 命令创建临时安全凭证时,他可以传递特定于会话的策略。

要查找关联的会话策略,请在访问请求失败的同一时间范围内在 AWS CloudTrail 事件历史记录中查找 AssumeRole 事件。然后,查看 CloudTrail 日志 requestParameters 字段中的 policypolicyArns 参数。确认关联的策略或策略 ARN 授予了必要的 Amazon S3 权限。

例如,下面的 CloudTrail 日志代码段显示临时凭证包含一个内联会话策略,该策略将 s3:GetObject 权限授予 DOC-EXAMPLE-BUCKET

"requestParameters": {  
    "roleArn": "arn:aws:iam::123412341234:role/S3AdminAccess",  
    "roleSessionName": "s3rolesession",  
    "policy": "{  
    "Version": "2012-10-17",  
    "Statement": [{  
            "Effect": "Allow",  
            "Action": [  
                "s3:GetObject"  
            ],  
            "Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"]  
    }]  
    }"  
}

确认 Amazon VPC 端点策略包含用于访问您的 S3 资源的正确权限

如果您的用户使用通过 Amazon Virtual Private Cloud (Amazon VPC) 端点路由的 EC2 实例来访问存储桶,请检查 VPC 端点策略

例如,以下 VPC 端点策略仅允许访问 DOC-EXAMPLE-BUCKET。使用 VPC 端点发送请求的用户无法访问任何其他存储桶:

{  
  "Id": "Policy1234567890123",  
  "Version": "2012-10-17",  
  "Statement": [  
    {  
      "Sid": "Stmt1234567890123",  
      "Action": [  
        "s3:GetObject",  
        "s3:PutObject",  
        "s3:ListBucket"  
      ],  
      "Effect": "Allow",  
      "Resource": [  
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET",  
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"  
      ],  
      "Principal": "*"  
    }  
  ]  
}

查看您的 Amazon S3 接入点的 IAM 策略

如果您使用 Amazon S3 接入点管理对存储桶的访问,请查看接入点的 IAM 策略

只有当关联的存储桶策略也允许相同的访问权限时,您在接入点策略中授予的权限才有效。确认存储桶策略和接入点策略均授予了正确的权限。

确认存储桶中存在对象,且该对象的名称中不包含特殊字符

检查存储桶中是否存在请求的对象。否则,请求找不到对象,Amazon S3 会假定该对象不存在。如果您没有适当的 s3:ListBucket 权限,则您会收到 Access Denied(访问被拒绝)错误(而不是 404 Not Found(404 未找到)错误)。

**注意:**检索名称中包含特殊字符的对象的过程有所不同。

运行 AWS CLI 命令 head-object 以检查存储桶中是否存在对象:

aws s3api head-object --bucket DOC-EXAMPLE-BUCKET --key exampleobject.jpg

**注意:**请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶的名称。

如果存储桶中存在该对象,则 Access Denied(访问被拒绝)错误不会屏蔽 404 Not Found(404 未找到)错误。检查其他配置要求以解决 Access Denied(访问被拒绝)错误。

如果存储桶中不存在该对象,则 Access Denied(访问被拒绝)错误将屏蔽 404 Not Found(404 未找到)错误。解决与对象缺失相关的问题。

检查 AWS KMS 加密配置

如果 IAM 用户拥有对象的完全权限但仍无法访问该对象,则请检查该对象是否启用了 AWS Key Management Service (AWS KMS) 加密 (SSE-KMS)。您可以使用 Amazon S3 控制台查看对象的属性并检查对象的 SSE-KMS 信息。

如果对象使用客户自主管理型密钥进行加密,则 KMS 密钥政策必须允许您执行 kms:GenerateDataKeykms:Decrypt 操作。有关详细信息,请参阅允许访问 AWS 账户并激活 IAM 策略

如果 IAM 用户所属的账户与 AWS KMS 密钥不同,则请修改 IAM 策略以授予 Kms:Decrypt 权限。例如,要下载 SSE-KMS 对象,您必须在密钥政策和 IAM 策略中均指定 kms:Decrypt 权限。有关 IAM 用户和 KMS 密钥之间的跨账户访问的详细信息,请参阅允许其他账户中的用户使用 KMS 密钥

对于激活了申请方付款的存储桶,请确认用户指定了 request-payer 参数

如果您的存储桶激活了申请方付款,则其他账户的用户在向您的存储桶发送请求时必须指定 request-payer 参数。要确认您是否激活了申请方付款,请使用 Amazon S3 控制台查看存储桶属性

以下 AWS CLI 命令示例包含用于访问启用了“申请方付款”的跨账户存储桶的正确参数:

aws s3 cp exampleobject.jpg s3://DOC-EXAMPLE-BUCKET/exampleobject.jpg --request-payer requester

检查 AWS Organizations SCP

如果您使用 AWS Organizations,请检查服务控制策略 (SCP) 以确保允许访问 Amazon S3。SCP 为受影响的账户指定最大权限。例如,以下 SCP 显式拒绝了对 Amazon S3 的访问,这会导致 Access Denied(访问被拒绝)错误:

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

有关 AWS Organizations 功能的详细信息,请参阅使用 AWS Organizations 启用组织中的所有功能

相关信息

排查 Amazon S3 中的拒绝访问 (403 Forbidden) 错误

获取用于 AWS Support 的 Amazon S3 请求 ID

AWS 官方
AWS 官方已更新 6 个月前