阻止对您的 Amazon S3 存储的公有访问 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

阻止对您的 Amazon S3 存储的公有访问

Amazon S3 屏蔽公共访问权限特征提供接入点、存储桶和账户设置,帮助您管理对 Amazon S3 资源的公有访问。默认情况下,新存储桶、接入点和对象不允许公有访问。但是,用户可以修改存储桶策略、接入点策略或对象权限以允许公有访问。S3 屏蔽公共访问权限设置会覆盖这些策略和权限,以便于您可以限制这些资源的公有访问。

借助 S3 屏蔽公共访问权限,账户管理员和存储桶拥有者可以轻松设置集中控制,以控制对已实施的 Amazon S3 资源的公有访问(与资源的创建方式无关)。

有关配置公有块访问的说明,请参阅配置屏蔽公共访问权限

当 Amazon S3 收到访问存储桶或对象的请求时,它将确定该存储桶或存储桶拥有者的账户是否应用了屏蔽公共访问权限设置。如果请求是通过接入点发出,则 Amazon S3 还会检查接入点的屏蔽公共访问权限设置。如果现有的屏蔽公共访问权限设置禁止请求的访问,则 Amazon S3 将拒绝该请求。

Amazon S3 屏蔽公共访问权限提供四种设置。这些设置彼此独立,可任意组合使用。每个设置都可以应用于接入点、存储桶或整个 Amazon Web Services 账户。如果接入点、存储桶或账户的屏蔽公共访问权限设置不同,则 Amazon S3 应用接入点、存储桶和账户设置的最严格组合。

当 Amazon S3 评估屏蔽公共访问权限设置是否禁止某一操作时,它将拒绝违反接入点、存储桶或账户设置的任何请求。

警告

通过访问控制列表(ACL)、接入点策略或存储桶策略,或者同时通过这几项向存储桶和对象授予公有访问权限。为了帮助确保您的所有 Amazon S3 接入点、存储桶和对象阻止了公有访问,我们建议为您的账户启用屏蔽公共访问权限的所有四个设置。这些设置阻止所有当前和将来的存储桶和接入点的公有访问。

在应用这些设置之前,请确认您的应用程序在没有公有访问的情况下能够正常工作。如果您需要对存储桶或对象进行某种级别的公有访问,例如,按照 使用 Amazon S3 托管静态网站 中所述托管静态网站,则可以自定义各个设置以符合您的存储使用案例要求。

注意
  • 您只能为接入点、存储桶和 Amazon Web Services 账户启用屏蔽公共访问权限设置。Amazon S3 不支持基于每个对象的屏蔽公共访问权限设置。

  • 在将屏蔽公共访问权限设置应用于某一账户时,这些设置将应用于全球所有 Amazon Web Services 区域。这些设置可能不会立即或同时在所有区域生效,但最终会传播到所有区域。

屏蔽公共访问权限设置

S3 屏蔽公共访问权限提供四种设置。您可以任意组合将这些设置应用于单个接入点、存储桶或整个 Amazon Web Services 账户。如果您将某一设置应用于某个账户,则该设置将应用于该账户拥有的所有存储桶和接入点。同样,如果您将设置应用于某个存储桶,则该设置将应用于与该存储桶关联的所有接入点。

下表包含可用设置。

名称 描述
BlockPublicAcls

将此选项设置为 TRUE 会引发以下行为:

  • 如果指定的访问控制列表 (ACL) 为公有,则 PUT Bucket acl 和 PUT Object acl 调用失败。

  • 如果请求包含公有 ACL,则 PUT Object 调用失败。

  • 如果将此设置应用于某个账户,则当请求包含公有 ACL 时,PUT Bucket 调用将失败。

将此设置设为 TRUE 时,指定操作将失败(通过 REST API、Amazon CLI 或 Amazon SDK 请求的操作)。但是,不修改用于存储桶和对象的现有策略和 ACL。此设置不仅允许您针对公有访问提供保护,还允许您审核、优化或更改存储桶或对象的现有策略和 ACL。

注意

接入点没有与其关联的 ACL。如果您将此设置应用于接入点,则该设置将充当到底层存储桶的传递途径。如果某个接入点启用了此设置,则无论存储桶实际上是否启用了此设置,通过该接入点发出的请求表现为就像底层存储桶启用了此设置。

IgnorePublicAcls

将此选项设置为 TRUE 会使 Amazon S3 忽略存储桶及其包含的任何对象上的所有公有 ACL。通过此设置,您可以安全地阻止 ACL 授权的公有访问,同时仍允许包含公有 ACL 的 PUT Object 调用(与 BlockPublicAcls 相反,后者拒绝包含公有 ACL 的 PUT Object 调用)。启用此设置不影响任何现有 ACL 的持久性,也不会阻止设置新的公有 ACL。

注意

接入点没有与其关联的 ACL。如果您将此设置应用于接入点,则该设置将充当到底层存储桶的传递途径。如果某个接入点启用了此设置,则无论存储桶实际上是否启用了此设置,通过该接入点发出的请求表现为就像底层存储桶启用了此设置。

BlockPublicPolicy

对于存储桶将此选项设置为 TRUE 将导致 Amazon S3 在指定的存储桶策略允许公有访问时拒绝对 PUT 存储桶策略的调用。如果指定的策略允许公有访问,则对于存储桶将此选项设置为 TRUE 也会导致 Amazon S3 拒绝对存储桶的所有相同账户接入点的 PUT 接入点策略的调用。

如果(为接入点或底层存储桶)指定的策略允许公有访问,则对于接入点将此选项设置为 TRUE 会导致 Amazon S3 拒绝通过该接入点对 PUT 接入点策略和 PUT 存储桶策略的调用。

您可以使用此设置以允许用户管理接入点和存储桶策略,而不允许其公开共享存储桶或其包含的对象。启用此设置不会影响现有接入点或存储桶策略。

重要

要有效地使用此设置,我们建议您在账户级别应用此设置。存储桶策略可能允许用户更改存储桶的屏蔽公共访问权限设置。因此,有权更改存储桶策略的用户可以插入允许其为存储桶禁用屏蔽公共访问权限设置的策略。如果为整个账户而非特定存储桶启用此设置,即使用户更改存储桶策略以禁用此设置,Amazon S3 仍会阻止公有策略。

RestrictPublicBuckets

将此选项设置为 TRUE 会将对具有公有策略的接入点或存储桶的访问限制为该存储桶拥有者账户和接入点拥有者账户中的 Amazon 服务主体和授权用户。此设置会阻止对接入点或存储桶的所有跨账户访问(Amazon 服务主体的访问除外),但仍允许该账户内的用户管理接入点或存储桶。

启用此设置不影响现有的接入点或存储桶策略,但 Amazon S3 会阻止派生自任何公有接入点或存储桶策略的公有和跨账户访问,包括到特定账户的非公有委派。

重要
  • 调用 GET Bucket acl 和 GET Object acl 始终返回指定存储桶或对象的已就位的有效权限。例如,假设存储桶有一个 ACL 用于授予公有访问权限,但该存储桶还启用了 IgnorePublicAcls 设置。在此情况下,GET Bucket acl 将返回可反映 Amazon S3 正在实施的访问权限的 ACL,而不是与存储桶关联的实际 ACL。

  • 屏蔽公共访问权限设置不更改现有的策略或 ACL。因此,删除屏蔽公共访问权限设置会使具有公有策略或 ACL 的存储桶或对象再次变为可公开访问。

在接入点上执行屏蔽公共访问权限操作

为了对接入点执行屏蔽公共访问权限操作,请使用 Amazon CLI 服务 s3control

重要

请注意,目前,在创建接入点后无法再更改接入点的屏蔽公共访问权限设置。因此,指定接入点的屏蔽公共访问权限设置的唯一方法是在创建接入点时包含这些设置。

“公有”的含义

ACL

如果存储桶或对象 ACL 可向预定义的 AllUsersAuthenticatedUsers 组的成员授予任何权限,则 Amazon S3 将其视为公有。有关预定义组的更多信息,请参阅 Amazon S3 预定义的组

