阻止对您的 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 托管静态网站 中所述托管静态网站,则可以自定义各个设置以符合您的存储使用案例要求。
启用“屏蔽公共访问权限”可防止通过直接附加到 S3 资源的资源策略或访问控制列表(ACL)来授予公共访问权限,有助于保护您的资源。除了启用“屏蔽公共访问权限”之外,还要仔细检查以下策略,来确认它们不会授予公共访问权限:
-
附加到关联 AWS 主体(例如 IAM 角色)的基于身份的策略
-
附加到关联 AWS 资源 [例如 AWS Key Management Service(KMS)密钥] 的基于资源的策略
注意
-
您只能为接入点、存储桶和 AWS 账户启用屏蔽公共访问权限设置。Amazon S3 不支持基于每个对象的屏蔽公共访问权限设置。
-
在将屏蔽公共访问权限设置应用于某一账户时,这些设置将应用于全球所有 AWS 区域。这些设置可能不会立即或同时在所有区域生效,但最终会传播到所有区域。
主题
屏蔽公共访问权限设置
S3 屏蔽公共访问权限提供四种设置。您可以任意组合将这些设置应用于单个接入点、存储桶或整个 AWS 账户。如果您将某一设置应用于某个账户,则该设置将应用于该账户拥有的所有存储桶和接入点。同样,如果您将设置应用于某个存储桶,则该设置将应用于与该存储桶关联的所有接入点。
下表包含可用设置。
名称 | 描述 |
---|---|
BlockPublicAcls |
将此选项设置为
将此设置设为 注意接入点没有与其关联的 ACL。如果您将此设置应用于接入点,则该设置将充当到底层存储桶的传递途径。如果某个接入点启用了此设置,则无论存储桶实际上是否启用了此设置,通过该接入点发出的请求表现为就像底层存储桶启用了此设置。 |
IgnorePublicAcls |
将此选项设置为 注意接入点没有与其关联的 ACL。如果您将此设置应用于接入点,则该设置将充当到底层存储桶的传递途径。如果某个接入点启用了此设置,则无论存储桶实际上是否启用了此设置,通过该接入点发出的请求表现为就像底层存储桶启用了此设置。 |
BlockPublicPolicy |
对于存储桶将此选项设置为 如果(为接入点或底层存储桶)指定的策略允许公有访问,则对于接入点将此选项设置为 您可以使用此设置以允许用户管理接入点和存储桶策略,而不允许其公开共享存储桶或其包含的对象。启用此设置不会影响现有接入点或存储桶策略。 重要要有效地使用此设置,我们建议您在账户级别应用此设置。存储桶策略可能允许用户更改存储桶的屏蔽公共访问权限设置。因此,有权更改存储桶策略的用户可以插入允许其为存储桶禁用屏蔽公共访问权限设置的策略。如果为整个账户而非特定存储桶启用此设置,即使用户更改存储桶策略以禁用此设置,Amazon S3 仍会阻止公有策略。 |
RestrictPublicBuckets |
将此选项设置为 启用此设置不影响现有的接入点或存储桶策略,但 Amazon S3 会阻止派生自任何公有接入点或存储桶策略的公有和跨账户访问,包括到特定账户的非公有委派。 |
重要
-
调用 GET Bucket acl 和 GET Object acl 始终返回指定存储桶或对象的已就位的有效权限。例如,假设存储桶有一个 ACL 用于授予公有访问权限,但该存储桶还启用了
IgnorePublicAcls
设置。在此情况下,GET Bucket acl 将返回可反映 Amazon S3 正在实施的访问权限的 ACL,而不是与存储桶关联的实际 ACL。 -
屏蔽公共访问权限设置不更改现有的策略或 ACL。因此,删除屏蔽公共访问权限设置会使具有公有策略或 ACL 的存储桶或对象再次变为可公开访问。
在接入点上执行屏蔽公共访问权限操作
为了对接入点执行屏蔽公共访问权限操作,请使用 AWS CLI 服务 s3control
。
重要
请注意,目前,在创建接入点后无法再更改接入点的屏蔽公共访问权限设置。因此,指定接入点的屏蔽公共访问权限设置的唯一方法是在创建接入点时包含这些设置。
“公有”的含义
ACL
如果存储桶或对象 ACL 可向预定义的 AllUsers
或 AuthenticatedUsers
组的成员授予任何权限,则 Amazon S3 将其视为公有。有关预定义组的更多信息,请参阅 Amazon S3 预定义的组。
存储桶策略
在评估存储桶策略时,Amazon S3 先假定该策略是公有的。然后对策略进行评估,以确定它是否符合非公有条件。当存储桶策略必须仅授予针对以下一个或多个项目的固定值(不包含通配符或 AWS Identity and Access Management 策略变量的值)的访问权限时,才会将该策略视为非公有:
-
AWS 主体、用户、角色或服务主体(例如
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
-
aws:userid
,在模式“AROLEID:*
”之外 -
s3:DataAccessPointArn
注意
在存储桶策略中使用时,只要账户 ID 已固定,此值就可以包含接入点名称的通配符,而无需将策略呈现为公有。例如,允许访问
arn:aws:s3:us-west-2:123456789012:accesspoint/*
也会允许访问与区域123456789012
中的账户us-west-2
关联的任何接入点,而无需将存储桶策略呈现为公有。请注意,对于接入点策略,此行为会有不同。有关更多信息,请参阅 接入点。 -
s3:DataAccessPointAccount
有关存储桶策略的更多信息,请参阅 Amazon S3 的存储桶策略。
例 :公有存储桶策略
根据这些规则,以下示例策略被视为公有。
{ "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
将对该存储桶生效。它仅允许存储桶拥有者账户的 AWS 服务主体和授权用户访问该存储桶。
例如,假定“Account-1”拥有的一个存储桶包含以下内容:
-
向 AWS CloudTrail(它是 AWS 服务主体)授予访问权限的语句。
-
向账户“Account-2”授予访问权限的语句
-
向公众授予访问权限的语句,例如通过指定
"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、存储桶策略或授予公共访问权限的接入点策略的存储桶。如果存在已配置为允许互联网上的任何人或其他 AWS 账户(包括组织外部的 AWS 账户)访问的存储桶,适用于 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 操作的权限。
配置屏蔽公共访问权限
有关为 AWS 账户、Amazon S3 存储桶和接入点配置屏蔽公共访问权限的更多信息,请参阅以下主题: