Amazon Simple Storage Service
开发人员指南 (API 版本 2006-03-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 Amazon S3 阻止公有访问

Amazon S3 提供用于存储桶和账户的阻止公有访问设置,以帮助您管理对 Amazon S3 资源的公有访问。默认情况下,新存储桶和对象不允许公有访问,但用户可以通过修改存储桶策略或对象权限来允许公有访问。Amazon S3 阻止公有访问提供的设置可覆盖这些策略和权限,以便于您限制对这些资源的公有访问。借助 Amazon S3 阻止公有访问,账户管理员和存储桶所有者可以轻松设置集中控制,来控制对已实施 Amazon S3 资源的公有访问(与资源的创建方式无关)。

当 Amazon S3 收到访问存储桶或对象的请求时,它将确定该存储桶或存储桶所有者的账户是否具有阻止公有访问设置。如果现有的阻止公有访问设置禁止请求的访问,Amazon S3 将拒绝该请求。Amazon S3 阻止公有访问提供四种设置。这些设置彼此独立,可任意组合使用,每种设置可以应用于一个存储桶或整个 AWS 账户。如果存储桶的阻止公有访问设置与其他所有者账户不同,Amazon S3 将应用最具限制性的存储桶级别和账户级别设置的组合。因此,当 Amazon S3 评估阻止公有访问设置是否阻止某一操作时,它将拒绝违反存储桶级别或账户级别设置的任何请求。

注意

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

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

阻止公有访问设置

Amazon 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。

IgnorePublicAcls

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

BlockPublicPolicy

将此选项设置为 TRUE 将导致 Amazon S3 在指定的存储桶策略允许公有访问时拒绝对 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:SourceArn

      • aws:SourceVpc

      • aws:SourceVpce

      • aws:SourceOwner

      • aws:SourceAccount

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

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

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

      { “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 不是公有,但 S3 仍禁用“Account-2”的访问。 这是因为,语句 3 将整个策略都渲染为公有,因此 RestrictPublicBuckets 适用。因此,即使策略向特定账户“Account-2”委派访问权限,S3 仍禁用跨账户访问。 但如果您从该策略中删除语句 3,则该策略不符合公有条件,并且 RestrictPublicBuckets 不再适用。因此,即使将 RestrictPublicBuckets 保持启用状态,“Account-2”也会重获存储桶的访问权限。

权限

要使用 Amazon S3 阻止公有访问功能,您必须拥有以下权限。

运算 所需权限
GET 存储桶策略状态 s3:GetBucketPolicyStatus
GET 存储桶阻止公有访问设置 s3:GetBucketPublicAccessBlock
PUT 存储桶阻止公有访问设置 s3:PutBucketPublicAccessBlock
DELETE 存储桶阻止公有访问设置 s3:PutBucketPublicAccessBlock
GET 账户阻止公有访问设置 s3:GetAccountPublicAccessBlock
PUT 账户阻止公有访问设置 s3:PutAccountPublicAccessBlock
DELETE 账户阻止公有访问设置 s3:PutAccountPublicAccessBlock

注意

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

示例

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

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

  • 存储桶

    • 为了对存储桶执行阻止公有访问操作,请使用 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在 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 中的以下主题。