排查 Amazon S3 中的拒绝访问(403 Forbidden)错误
当 AWS 显式或隐式拒绝授权请求时,将显示拒绝访问(HTTP 403 Forbidden
)错误。
-
当策略包含特定的 AWS 操作的
Deny
语句时,将发生显式拒绝。 -
当没有适用的
Deny
语句且没有适用的Allow
语句时,会发生隐式拒绝。
由于 AWS Identity and Access Management(IAM)策略默认情况下隐式拒绝 IAM 主体,因此该策略必须显式支持主体执行操作。否则,该策略会隐式拒绝访问。有关更多信息,请参阅《IAM 用户指南》中的显式拒绝和隐式拒绝之间的区别。有关确定是支持还是拒绝访问请求的策略评估逻辑的信息,请参阅《IAM 用户指南》中的策略评估逻辑。
有关按 S3 资源类型对 S3 API 操作的权限的更多信息,请参阅 Amazon S3 API 操作所需的权限。
以下主题涵盖了 Amazon S3 中拒绝访问错误的最常见原因。
注意
对于拒绝访问(HTTP 403 Forbidden
)错误,如果请求是在存储桶拥有者的个人 AWS 账户或存储桶拥有者的 AWS 组织外部发起的,则 S3 不会向存储桶拥有者收费。
主题
注意
如果您正在尝试对权限问题进行故障排除,请从拒绝访问消息示例以及如何对其进行故障排除一节开始,然后转到桶策略和 IAM policy一节。另外,请务必遵循有关检查权限的提示中的指导。
拒绝访问消息示例以及如何对其进行故障排除
重要
从 2024 年 8 月 21 日起,针对同账户请求的增强拒绝访问错误消息将在未来几周内推出。这些消息将在所有 AWS 区域提供,包括 AWS GovCloud (US) Regions和中国区域。
大多数拒绝访问的错误消息都以 User
格式显示。在此示例中,user-arn
is not authorized to perform
action
on "resource-arn
"
because context
是未获得访问权限的用户的 Amazon 资源名称(ARN),user-arn
是策略拒绝的服务操作,而 action
是策略对其执行操作的资源的 ARN。resource-arn
字段表示有关策略类型的其它上下文,用于解释策略拒绝访问的原因。context
当策略因其包含 Deny
语句而显式拒绝访问时,拒绝访问错误消息中将包含短语 with an
explicit deny in a
。当策略隐式拒绝访问时,拒绝访问错误消息中将包含短语 type
policybecause no
。type
policy allows the
action
action
重要
-
仅针对同账号请求才返回增强拒绝访问消息。跨账户请求会返回一条一般
Access Denied
消息。有关确定是支持还是拒绝跨账户访问请求的策略评估逻辑的信息,请参阅《IAM 用户指南》中的跨账户策略评估逻辑。有关说明如何授予跨账户访问权限的演练,请参阅示例 2:存储桶拥有者授予跨账户存储桶权限。
-
向目录存储桶发出的请求不会返回增强拒绝访问错误消息。目录存储桶请求会返回一条一般
Access Denied
消息。 -
如果同一策略类型的多个策略拒绝授权请求,拒绝访问错误消息不指定策略的数量。
-
如果多种策略类型拒绝授权请求,则错误消息仅包含其中一种策略类型。
-
如果由于多种原因而拒绝访问请求,则错误消息仅包含拒绝原因之一。
下面的示例展示了不同类型的拒绝访问错误消息的格式以及如何对每种类型的消息进行故障排除。
由于服务控制策略而拒绝访问 – 隐式拒绝
-
检查服务控制策略(SCP)中的操作是否有缺少的
Allow
语句。对于以下示例,操作为s3:GetObject
。 -
通过添加
Allow
语句来更新 SCP。有关更多信息,请参阅 AWS Organizations 用户指南中的更新 SCP。
User: arn:aws:iam::
777788889999
:user/MaryMajor
is not authorized to perform: s3:GetObject because no service control policy allows the s3:GetObject action
由于服务控制策略而拒绝访问 – 显式拒绝
-
检查服务控制策略(SCP)中的操作是否有
Deny
语句。对于以下示例,操作为s3:GetObject
。 -
通过更改
Deny
语句以支持用户获得必要的访问权限,来更新您的 SCP。有关如何执行此操作的示例,请参阅《AWS Organizations 用户指南》中的 Prevent IAM users and roles from making specified changes, with an exception for a specified admin role。有关更新 SCP 的更多信息,请参阅《AWS Organizations 用户指南》中的 Updating an SCP。
User: arn:aws:iam::
777788889999
:user/MaryMajor
is not authorized to perform: s3:GetObject with an explicit deny in a service control policy
由于 VPC 端点策略而拒绝访问 – 隐式拒绝
-
检查虚拟私有云(VPC)端点策略中的操作是否有缺失的
Allow
语句。对于以下示例,操作为s3:GetObject
。 -
通过添加
Allow
语句来更新 VPC 端点策略。有关更多信息,请参阅《AWS PrivateLink 指南》中的更新 VPC 端点策略。
User: arn:aws:iam::
123456789012
:user/MaryMajor
is not authorized to perform: s3:GetObject because no VPC endpoint policy allows the s3:GetObject action
由于 VPC 端点策略而拒绝访问 – 显式拒绝
-
检查虚拟私有云(VPC)端点策略中的操作是否有显式
Deny
语句。对于以下示例,操作为s3:GetObject
。 -
通过更改
Deny
语句以支持用户获得必要的访问权限,来更新 VPC 端点策略。例如,可以更新Deny
语句来使用aws:PrincipalAccount
条件键和StringNotEquals
条件运算符,从而支持特定的主体进行访问,如示例 7:从 Deny 语句中排除特定主体中所示。有关更新 VPC 端点策略的更多信息,请参阅《AWS PrivateLink 指南》中的 Update a VPC endpoint policy。
User: arn:aws:iam::
123456789012
:user/MaryMajor
is not authorized to perform: s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1
/object-name
" with an explicit deny in a VPC endpoint policy
由于权限边界而拒绝访问 – 隐式拒绝
-
检查权限边界中的操作是否有缺失的
Allow
语句。对于以下示例,操作为s3:GetObject
。 -
通过将
Allow
语句添加到 IAM policy 来更新权限边界。有关更多信息,请参阅《IAM 用户指南》中的 IAM 实体的权限边界和编辑 IAM 策略。
User: arn:aws:iam::
123456789012
:user/MaryMajor
is not authorized to perform: s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1
/object-name
" because no permissions boundary allows the s3:GetObject action
由于权限边界而拒绝访问 – 显式拒绝
-
检查权限边界中的操作是否有显式
Deny
语句。对于以下示例,操作为s3:GetObject
。 -
通过更改 IAM 策略中的
Deny
语句以支持用户获得必要的访问权限,来更新您的权限边界。例如,可以更新Deny
语句来使用aws:PrincipalAccount
条件键和StringNotEquals
条件运算符,从而支持特定的主体进行访问,如《IAM 用户指南》中的 aws:PrincipalAccount 所示。有关更多信息,请参阅《IAM 用户指南》中的 IAM 实体的权限边界和编辑 IAM 策略。
User: arn:aws:iam::
777788889999
:user/MaryMajor
is not authorized to perform: s3:GetObject with an explicit deny in a permissions boundary
由于会话策略而拒绝访问 – 隐式拒绝
User: arn:aws:iam::
123456789012
:user/MaryMajor
is not authorized to perform: s3:GetObject because no session policy allows the s3:GetObject action
由于会话策略而拒绝访问 – 显式拒绝
-
检查会话策略中的操作是否有显式
Deny
语句。对于以下示例,操作为s3:GetObject
。 -
通过更改
Deny
语句以支持用户获得必要的访问权限,来更新您的会话策略。例如,可以更新Deny
语句来使用aws:PrincipalAccount
条件键和StringNotEquals
条件运算符,从而支持特定的主体进行访问,如示例 7:从 Deny 语句中排除特定主体中所示。有关更新会话策略的更多信息,请参阅《IAM 用户指南》中的会话策略和编辑 IAM 策略。
User: arn:aws:iam::
123456789012
:user/MaryMajor
is not authorized to perform: s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1
/object-name
" with an explicit deny in a session policy
由于基于资源的策略而拒绝访问 – 隐式拒绝
注意
基于资源的策略 是指诸如存储桶策略和接入点策略之类的策略。
-
检查基于资源的策略中的操作是否有缺失的
Allow
语句。还要检查IgnorePublicAcls
S3 屏蔽公共访问权限设置是否应用于存储桶、接入点或账户级。对于以下示例,操作为s3:GetObject
。 -
通过添加
Allow
语句来更新策略。有关更多信息,请参阅《IAM 用户指南》中的基于资源的策略和编辑 IAM 策略。您可能还需要调整存储桶、接入点或账户的
IgnorePublicAcls
屏蔽公共访问权限设置。有关更多信息,请参阅由于屏蔽公共访问权限设置而拒绝访问 和为 S3 存储桶配置屏蔽公共访问权限设置。
User: arn:aws:iam::
123456789012
:user/MaryMajor
is not authorized to perform: s3:GetObject because no resource-based policy allows the s3:GetObject action
由于基于资源的策略而拒绝访问 – 显式拒绝
注意
基于资源的策略 是指诸如存储桶策略和接入点策略之类的策略。
-
检查基于资源的策略中的操作是否有显式
Deny
语句。还要检查RestrictPublicBuckets
S3 屏蔽公共访问权限设置是否应用于存储桶、接入点或账户级。对于以下示例,操作为s3:GetObject
。 -
通过更改
Deny
语句以支持用户获得必要的访问权限,来更新您的策略。例如,可以更新Deny
语句来使用aws:PrincipalAccount
条件键和StringNotEquals
条件运算符,从而支持特定的主体进行访问,如示例 7:从 Deny 语句中排除特定主体中所示。有关更新基于资源的策略的更多信息,请参阅《IAM 用户指南》中的基于资源的策略和编辑 IAM 策略。您可能还需要调整存储桶、接入点或账户的
RestrictPublicBuckets
屏蔽公共访问权限设置。有关更多信息,请参阅由于屏蔽公共访问权限设置而拒绝访问 和为 S3 存储桶配置屏蔽公共访问权限设置。
User: arn:aws:iam::
123456789012
:user/MaryMajor
is not authorized to perform: s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1
/object-name
" with an explicit deny in a resource-based policy
由于基于身份的策略而拒绝访问 – 隐式拒绝
User: arn:aws:iam::
123456789012
:user/MaryMajor
is not authorized to perform: s3:GetObject because no identity-based policy allows the s3:GetObject action
由于基于身份的策略而拒绝访问 – 显式拒绝
-
检查附加到身份的基于身份的策略中的操作中是否有显式
Deny
语句。对于以下示例,操作为附加到用户MaryMajor
的s3:GetObject
。 -
通过更改
Deny
语句以支持用户获得必要的访问权限,来更新您的策略。例如,可以更新Deny
语句来使用aws:PrincipalAccount
条件键和StringNotEquals
条件运算符,从而支持特定的主体进行访问,如《IAM 用户指南》中的 aws:PrincipalAccount 所示。有关更多信息,请参阅《IAM 用户指南》中的基于身份的策略和编辑 IAM 策略。
User: arn:aws:iam::
123456789012
:user/MaryMajor
is not authorized to perform: s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1
/object-name
" with an explicit deny in an identity-based policy
由于屏蔽公共访问权限设置而拒绝访问
Amazon S3 屏蔽公共访问权限特征提供接入点、存储桶和账户设置,帮助您管理对 Amazon S3 资源的公有访问。有关 Amazon S3 如何定义“公共”的更多信息,请参阅“公有”的含义。
默认情况下,新存储桶、接入点和对象不允许公有访问。但是,用户可以修改存储桶策略、接入点策略、IAM 用户策略、对象权限或访问控制列表(ACL)来支持公共访问权限。S3 屏蔽公共访问权限设置会覆盖这些策略、权限和 ACL。自 2023 年 4 月起,默认情况下为新存储桶启用所有屏蔽公共访问权限设置。
当 Amazon S3 收到访问存储桶或对象的请求时,它将确定该存储桶或存储桶拥有者的账户是否应用了屏蔽公共访问权限设置。如果请求是通过接入点发出,则 Amazon S3 还会检查接入点的屏蔽公共访问权限设置。如果现有的屏蔽公共访问权限设置禁止请求的访问,则 Amazon S3 将拒绝该请求。
Amazon S3 屏蔽公共访问权限提供四种设置。这些设置彼此独立,可任意组合使用。每个设置都可以应用于访问点、存储桶或整个 AWS 账户。如果接入点、存储桶或账户的屏蔽公共访问权限设置不同,则 Amazon S3 应用接入点、存储桶和账户设置的最严格组合。
当 Amazon S3 评估屏蔽公共访问权限设置是否禁止某一操作时,它将拒绝违反接入点、存储桶或账户设置的任何请求。
Amazon S3 屏蔽公共访问权限提供的四种设置如下:
-
BlockPublicAcls
– 此设置适用于PutBucketAcl
、PutObjectAcl
、PutObject
、CreateBucket
、CopyObject
和POST Object
请求。BlockPublicAcls
设置会导致以下行为:-
如果指定的访问控制列表(ACL)为公有,
PutBucketAcl
和PutObjectAcl
调用将失败。 -
如果请求包含公有 ACL,则
PutObject
调用失败。 -
如果将此设置应用于某个账户,则当请求包含公有 ACL 时,
CreateBucket
调用将失败,并返回 HTTP400
(Bad Request
) 响应。
例如,当对
CopyObject
请求的访问因BlockPublicAcls
设置而被拒绝时,您将收到以下消息:An error occurred (AccessDenied) when calling the CopyObject operation: User: arn:aws:sts::
123456789012
:user/MaryMajor
is not authorized to perform: s3:CopyObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1
/object-name
" because public access control lists (ACLs) are blocked by the BlockPublicAcls block public access setting. -
-
IgnorePublicAcls
–IgnorePublicAcls
设置会使 Amazon S3 忽略存储桶及其包含的任何对象上的所有公有 ACL。如果您的请求的权限仅由公共 ACL 授予,则IgnorePublicAcls
设置会拒绝该请求。由
IgnorePublicAcls
设置导致的任何拒绝都是隐式的。例如,如果IgnorePublicAcls
因公有 ACL 而拒绝GetObject
请求,您将收到以下消息:User: arn:aws:iam::
123456789012
:user/MaryMajor
is not authorized to perform: s3:GetObject because no resource-based policy allows the s3:GetObject action -
BlockPublicPolicy
– 此设置适用于PutBucketPolicy
和PutAccessPointPolicy
请求。为存储桶设置
BlockPublicPolicy
将导致 Amazon S3 在指定的存储桶策略支持公共访问权限时拒绝对PutBucketPolicy
的调用。如果指定的策略支持公共访问权限,则此设置也会导致 Amazon S3 针对存储桶的所有相同账户接入点拒绝对PutAccessPointPolicy
的调用。如果(为接入点或底层存储桶)指定的策略支持公共访问权限,则为接入点设置
BlockPublicPolicy
会导致 Amazon S3 拒绝通过该接入点对PutAccessPointPolicy
和PutBucketPolicy
进行的调用。例如,当对
PutBucketPolicy
请求的访问因BlockPublicPolicy
设置而被拒绝时,您将收到以下消息:An error occurred (AccessDenied) when calling the PutBucketPolicy operation: User: arn:aws:sts::
123456789012
:user/MaryMajor
is not authorized to perform: s3:PutBucketPolicy on resource: "arn:aws:s3:::amzn-s3-demo-bucket1
/object-name
" because public policies are blocked by the BlockPublicPolicy block public access setting. -
RestrictPublicBuckets
–RestrictPublicBuckets
设置会将使用公有策略对接入点或存储桶的访问权限限制为仅该存储桶拥有者账户和接入点拥有者账户中的 AWS 服务主体和授权用户。此设置会阻止对接入点或存储桶的所有跨账户访问(AWS 服务主体的访问除外),但仍支持该账户内的用户管理接入点或存储桶。此设置还拒绝所有匿名(或未签名的)调用。由
RestrictPublicBuckets
设置导致的任何拒绝都是显式的。例如,如果RestrictPublicBuckets
因公有存储桶或接入点策略而拒绝GetObject
请求,您将收到以下消息:User: arn:aws:iam::
123456789012
:user/MaryMajor
is not authorized to perform: s3:GetObject on resource: "arn:aws:s3:::amzn-s3-demo-bucket1
/object-name
" with an explicit deny in a resource-based policy
有关这些设置的更多信息,请参阅 屏蔽公共访问权限设置。要查看和更新这些设置,请参阅配置屏蔽公共访问权限。
桶策略和 IAM policy
存储桶级别操作
如果没有存储桶策略,则存储桶会隐式支持来自存储桶拥有者账户中任何 AWS Identity and Access Management(IAM)身份的请求。桶还隐式拒绝来自任何其他账户的任何其他 IAM 身份的请求以及匿名(未签名)请求。但是,如果没有 IAM 用户策略,则会隐式拒绝请求者(除非他们是 AWS 账户根用户)发出任何请求。有关此评估逻辑的更多信息,请参阅《IAM 用户指南》中的确定是允许还是拒绝账户内的请求。
对象级别操作
如果对象归桶拥有者账户拥有,则桶策略和 IAM 用户策略在对象级别操作中的运作方式与在桶级别操作中的运行方式相同。例如,如果没有存储桶策略,则存储桶会隐式支持来自存储桶拥有者账户中任何 IAM 身份的对象请求。桶还隐式拒绝来自任何其他账户的任何其他 IAM 身份的对象请求以及匿名(未签名)请求。但是,如果没有 IAM 用户策略,则会隐式拒绝请求者(除非他们是 AWS 账户根用户)发出任何对象请求。
如果对象归外部账户拥有,则只能通过对象访问控制列表(ACL)授予对该对象的访问权限。桶策略和 IAM 用户策略仍可用于拒绝对象请求。
因此,为确保存储桶策略或 IAM 用户策略不会导致拒绝访问(403 禁止)错误,请确保满足以下要求:
-
对于同账户访问,无论是在桶策略还是 IAM 用户策略中,都不得针对您尝试向其授予权限的请求者使用显式
Deny
语句。如果您想仅使用桶策略和 IAM 用户策略授予权限,则其中一个策略中必须至少有一条显式Allow
语句。 -
对于跨账户访问,无论是在存储桶策略还是 IAM 用户策略中,都不得针对您尝试向其授予权限的请求者使用显式
Deny
语句。要仅使用存储桶策略和 IAM 用户策略授予跨账户权限,请确保请求者的存储桶策略和 IAM 用户策略都包含显式Allow
语句。
注意
桶策略中的 Allow
语句仅适用于由同一桶拥有者账户拥有的对象。但是,无论对象所有权如何,桶策略中的 Deny
语句都适用于所有对象。
查看或编辑您的桶策略
注意
要查看或编辑桶策略,您必须拥有 s3:GetBucketPolicy
权限。
登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
在左侧导航窗格中,选择存储桶。
-
从桶列表中,选择要查看或编辑其桶策略的桶的名称。
-
选择 Permissions(权限)选项卡。
-
在 Bucket policy(存储桶策略)下,请选择 Edit(编辑)。将出现 Edit bucket policy(编辑存储桶策略)页面。
要使用 AWS Command Line Interface(AWS CLI)查看或编辑您的桶策略,请使用 get-bucket-policy
注意
如果您因为存储桶策略不正确而被锁定在存储桶之外,sign in to the AWS Management Console by using your AWS 账户 root user credentials(请使用 Amazon 账户根用户凭证登录 Amazon 管理控制台)。要重新获得对存储桶的访问权限,请务必使用 AWS 账户根用户凭证删除不正确的存储桶策略。
有关检查权限的提示
要检查请求者是否具有执行 Amazon S3 操作的适当权限,请尝试以下操作:
-
确定请求者。如果是未签名的请求,则它是没有 IAM 用户策略的匿名请求。如果这是使用预签名 URL 的请求,则用户策略会与对请求进行签名的 IAM 用户或角色的策略相同。
-
验证您使用的是正确的 IAM 用户或角色。您可以通过检查 AWS Management Console的右上角或使用 aws sts get-caller-identity 命令来验证您的 IAM 用户或角色。
-
检查与 IAM 用户或角色相关的 IAM policy。您可以使用以下方法之一:
-
如果需要,编辑您的 IAM 用户策略。
-
查看以下显式拒绝或允许访问的策略示例:
-
显式允许 IAM 用户策略:IAM:允许和拒绝以编程方式和在控制台中访问多个服务
-
显式允许桶策略:授予多个账户上传对象或设置对象 ACL 以进行公共访问的权限
-
显式拒绝 IAM 用户策略:AWS:根据请求的 AWS 区域拒绝访问 AWS
-
显式拒绝桶策略:要求对写入桶的所有对象使用 SSE-KMS
-
Amazon S3 ACL 设置
检查 ACL 设置时,请先查看您的对象所有权设置,以检查桶上是否已启用 ACL。请注意,ACL 权限只能用于授予权限,而不能用于拒绝请求。对于由存储桶策略或 IAM 用户策略中的显式拒绝而被拒绝的请求者,ACL 也不能用于向他们授予访问权限。
对象所有权设置设为强制桶拥有者
如果启用了强制桶拥有者设置,则 ACL 设置不太可能导致拒绝访问(403 禁止)错误,因为此设置会禁用适用于桶和对象的所有 ACL。强制桶拥有者是 Amazon S3 桶的原定设置,并且是推荐设置。
对象所有权设置设为首选桶拥有者或对象写入者
使用首选桶拥有者设置或对象编写者设置时,ACL 权限仍然有效。ACL 有两种:桶 ACL 和对象 ACL。有关这两种类型的 ACL 之间的区别,请参阅 ACL 权限和访问策略权限的映射。
根据被拒绝的请求的操作,检查您的桶或对象的 ACL 权限:
-
如果 Amazon S3 拒绝了
LIST
、PUT
对象、GetBucketAcl
或PutBucketAcl
请求,请查看您的桶的 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 屏蔽公共访问权限设置相关的拒绝访问错误的更多信息,请参阅由于屏蔽公共访问权限设置而拒绝访问。
Amazon S3 加密设置
Amazon S3 支持对您的桶进行服务器端加密。服务器端加密是指由接收数据的应用程序或服务在目标位置对数据进行加密。Amazon S3 在将您的数据写入 AWS 数据中心内的磁盘时会在对象级别加密这些数据,并在您访问这些数据时解密这些数据。
原定设置情况下,Amazon S3 现在应用具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3),作为 Amazon S3 中每个桶的基本加密级别。Amazon S3 还允许您在上传对象时指定服务器端加密方法。
查看您的桶的服务器端加密状态和加密设置
登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
在左侧导航窗格中,选择存储桶。
-
从桶列表中,请选择要检查其加密设置的桶。
-
选择属性选项卡。
-
向下滚动到原定设置加密部分,并查看加密类型设置。
要使用 AWS CLI 检查您的加密设置,请使用 get-bucket-encryption 命令。
检查对象的加密状态
登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
在左侧导航窗格中,选择存储桶。
-
从桶列表中,请选择包含对象的桶的名称。
-
从对象列表中,请选择要为其添加或更改加密的对象的名称。
此时将显示对象的详细信息页面。
-
向下滚动到服务器端加密设置部分,以查看对象的服务器端加密设置。
要使用 AWS CLI 检查您的对象加密状态,请使用 head-object 命令。
加密和权限要求
Amazon S3 支持三种类型的服务器端加密:
-
具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)
-
具有 AWS Key Management Service(AWS KMS)密钥的服务器端加密(SSE-KMS)
-
具有客户提供密钥的服务器端加密(SSE-C)
根据您的加密设置,请确保满足以下权限要求:
-
SSE-S3 - 不需要额外的权限。
-
SSE-KMS(使用客户自主管理型密钥) - 要上传对象,需要针对 AWS KMS key 的
kms:GenerateDataKey
权限。要下载对象和执行对象的分段上传,需要针对 KMS 密钥的kms:Decrypt
权限。 -
SSE-KMS(具有 AWS 托管式密钥)– 请求者必须来自拥有
aws/s3
KMS 密钥的同一个账户。请求者还必须具有正确的 Amazon S3 权限才能访问该对象。 -
SSE-C(具有客户提供的密钥) - 无需其他权限。您可以配置桶策略,以要求和限制具有客户提供的加密密钥的服务器端加密来加密桶中的对象。
如果使用客户自主管理型密钥加密对象,请确保 KMS 密钥策略允许您执行 kms:GenerateDataKey
或 kms:Decrypt
操作。有关检查 KMS 密钥策略的说明,请参阅《AWS Key Management Service 开发人员指南》中的查看密钥策略。
S3 对象锁定设置
如果您的桶启用了 S3 对象锁定并且该对象受保留期或法定保留保护,则当您尝试删除该对象时,Amazon S3 会返回拒绝访问(403 禁止)错误。
检查桶是否启用了对象锁定
登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
在左侧导航窗格中,选择存储桶。
-
从桶列表中,请选择您想要查看的桶的名称。
-
选择属性选项卡。
-
向下滚动到对象锁定部分。验证对象锁定设置是已启用还是已禁用。
要确定该对象是受保留期保护还是受法定保留保护,请查看对象的锁定信息。
如果对象受保留期或法定保留保护,请检查以下各项:
-
如果对象版本受合规性保留模式保护,则无法将其永久删除。来自任何请求者(包括 AWS 账户根用户)的永久
DELETE
请求都将导致拒绝访问(403 禁止)错误。另请注意,当您对于受合规性保留模式保护的对象提交DELETE
请求时,Amazon S3 会为该对象创建删除标记。 -
如果对象版本受监管保留模式保护并且您具有
s3:BypassGovernanceRetention
权限,则可以绕过此保护并永久删除该版本。有关更多信息,请参阅绕过监管模式。 -
如果对象版本受法定保留保护,则永久
DELETE
请求可能会导致拒绝访问(403 禁止)错误。要永久删除对象版本,必须解除对于对象版本的法定保留。要解除法定保留,您必须具有s3:PutObjectLegalHold
权限。有关解除法定保留的更多信息,请参阅配置 S3 对象锁定。
VPC 端点策略
如果您使用虚拟私有云(VPC)端点访问 Amazon S3,请确保 VPC 端点策略不会阻止您访问 Amazon S3 资源。原定设置情况下,VPC 端点策略允许向 Amazon S3 发出的所有请求。您还可以配置 VPC 端点策略以限制某些请求。有关如何检查 VPC 端点策略的信息,请参阅以下资源:
-
《AWS PrivateLink 指南》中的 Control access to VPC endpoints by using endpoint policies。
AWS Organizations 策略
如果您的 AWS 账户属于某个组织,则 AWS Organizations 策略可能会阻止您访问 Amazon S3 资源。默认情况下,AWS Organizations 策略不会阻止向 Amazon S3 发出的任何请求。但是,请确保您的 AWS Organizations 策略未配置为阻止对 S3 桶进行访问。有关如何查看 AWS Organizations 策略的说明,请参阅以下资源:
-
《AWS Organizations 用户指南》中的 Listing all policies
接入点设置
如果您在通过 Amazon S3 接入点发出请求时收到“拒绝访问(403 禁止)”错误,则可能需要检查以下内容:
-
接入点的配置
-
用于接入点的 IAM 用户策略
-
用于管理或配置跨账户接入点的桶策略
接入点配置和策略
-
创建接入点时,可以选择将互联网或 VPC 指定为网络来源。如果网络来源设置为仅限 VPC,Amazon S3 将拒绝向接入点发出的任何并非源自指定 VPC 的请求。要检查接入点的网络来源,请参阅创建限制到 Virtual Private Cloud 的接入点。
-
使用接入点,您还可以配置自定义的屏蔽公共访问权限设置,其工作原理与桶或账户级别的屏蔽公共访问权限设置类似。要查看您的自定义屏蔽公共访问权限设置,请参阅管理接入点的公有访问。
-
要使用接入点向 Amazon S3 发出成功的请求,请确保请求者拥有必要的 IAM 权限。有关更多信息,请参阅 配置使用接入点的 IAM 策略。
-
如果请求涉及跨账户接入点,请确保桶拥有者已更新桶策略,以授权来自接入点的请求。有关更多信息,请参阅 授予跨账户接入点的权限。
如果在检查了本主题中的所有项目后,拒绝访问(403 禁止)错误仍然存在,请检索您的 Amazon S3 请求 ID 并联系 AWS Support 以获取更多指导。