排查 Amazon S3 中的拒绝访问(403 禁止)错误 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

以下主题涵盖了 Amazon S3 中拒绝访问(403 禁止)错误的最常见原因。

注意

如果您正在尝试对权限问题进行故障排查,请从存储桶策略和 IAM policy 部分开始,并确保按照有关检查权限的提示中的指南进行操作。

桶策略和 IAM policy

桶级别操作

如果没有桶策略,则桶会隐式允许来自桶拥有者账户中的任何 Amazon Identity and Access Management(IAM)身份的请求。桶还隐式拒绝来自任何其他账户的任何其他 IAM 身份的请求以及匿名(未签名)请求。但是,如果没有 IAM 用户策略,则会隐式拒绝请求者(除非他们是根用户)发出任何请求。有关此评估逻辑的更多信息,请参阅《IAM 用户指南》中的确定是允许还是拒绝账户内的请求

对象级别操作

如果对象归桶拥有者账户拥有,则桶策略和 IAM 用户策略在对象级别操作中的运作方式与在桶级别操作中的运行方式相同。例如,如果没有桶策略,则桶会隐式允许来自桶拥有者账户中的任何 IAM 身份的对象请求。桶还隐式拒绝来自任何其他账户的任何其他 IAM 身份的对象请求以及匿名(未签名)请求。但是,如果没有 IAM 用户策略,则会隐式拒绝请求者(除非他们是根用户)发出任何对象请求。

如果对象归外部账户拥有,则只能通过对象访问控制列表(ACL)授予对该对象的访问权限。桶策略和 IAM 用户策略仍可用于拒绝对象请求。

因此,为确保您的桶策略或 IAM 用户策略不会导致拒绝访问(403 禁止)错误,请确保满足以下要求:

  • 对于同账户访问,无论是在桶策略还是 IAM 用户策略中,都不得针对您尝试向其授予权限的请求者使用显式 Deny 语句。如果您想仅使用桶策略和 IAM 用户策略授予权限,则其中一个策略中必须至少有一条显式 Allow 语句。

  • 对于跨账户访问,无论是在桶策略还是 IAM 用户策略中,都不得针对您尝试向其授予权限的请求者使用显式 Deny 语句。如果您想仅使用桶策略和 IAM 用户策略授予跨账户权限,则请求者的桶策略和 IAM 用户策略都必须包含显式 Allow 语句。

注意

桶策略中的 Allow 语句仅适用于由同一桶拥有者账户拥有的对象。但是,无论对象所有权如何,桶策略中的 Deny 语句都适用于所有对象。

查看或编辑您的桶策略
注意

要查看或编辑桶策略,您必须拥有 s3:GetBucketPolicy 权限。

  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在左侧导航窗格中,选择

  3. 列表中,选择要查看或编辑其桶策略的桶的名称。

  4. 选择权限选项卡。

  5. Bucket policy(桶策略)下,请选择 Edit(编辑)。将出现 Edit bucket policy(编辑桶策略)页面。

要使用 Amazon Command Line Interface(Amazon CLI)查看或编辑您的桶策略,请使用 get-bucket-policy 命令。

注意

如果您因为桶策略不正确而被锁定在桶之外,请使用根用户凭证登录 Amazon Web Services Management Console。要重新获得对桶的访问权限,请务必使用根用户凭证删除桶策略。

有关检查权限的提示

要检查请求者是否具有执行 Amazon S3 操作的适当权限,请尝试以下操作:

Amazon S3 ACL 设置

检查 ACL 设置时,请先查看您的对象所有权设置,以检查桶上是否已启用 ACL。请注意,ACL 权限只能用于授予权限,而不能用于拒绝请求。ACL 也不能用于向由于桶策略或 IAM 用户策略中的显式拒绝而被拒绝的请求者授予访问权限。

对象所有权设置设为强制桶拥有者

如果启用了强制桶拥有者设置,则 ACL 设置不太可能导致拒绝访问(403 禁止)错误,因为此设置会禁用适用于桶和对象的所有 ACL。强制桶拥有者是 Amazon S3 桶的原定设置,并且是推荐设置。

对象所有权设置设为首选桶拥有者或对象写入者

