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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

使用 Amazon S3 阻止公有访问

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

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

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

Amazon S3 阻止公有访问提供四种设置。这些设置彼此独立,可任意组合使用。每个设置都可以应用于访问点、存储桶或整个 AWS 账户。如果访问点、存储桶或账户的阻止公有访问设置不同,则 Amazon S3 应用访问点、存储桶和账户设置的最严格组合。

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

警告

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

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

注意
  • 您只能为访问点、存储桶和 AWS 账户启用阻止公有访问设置。Amazon S3 不针对单个对象支持阻止公有访问设置。

  • 在将阻止公有访问设置应用于某一账户时,这些设置将应用于全球所有 AWS 区域。这些设置可能不会立即或同时在所有区域生效,但最终会传播到所有区域。

在 Amazon S3 控制台上启用阻止公有访问

Amazon S3 阻止公有访问提供四种设置。可以任意组合将这些设置应用于单个访问点、存储桶或整个 AWS 账户。下图显示如何在 Amazon S3 控制台上为您的账户启用阻止公有访问。有关更多信息,请参阅 Amazon Simple Storage Service 控制台用户指南 中的设置权限:阻止公有访问


				显示阻止公有访问账户设置的控制台屏幕截图。

阻止公有访问设置

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

下表包含可用设置。

名称 描述
BlockPublicAcls

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

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

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

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

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

注意

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

IgnorePublicAcls

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

注意

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

BlockPublicPolicy

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

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

重要

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

RestrictPublicBuckets

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

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

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

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

“公有”的含义

存储桶

  • ACL

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

  • 策略

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

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

      • AWS 委托人、用户、角色或服务委托人(例如 aws:PrincipalOrgID

      • 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/* 也会允许访问与区域 us-west-2 中的账户 123456789012 关联的任何访问点,而无需将存储桶策略呈现为公有。请注意,对于访问点策略,此行为会有不同。有关更多信息,请参阅访问点

      • 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 如何评估同时包含公有和非公有访问授权的存储桶策略。

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

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

  1. 向 AWS CloudTrail(它是 AWS 服务委托人)授予访问权限的语句。

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

使用 Access Analyzer for S3 查看公有存储桶

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

凭借结果中提供的信息,您可以立即采取精确的纠正措施。在 Access Analyzer for S3 中,您只需单击一下即可阻止对存储桶的所有公有访问。您还可以向下钻取到存储桶级别权限设置,以配置精细访问。对于需要公共或共享访问的特定和经验证的使用案例,您可以通过对存储桶的结果进行存档来确认和记录存储桶保持公开或共享的意图。

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

有关 Access Analyzer for S3 的更多信息,请参阅 Amazon Simple Storage Service 控制台用户指南 中的使用 Access Analyzer for S3

权限

要使用 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:PutAccessPointPublicAccessBlock
注意

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

示例

将阻止公有访问与 AWS CLI 结合使用

您可以通过 AWS CLI 来使用 Amazon S3 阻止公有访问。您使用的命令取决于您要对访问点、存储桶还是账户执行阻止公有访问调用。有关设置和使用 AWS CLI 的更多信息,请参阅什么是 AWS Command Line Interface?

  • 访问点

    • 为了对访问点执行阻止公有访问操作,请使用 AWS CLI 服务 s3control。请注意,目前,在创建访问点后无法再更改访问点的阻止公有访问设置。因此,指定访问点的阻止公有访问设置的唯一方法是在创建访问点时包含这些设置。

  • 存储桶

    • 为了对存储桶执行阻止公有访问操作,请使用 AWS CLI 服务 s3api。使用此服务的存储桶级别的操作如下所示:

      • PUT PublicAccessBlock(用于存储桶)

      • GET PublicAccessBlock(用于存储桶)

      • DELETE PublicAccessBlock(用于存储桶)

      • GET BucketPolicyStatus

  • 账户

    • 为了对账户执行阻止公有访问操作,请使用 AWS CLI 服务 s3control。使用此服务的账户级别的操作如下所示:

      • PUT PublicAccessBlock(用于账户)

      • GET PublicAccessBlock(用于账户)

      • DELETE PublicAccessBlock(用于账户)

将阻止公有访问与 AWS SDK for Java 结合使用

以下示例演示如何将 Amazon S3 阻止公有访问与AWS SDK for Java结合使用。有关如何创建和测试有效示例的说明,请参阅 使用 AWS SDK for Java

示例 1

此示例演示如何使用AWS SDK for Java对 S3 存储桶设置公有访问阻止配置。

AmazonS3 client = AmazonS3ClientBuilder.standard() .withCredentials(<credentials>) .build(); client.setPublicAccessBlock(new SetPublicAccessBlockRequest() .withBucketName(<bucket-name>) .withPublicAccessBlockConfiguration(new PublicAccessBlockConfiguration() .withBlockPublicAcls(<value>) .withIgnorePublicAcls(<value>) .withBlockPublicPolicy(<value>) .withRestrictPublicBuckets(<value>)));
重要

此示例仅适用于使用 AmazonS3 客户端类的存储桶级别操作。对于账户级别的操作,请参阅以下示例。

示例 2

此示例演示如何使用 AWS SDK for Java在 Amazon S3 账户中放置公有访问阻止配置。

AWSS3ControlClientBuilder controlClientBuilder = AWSS3ControlClientBuilder.standard(); controlClientBuilder.setRegion(<region>); controlClientBuilder.setCredentials(<credentials>); AWSS3Control client = controlClientBuilder.build(); client.putPublicAccessBlock(new PutPublicAccessBlockRequest() .withAccountId(<account-id>) .withPublicAccessBlockConfiguration(new PublicAccessBlockConfiguration() .withIgnorePublicAcls(<value>) .withBlockPublicAcls(<value>) .withBlockPublicPolicy(<value>) .withRestrictPublicBuckets(<value>)));
重要

此示例仅适用于使用 AWSS3Control 客户端类的账户级别操作。对于存储桶级别的操作,请参阅前面的示例。

将阻止公有访问与其他 AWS 开发工具包结合使用

有关使用其他 AWS 开发工具包的信息,请参阅使用 AWS 开发工具包、CLI 和 Explorer

将阻止公有访问与 REST API 结合使用

有关通过 REST API 使用 Amazon S3 阻止公有访问的信息,请参阅 Amazon Simple Storage Service API Reference 中的以下主题。