存储桶策略

在评估存储桶策略时,Amazon S3 先假定该策略是公有的。然后对策略进行评估,以确定它是否符合非公有条件。当存储桶策略必须仅授予针对以下一个或多个项目的固定值(不包含通配符或 Amazon Identity and Access Management 策略变量的值)的访问权限时,才会将该策略视为非公有:

  • Amazon 主体、用户、角色或服务主体(例如 aws:PrincipalOrgID

  • 一组无类域间路由 (CIDR),使用 aws:SourceIp。有关 CIDR 的更多信息,请参阅 RFC 编辑器网站上的 RFC 4632

    注意

    根据 aws:SourceIp 条件键授予访问权限且 IP 范围非常宽泛(例如 0.0.0.0/1)的存储桶策略将评估为“公有”。这包括大于 /8(对于 IPv4)和 /32(对于 IPv6,不包括 RFC1918 私有范围)的值。屏蔽公共访问权限将拒绝这些“公有”策略,并阻止跨账户访问已在使用这些“公有”策略的存储桶。

  • aws:SourceArn

  • aws:SourceVpc

  • aws:SourceVpce

  • aws:SourceOwner

  • aws:SourceAccount

  • s3:x-amz-server-side-encryption-aws-kms-key-id

  • aws:userid,在模式“AROLEID:*”之外

  • s3:DataAccessPointArn

    注意

    在存储桶策略中使用时,只要账户 ID 已固定,此值就可以包含接入点名称的通配符,而无需将策略呈现为公有。例如,允许访问 arn:aws:s3:us-west-2:123456789012:accesspoint/* 也会允许访问与区域 123456789012 中的账户 us-west-2 关联的任何接入点,而无需将存储桶策略呈现为公有。请注意,对于接入点策略,此行为会有不同。有关更多信息,请参阅接入点

  • s3:DataAccessPointAccount

有关存储桶策略的更多信息,请参阅 存储桶策略和用户策略

例 :公有存储桶策略

根据这些规则,以下示例策略被视为公有。

{ "Principal": { "Federated": "graph.facebook.com" }, "Resource": "*", "Action": "s3:PutObject", "Effect": "Allow" }
{ "Principal": "*", "Resource": "*", "Action": "s3:PutObject", "Effect": "Allow" }
{ "Principal": "*", "Resource": "*", "Action": "s3:PutObject", "Effect": "Allow", "Condition": { "StringLike": {"aws:SourceVpc": "vpc-*"}} }

您可以通过使用固定值来包含上面所列的任何条件键将这些策略变为非公有。例如,可以通过将 aws:SourceVpc 设置为固定值,将上面的最后一个策略变为非公有,类似于以下内容:

{ "Principal": "*", "Resource": "*", "Action": "s3:PutObject", "Effect": "Allow", "Condition": {"StringEquals": {"aws:SourceVpc": "vpc-91237329"}} }

Amazon S3 如何评估同时包含公有和非公有访问授权的存储桶策略

此示例演示 Amazon S3 如何评估同时包含公有和非公有访问授权的存储桶策略。

假设存储桶有一个策略可向一组固定主体授予访问权限。根据前面描述的规则,此策略不是公有策略。因此,如果您启用 RestrictPublicBuckets 设置,该策略将按编写内容保持有效,因为 RestrictPublicBuckets 只应用于具有公有策略的存储桶。但是,如果您向该策略中添加公有语句,则 RestrictPublicBuckets 将对该存储桶生效。它仅允许存储桶拥有者账户的 Amazon 服务主体和授权用户访问该存储桶。

例如,假定“Account-1”拥有的一个存储桶包含以下内容:

  1. 向 Amazon CloudTrail(它是 Amazon 服务主体)授予访问权限的语句。

  2. 向账户“Account-2”授予访问权限的语句

  3. 向公众授予访问权限的语句,例如通过指定 "Principal": "*" 且没有限制性的 Condition

由于第三条语句,此策略符合公有策略的条件。实施此策略并启用 RestrictPublicBuckets 后,Amazon S3 将仅允许 CloudTrail 进行访问。请注意,尽管语句 2 不是公有,但 Amazon S3 仍禁用“Account-2”的访问。这是因为,语句 3 将整个策略都渲染为公有,因此 RestrictPublicBuckets 适用。因此,即使策略向特定账户“Account-2”委派访问权限,Amazon S3 仍禁用跨账户访问。但如果您从该策略中删除语句 3,则该策略不符合公有条件,并且 RestrictPublicBuckets 不再适用。因此,即使将 RestrictPublicBuckets 保持启用状态,“Account-2”也会重获存储桶的访问权限。

接入点

与存储桶相比,Amazon S3 评估接入点的屏蔽公共访问权限设置略有不同。Amazon S3 用于确定接入点策略何时为公用的规则对接入点和存储桶来说通常是相同的,但以下情况除外:

  • 具有 VPC 网络起源的接入点始终被视为非公有,而无论其接入点策略的内容如何。

  • 使用 s3:DataAccessPointArn 向一组接入点授予访问权限的接入点策略被视为公有。请注意,此行为与存储桶策略不同。例如,对于与 s3:DataAccessPointArn 匹配的 arn:aws:s3:us-west-2:123456789012:accesspoint/* 值授予访问权限的存储桶策略不会被视为公有。但是,在接入点策略中使用相同的语句会使接入点变为公有。

使用适用于 S3 的 IAM Access Analyzer 查看公有存储桶

您可以使用适用于 S3 的 IAM Access Analyzer 来查看具有存储桶 ACL、存储桶策略或授予公共访问权限的接入点策略的存储桶。如果存在已配置为允许互联网上的任何人或其他 Amazon Web Services 账户(包括组织外部的 Amazon Web Services 账户)访问的存储桶,适用于 S3 的 IAM Access Analyzer 会向您发出提醒。您会收到每个公共存储桶或共享存储桶的结果,其中报告了公共或共享访问的来源和级别。

在适用于 S3 的 IAM Access Analyzer 中,只需单击一下即可屏蔽对存储桶的所有公共访问权限。您还可以向下钻取到存储桶级别权限设置,以配置精细访问。对于需要公共或共享访问的特定和经验证的使用案例,您可以通过对存储桶的结果进行归档来确认和记录存储桶保持公开或共享的意图。

在极少数情况下,对于 Amazon S3 屏蔽公共访问权限评估报告为公有的存储桶,适用于 S3 的 IAM Access Analyzer 可能不会报告任何调查发现。发生这种情况的原因是,Amazon S3 屏蔽公共访问权限会审核当前操作以及将来可能添加的任何潜在操作的策略,从而导致存储桶变为公有。另一方面,适用于 S3 的 IAM Access Analyzer 只分析在评估访问状态时为 Amazon S3 服务指定的当前操作。

有关适用于 S3 的 IAM Access Analyzer 的更多信息,请参阅使用适用于 S3 的 IAM Access Analyzer 查看存储桶访问权限

权限

要使用 Amazon S3 屏蔽公共访问权限特征,您必须拥有以下权限。

操作 所需权限
GET 存储桶策略状态 s3:GetBucketPolicyStatus
GET 存储桶屏蔽公共访问权限设置 s3:GetBucketPublicAccessBlock
PUT 存储桶屏蔽公共访问权限设置 s3:PutBucketPublicAccessBlock
DELETE 存储桶屏蔽公共访问权限设置 s3:PutBucketPublicAccessBlock
GET 账户屏蔽公共访问权限设置 s3:GetAccountPublicAccessBlock
PUT 账户屏蔽公共访问权限设置 s3:PutAccountPublicAccessBlock
DELETE 账户屏蔽公共访问权限设置 s3:PutAccountPublicAccessBlock
PUT 接入点屏蔽公共访问权限设置 s3:CreateAccessPoint
注意

DELETE 操作所需权限与 PUT 操作相同。没有单独用于 DELETE 操作的权限。

配置屏蔽公共访问权限

有关为 Amazon Web Services 账户 和 Amazon S3 存储桶配置屏蔽公共访问权限的更多信息,请参阅以下主题。