使用首选桶拥有者设置或对象编写者设置时,ACL 权限仍然有效。ACL 有两种:桶 ACL 和对象 ACL。有关这两种类型的 ACL 之间的区别,请参阅 ACL 权限和访问策略权限的映射

根据被拒绝的请求的操作,检查您的桶或对象的 ACL 权限

  • 如果 Amazon S3 拒绝了 LISTPUT 对象、GetBucketAclPutBucketAcl 请求,请查看您的桶的 ACL 权限

    注意

    您无法使用桶 ACL 设置授予 GET 对象权限。

  • 如果 Amazon S3 拒绝了对 S3 对象的 GET 请求或拒绝了 PutObjectAcl 请求,请查看该对象的 ACL 权限

    重要

    如果拥有该对象的账户与拥有该桶的账户不同,则对该对象的访问权限不受桶策略控制。

排查在跨账户对象所有权期间来自 GET 对象请求的拒绝访问(403 禁止)错误

查看桶的对象所有权设置以确定对象拥有者。如果您有权访问对象 ACL,则还可以检查对象拥有者的帐户。(要查看对象拥有者的账户,请在 Amazon S3 控制台中查看对象 ACL 设置。) 或者,您也可以发出 GetObjectAcl 请求,以查找对象拥有者的规范 ID 来验证对象拥有者账户。原定设置情况下,ACL 为对于对象拥有者账户的 GET 请求授予显式允许权限。

确认对象拥有者与桶拥有者不同后,根据您的使用案例和访问级别,选择以下方法之一来帮助解决拒绝访问(403 禁止)错误:

  • 禁用 ACL(推荐) – 此方法适用于所有对象,可由桶拥有者执行。这种方法自动向桶拥有者授予对桶中每个对象的所有权和完全控制权。在实施此方法之前,请检查禁用 ACL 的先决条件。有关如何将您的桶设置为强制桶拥有者(推荐)模式的信息,请参阅在现有桶上设置对象所有权

    重要

    为防止拒绝访问(403 禁止)错误,请务必在禁用 ACL 之前将 ACL 权限迁移到桶策略。有关更多信息,请参阅从 ACL 权限迁移的桶策略示例

  • 将对象拥有者更改为桶拥有者 - 此方法可以应用于单个对象,但只有对象拥有者(或具有相应权限的用户)才能更改对象的所有权。可能会收取额外的 PUT 费用。(有关更多信息,请参阅 Amazon S3 定价。) 此方法向桶拥有者授予对象的完全所有权,允许桶拥有者通过桶策略控制对于对象的访问权限。

    要更改对象的所有权,请执行以下操作之一:

    • 您(桶拥有者)可以将对象复制回桶。

    • 您可以将桶的对象所有权设置更改为首选桶拥有者。如果禁用版本控制,则桶中的对象将被覆盖。如果启用了版本控制,则同一对象的重复版本将出现在桶中,而桶拥有者可以将生命周期规则设置为过期。有关如何更改对象所有权设置的说明,请参阅为现有存储桶设置对象所有权

      注意

      当您将对象所有权设置更新为首选桶拥有者时,该设置仅适用于上传到桶的新对象。

    • 您可以让对象拥有者使用 bucket-owner-full-control 标准对象 ACL 再次上传对象。

    注意

    对于跨账户上传,您还可以在桶策略中要求使用 bucket-owner-full-control 标准对象 ACL。有关桶策略示例,请参阅在授予上传对象的跨账户权限的同时,确保桶拥有者拥有完全控制权

  • 将对象编写者保持为对象拥有者 - 此方法不会更改对象拥有者,但它允许您单独授予对于对象的访问权限。要授予对于对象的访问权限,您必须拥有该对象的 PutObjectAcl 权限。然后,要修复“拒绝访问(403 禁止)”错误,请将请求者添加为被授予者,以访问对象的 ACL 中的对象。有关更多信息,请参阅配置 ACL

S3 屏蔽公共访问权限设置

如果失败的请求涉及公共访问权限或公共策略,请检查您的账户、桶或 S3 接入点上的 S3 屏蔽公共访问权限设置。从 2023 年 4 月开始,原定设置情况下为新桶启用所有屏蔽公共访问权限设置。有关 Amazon S3 如何定义“公共”的更多信息,请参阅“公有”的含义

设置为 TRUE 时,屏蔽公共访问权限设置充当显式拒绝策略,可覆盖 ACL、桶策略和 IAM 用户策略所允许的权限。要确定您的屏蔽公共访问权限设置是否拒绝您的请求,请查看以下场景:

  • 如果指定的访问控制列表(ACL)为公共性质,则 BlockPublicAcls 设置将拒绝您的 PutBucketAclPutObjectACL 调用。

  • 如果请求包含公共 ACL,则 BlockPublicAcls 设置会拒绝 PutObject 调用。

  • 如果将 BlockPublicAcls 设置应用于某个账户,并且请求包含公共 ACL,那么包括公共 ACL 的任何 CreateBucket 调用都将失败。

  • 如果您的请求的权限仅由公共 ACL 授予,则 IgnorePublicAcls 设置会拒绝该请求。

  • 如果指定的桶策略允许公共访问权限,则 BlockPublicPolicy 设置会拒绝您的 PutBucketPolicy 调用。

  • 如果将 BlockPublicPolicy 设置应用于接入点,则所有指定公共策略并通过接入点发出的 PutAccessPointPolicyPutBucketPolicy 调用都将失败。

  • 如果接入点或桶具有公共策略,则 RestrictPublicBuckets 设置会拒绝除 Amazon Web Service 主体之外的所有跨账户调用。此设置还拒绝所有匿名(或未签名的)调用。

要查看和更新您的屏蔽公共访问权限设置配置,请参阅为 S3 存储桶配置屏蔽公共访问权限设置

Amazon S3 加密设置

Amazon S3 支持对您的桶进行服务器端加密。服务器端加密是指由接收数据的应用程序或服务在目标位置对数据进行加密。Amazon S3 在将您的数据写入 Amazon 数据中心内的磁盘时会在对象级别加密这些数据,并在您访问这些数据时解密这些数据。

原定设置情况下,Amazon S3 现在应用具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3),作为 Amazon S3 中每个桶的基本加密级别。Amazon S3 还允许您在上传对象时指定服务器端加密方法。

查看您的桶的服务器端加密状态和加密设置
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在左侧导航窗格中,选择

  3. 列表中,请选择要检查其加密设置的桶。

  4. 选择 Properties(属性)选项卡。

  5. 向下滚动到原定设置加密部分,并查看加密类型设置。

要使用 Amazon CLI 检查您的加密设置,请使用 get-bucket-encryption 命令。

检查对象的加密状态
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在左侧导航窗格中,选择

  3. 列表中,请选择包含对象的桶的名称。

  4. 对象列表中,请选择要为其添加或更改加密的对象的名称。

    此时将显示对象的详细信息页面。

  5. 向下滚动到服务器端加密设置部分,以查看对象的服务器端加密设置。

要使用 Amazon CLI 检查您的对象加密状态,请使用 head-object 命令。

加密和权限要求

Amazon S3 支持三种类型的服务器端加密:

  • 具有 Amazon S3 托管式密钥的服务器端加密 (SSE-S3)

  • 具有 Amazon Key Management Service (Amazon KMS) 密钥的服务器端加密 (SSE-KMS)

  • 使用客户提供的密钥进行服务器端加密 (SSE-C)

根据您的加密设置,请确保满足以下权限要求:

  • SSE-S3 - 不需要额外的权限。

  • SSE-KMS(使用客户自主管理型密钥) - 要上传对象,需要针对 Amazon KMS key 的 kms:GenerateDataKey 权限。要下载对象和执行对象的分段上传,需要针对 KMS 密钥的 kms:Decrypt 权限。

  • SSE-KMS(具有 Amazon 托管式密钥)– 请求者必须来自拥有 aws/s3 KMS 密钥的同一个账户。请求者还必须具有正确的 Amazon S3 权限才能访问该对象。

  • SSE-C(具有客户提供的密钥) - 无需其他权限。您可以配置桶策略,以要求和限制具有客户提供的加密密钥的服务器端加密来加密桶中的对象。

如果使用客户自主管理型密钥加密对象,请确保 KMS 密钥策略允许您执行 kms:GenerateDataKeykms:Decrypt 操作。有关检查 KMS 密钥策略的说明,请参阅《Amazon Key Management Service 开发人员指南》中的查看密钥策略

S3 对象锁定设置

如果您的桶启用了 S3 对象锁定并且该对象受保留期法定保留保护,则当您尝试删除该对象时,Amazon S3 会返回拒绝访问(403 禁止)错误。

检查桶是否启用了对象锁定
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在左侧导航窗格中,选择

  3. 列表中,请选择您想要查看的桶的名称。

  4. 选择 Properties(属性)选项卡。

  5. 向下滚动到对象锁定部分。验证对象锁定设置是已启用还是已禁用

要确定该对象是受保留期保护还是受法定保留保护,请查看对象的锁定信息

如果对象受保留期或法定保留保护,请检查以下各项:

  • 如果对象版本受合规性保留模式保护,则无法将其永久删除。来自任何请求者(包括根用户)的永久 DELETE 请求都将导致拒绝访问(403 禁止)错误。另请注意,当您对于受合规性保留模式保护的对象提交 DELETE 请求时,Amazon S3 会为该对象创建删除标记

  • 如果对象版本受监管保留模式保护并且您具有 s3:BypassGovernanceRetention 权限,则可以绕过此保护并永久删除该版本。有关更多信息,请参阅绕过监管模式

  • 如果对象版本受法定保留保护,则永久 DELETE 请求可能会导致拒绝访问(403 禁止)错误。要永久删除对象版本,必须解除对于对象版本的法定保留。要解除法定保留,您必须具有 s3:PutObjectLegalHold 权限。有关解除法定保留的更多信息,请参阅配置 S3 对象锁定

VPC 端点策略

如果您使用虚拟私有云(VPC)端点访问 Amazon S3,请确保 VPC 端点策略不会阻止您访问 Amazon S3 资源。原定设置情况下,VPC 端点策略允许向 Amazon S3 发出的所有请求。您还可以配置 VPC 端点策略以限制某些请求。有关如何检查 VPC 端点策略的信息,请参阅《Amazon PrivateLink 指南》中的使用端点策略控制对 VPC 端点的访问

Amazon Organizations 策略

如果您的 Amazon Web Services 账户属于某个组织,则 Amazon Organizations 策略可能会阻止您访问 Amazon S3 资源。原定设置情况下,Amazon Organizations 策略不会阻止向 Amazon S3 发出的任何请求。但是,请确保您的 Amazon Organizations 策略未配置为阻止对 S3 桶进行访问。有关如何检查 Amazon Organizations 策略的说明,请参阅《Amazon Organizations 用户指南》中的列出所有策略

接入点设置

如果您在通过 Amazon S3 接入点发出请求时收到“拒绝访问(403 禁止)”错误,则可能需要检查以下内容:

  • 接入点的配置

  • 用于接入点的 IAM 用户策略

  • 用于管理或配置跨账户接入点的桶策略

接入点配置和策略
  • 创建接入点时,可以选择将互联网VPC 指定为网络来源。如果网络来源设置为仅限 VPC,Amazon S3 将拒绝向接入点发出的任何并非源自指定 VPC 的请求。要检查接入点的网络来源,请参阅创建限制到 Virtual Private Cloud 的接入点

  • 使用接入点,您还可以配置自定义的屏蔽公共访问权限设置,其工作原理与桶或账户级别的屏蔽公共访问权限设置类似。要查看您的自定义屏蔽公共访问权限设置,请参阅管理接入点的公有访问

  • 要使用接入点向 Amazon S3 发出成功的请求,请确保请求者拥有必要的 IAM 权限。有关更多信息,请参阅配置使用接入点的 IAM 策略

  • 如果请求涉及跨账户接入点,请确保桶拥有者已更新桶策略,以授权来自接入点的请求。有关更多信息,请参阅授予跨账户接入点的权限

如果在检查了本主题中的所有项目后,拒绝访问(403 禁止)错误仍然存在,请检索您的 Amazon S3 请求 ID 并联系 Amazon Web Services Support 以获取更多指导。