亚马逊AWS官方博客

Amazon S3 公有访问阻止 – 为您的账户和存储桶提供又一层保护

新创建的 Amazon S3 存储桶和对象是(且始终是)私有的,并且默认受到保护,但提供了通过访问控制列表 (ACL) 和存储桶策略向其他 AWS 账户和公有(匿名)请求授予访问权限的选项。ACL 和策略为您提供了极大的灵活性。您可以向多个账户授予权限限制对特定 IP 地址的访问权限、要求使用 Multi-Factor Authentication (MFA)、允许其他账户向存储桶上传新对象等等

我们希望确保您在需要时使用公有存储桶和对象,并为您提供工具以确保不会因简单的错误或误解而赋予公有访问权限。例如,去年我们提供了一个 Public 指标来让您快速了解哪些存储桶赋予了公有访问权限:

存储桶视图经过筛选,从而让公有存储桶默认显示在页面顶端。

此外,我们还 免费 提供 Trusted Advisor 存储桶权限检查:

新推出 Amazon S3 公有访问阻止功能

今天我们推出了 Amazon S3 公有访问阻止功能,更加方便保护您的存储桶和对象。这将在账户级别和具体存储桶级别提供新的保护层级,包括您在未来创建的存储桶。您可以阻止现有的公有访问权限(不论是 ACL 还是策略规定的),确保不授予对新创建项目的公有访问权限。如果 AWS 用于托管数据湖或其他业务应用程序,则阻止公有访问权限将在账户级别防止意外公开的风险。我们的目标是明确公有访问权限将用于 Web 托管!

此功能从方便易用的角度出发设计,可以从 S3 控制台、CLI 和 S3 API 以及 CloudFormation 模板访问。下面我们将使用 S3 控制台和一个公有存储桶进行演示:

我可以单击 Public access settings for this account (此账户公有访问权限设置)来实施账户级别的控制:

其中两个选项用于管理公有 ACL,另外两个选项用于管理公有存储桶策略。下面我们分别来看各个选项:

Block new public ACLs and uploading public objects (阻止新的公有 ACL 以及正在上传的公有对象)— 此选项禁止使用新的公有存储桶或对象 ACL,用于确保包含此类 ACL 的未来 PUT 请求将会失败,但它不会影响现有的存储桶或对象。使用此设置可防止在未来使用 ACL 将存储桶或对象公开的企图。如果应用程序尝试上传含有公有 ACL 的对象,或者管理员企图对存储桶执行公有访问权限设置,此设置会阻止该存储桶或对象的公有访问权限设置。

Remove public access granted through public ACLs(删除通过公有 ACL 授予的公有访问权限)— 此选项告诉 S3 不要评估 ACL when authorizing a reque在授予请求权限时不要评估任何公有 ACL,确保不会有存储桶或对象可通过 ACL 公开。此设置会覆盖存储桶中现有和未来对象的任何现有或未来公有访问权限设置。如果现有的应用程序当前正在向存储桶上传含有公有 ACL 的对象,则此设置会覆盖对象的设置。

Block new public bucket policies(阻止新的公有存储桶策略)— 此选项禁止使用新的公有存储桶策略,用于确保包含此类策略的未来 PUT 请求将会失败。这同样不会影响现有的存储桶或对象。此设置将确保无法上传存储桶策略以授予公有访问权限。

Block public and cross-account access to buckets that have public policies (阻止对拥有公有策略的存储桶的公有和跨账户访问权限)— 如果设置此选项,可公开访问的存储桶的访问权限将仅限于存储桶拥有者和 AWS 服务。此选项可用于在您要删除策略时保护含有公有策略的存储桶;它会防止使用 AWS 服务存入存储桶的信息会被公开访问。

如要进行更改,我会单击 Edit (编辑),然后选中需要的公有访问权限设置,然后单击 Save(保存):

我建议您为用于内部 AWS 应用程序的账户使用这些设置!

然后我会确认我的意图:

然后我需要测试我的应用程序和脚本,以确保一切运行正常!

当我在账户上进行这些设置时,它们将适用于我现有的存储桶,以及我未来创建的存储桶。当然,如果我希望实施更精细的访问控制方法,则可以对具体的存储桶设置这些选项。如果我在账户级别设置一些选项,在存储桶级别设置其他选项,则将提供双重保护。我会选中一个存储桶,然后单击 Edit public access settings (编辑公有访问权限设置):

然后我选择期望的选项:

由于我已经在账户级别拒绝所有公有访问权限,这实际上是多余的,只是让您了解您在存储桶级别拥有的控制机制。需要注意的是:我无法通过修改存储桶级别的设置来覆盖账户级别的设置。

我可以总览所有存储桶的公有访问权限状态:

编程访问

我可以通过调用 S3 API 来访问此功能。提供的函数如下:

GetPublicAccessBlock — 检索某个账户或存储桶的公有访问阻止选项。

PutPublicAccessBlock — 设置某个账户或存储桶的公有访问阻止选项。

DeletePublicAccessBlock — 删除某个账户或存储桶的公有访问阻止选项。

GetBucketPolicyStatus — 查看存储桶访问策略是否为公有。

我还可以在通过 CloudFormation 模板创建存储桶时设置选项:

{
   "Type":"AWS::S3::Bucket",
   "Properties":{
      "PublicAccessBlockConfiguration":{
         "BlockPublicAcls":true,
         "IgnorePublicAcls":false,
         "BlockPublicPolicy":true,
         "RestrictPublicBucket":true
      }
   }
}

注意事项

在使用 S3 公有访问阻止功能时需要注意以下几点:

新存储桶 — 未来,对于除 Web 托管以外的任何应用,您使用 S3 控制台创建的存储桶将会按照建议启用所有四个设置。您需要禁用一个或多个设置才能将存储桶公开。

自动化推理 — 对于给定的策略或 ACL 是否属于公有,将使用我们的 Zelkova 自动化推理系统来确定(更多详情请参阅 AWS 如何使用自动化推理来帮助您实现大规模的安全性)。

Organizations — 如果您在使用 AWS Organizations,您可以使用服务控制策略 (SCP) 来限制可供组织内 AWS 账户使用的设置。例如,您可以为任何期望的账户设置期望的公有访问权限,然后使用 SCP 来确保账户拥有者无法修改这些设置。

费用 — 使用此功能不会产生任何费用;您只需按正常价格为您向 S3 API 发出的所有请求付费。

现已推出

Amazon S3 公有访问阻止功能现已在所有商业 AWS 区域开放,您可以(并且应当)立即开始使用它!

 

 

本篇作者

Jeff Barr

AWS 首席布道师; 2004年开始发布博客,此后便笔耕不辍。