IAM 策略和存储桶策略以及 ACL!哦,天哪!(控制对 S3 资源的访问权限)

2023 年 9 月 11 日: 此帖子已更新。

2023 年 7 月 6 日更新: 本文已更新,以反映有关使用 S3 ACL 的当前指南,并包括 S3 接入点和账户和 S3 存储桶的区块公共访问权限。

2023 年 4 月 27 日更新: 亚马逊 S3 现在会自动启用 S3 封禁公共访问权限,并禁用所有 亚马逊云科技 区域中所有新 S3 存储桶的 S3 访问控制列表 (ACL)。

2019 年 1 月 8 日更新 :根据客户反馈,我们更新了 “S3 ACL 怎么样?” 中的第三段阐明权限管理的部分。


在这篇文章中,我们将讨论 亚马逊简单存储服务(Amazon S3) 存储桶策略和 亚马逊云科技身份和访问管理(IAM ) 策略及其不同的用例。这篇文章将帮助您区分这两种政策的用途。我们还将讨论这些策略如何与一些默认 S3 存储桶安全设置集成,例如自动启用 S3 阻止公共访问功能和禁用 S3 访问控制列表 (ACL)。

IAM 策略与 S3 存储桶策略的对比

要管理 亚马逊云科技 访问权限,您可以设置 IAM 策略并将其关联到 IAM 身份(用户、用户组或角色)或 亚马逊云科技 资源。策略是 亚马逊云科技 中的一个对象,当与身份或资源关联时,它定义该身份或资源的权限。IAM 策略指定允许或拒绝对哪些 亚马逊云科技 资源执行哪些操作(例如,用户 Alice 可以从 “生产” 存储桶读取对象,但不能在 “开发” 存储桶中写入对象,而用户 Bob 可以完全访问 S3)。

另一方面,S3 存储桶策略是基于资源的策略,您可以使用它来授予对 Amazon S3 存储桶及其中的对象的访问权限。S3 存储桶策略可以根据策略中的元素允许或拒绝请求。(例如,允许用户 Alice 在存储桶中放置但不允许删除对象。)

注意: 您可以在存储桶级别上附加 S3 存储桶策略(也就是说,您不能将存储桶策略附加到 S3 对象),但存储桶策略中指定的权限适用于存储桶中的所有对象。您还可以通过在存储桶策略中将对象作为资源来指定对象级别的权限。

IAM 策略和 S3 存储桶策略均用于访问控制,并且均使用 亚马逊云科技 访问策略语言以 JSON 编写。让我们看一下每种类型的策略示例。

S3 存储桶策略示例

此 S3 存储桶策略允许账户 111122223333 中的任何 IAM 委托人(用户或角色)使用 Amazon S3 获取 存储桶(列表对象)操作。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "亚马逊云科技": ["arn:aws:iam::111122223333:root"]
      },
      "Action": "s3:ListBucket",
      "Resource": ["arn:aws:s3:::my_bucket"]
    }
  ]
}

此 S3 存储桶策略允许账户 111122223333 下的 IAM 角色角色名称使用亚马逊 S3 获取存储桶(列表对象)操作。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "亚马逊云科技": "arn:aws:iam::111122223333:role/Role-name"
      },
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::my_bucket"
    }
  ]
}

IAM 策略示例

以下 IAM 策略向其附加的 IAM 委托人授予对名为 m y_ bucket 的存储桶的内容执行 S3 操作的权限。

{
  "Version": "2012-10-17",
  "Statement":[{
    "Effect": "Allow",
    "Action": "s3:*",
    "Resource": ["arn:aws:s3:::my_bucket/*"]
    }
  ]
}

请注意,S3 存储桶策略包含一个 Princi p al 元素,该元素列出了存储桶策略控制访问权限的委托人。在 IAM 策略中, 委托人 元素是不必要的,因为默认情况下,委托人是 IAM 策略所附带的实体。

S3 存储桶策略(顾名思义)仅控制它们所连接的存储桶对 S3 资源的访问权限,而 IAM 策略几乎可以指定任何 亚马逊云科技 操作。亚马逊云科技 的巧妙之处之一是,您实际上可以同时应用 IAM 策略和 S3 存储桶策略,最终授权是所有权限的最低权限组合(更多信息请参阅下文标题为授权 如何与多种访问控制机制配合使用?) )。

何时使用 IAM 策略与 S3 策略

在以下情况下使用 IAM 策略:

  • 您需要控制对 S3 以外的 亚马逊云科技 服务的访问权限。IAM 策略将更易于管理,因为您可以在 IAM 中集中管理权限,而不是在 IAM 和 S3 之间分散权限。
  • 您有许多 S3 存储桶,每个存储桶都有不同的权限要求。IAM 策略将更易于管理,因为您不必定义大量 S3 存储桶策略,而是可以依赖更少、更详细的 IAM 策略。
  • 您更愿意在 IAM 环境中保留访问控制策略。

在以下情况下使用 S3 存储桶策略:

  • 您需要一种简单的方法来授予对您的 S3 环境的 跨账户 访问权限 ,而无需使用 IAM 角色
  • 您的 IAM 策略突破了大小限制(用户最多 2 KB,群组最多 5 KB,角色最大 10 KB)。S3 支持最大 20 KB 的存储桶策略。
  • 您更喜欢在 S3 环境中保留访问控制策略。
  • 您想对与 S3 存储桶交互的委托人应用常见的安全控制,例如限制可以访问存储桶的 IP 地址或 VPC。

    如果你仍然不确定要使用哪个,可以考虑哪个审计问题对你最重要:

  • 如果你对 “这个用户能在 亚马逊云科技 中做 什么?” 更感兴趣 ”,那么 IAM 策略可能是必经之路。您可以通过查找 IAM 用户来回答这个问题,然后检查他们的 IAM 策略以了解他们拥有哪些权限。
  • 如果你对 “ 谁可以访问这个 S3 存储桶?” 更感兴趣 ”,那么 S3 存储桶策略可能更适合您。你可以通过查找存储桶并检查存储桶策略来回答这个问题。

无论您选择哪种方法,我们都建议您尽可能保持一致。随着 IAM 策略和 S3 存储桶策略数量的增加,审计权限变得更具挑战性。

那么 S3 ACL 呢?

S3 ACL 是附加到每个 S3 存储桶和对象的子资源。它定义了哪些 亚马逊云科技 账户或组被授予访问权限以及访问类型。您可以将 S3 ACL 连接到存储桶和存储桶中的单个对象,以管理这些对象的权限。一般而言,亚马逊云科技 建议您使用 S3 存储桶策略或 IAM 策略进行访问控制。S3 ACL 是一种早于 IAM 的传统访问控制机制。默认情况下,对象所有权设置为存储桶所有者强制执行的设置,并且所有 ACL 都处于禁用状态,如图 1 所示。

Figure 1: Object Ownership

图 1:对象所有权

Amazon S3 中的大多数现代用例不再需要使用 ACL,我们建议您通过应用存储桶所有者强制设置来禁用 ACL。这种方法简化了权限管理;无论谁上传了存储桶中的对象,您都可以使用策略更简单地控制对存储桶中每个对象的访问权限。禁用 ACL 后,存储桶所有者拥有存储桶中的对象,并使用访问管理策略专门管理对数据的访问。

S3 存储桶策略和 IAM 策略通过在策略语句的资源元素中提供这些对象来定义对象级权限。该声明将适用于存储桶中的这些对象。将特定对象的权限整合到一个策略(而不是多个 S3 ACL)中,可以更轻松地确定用户和角色的有效权限。

您可以对新创建的存储桶和已有的存储分区禁用 ACL。对于新创建的存储桶,默认情况下,ACL 处于禁用状态。如果现有存储桶中已经包含对象,则禁用 ACL 后,对象和存储桶 ACL 将不再是访问评估的一部分,将根据策略授予或拒绝访问权限。

S3 接入点和 S3 接入点

在某些情况下,客户的用例具有复杂的权限:Amazon S3 用于存储共享数据集,其中数据由不同的应用程序、个人或团队针对不同的用例进行聚合和访问。管理此共享存储桶的访问权限需要单个存储桶策略,该策略可以控制数十到数百个具有不同权限级别的应用程序的访问权限。随着应用程序集的增长,存储桶策略变得更加复杂,管理起来更加耗时,并且需要进行审计,以确保更改不会对其他应用程序产生意外影响。

这些客户可能需要额外的策略空间来访问他们的数据和存储桶。为了支持这些用例,Amazon S3 提供了一项名为 Amazon S3 接入点 的功能 。S3 接入点简化了在 S3 中存储数据的 亚马逊云科技 服务或客户应用程序的数据访问。

接入点被命名为连接到存储分区的网络端点。您可以使用这些接入点来执行 S3 对象操作,例如 getObject 和 putObject每个接入点都有不同的权限和网络控制,S3 将这些权限和网络控制应用于通过该接入点发出的请求。每个接入点强制执行自定义的接入点策略,该策略与附加到底层存储桶的存储桶策略配合使用。

S3 接入点支持 IAM 资源策略,允许您按资源、用户或其他条件控制接入点的使用。为了使应用程序或用户能够通过接入点访问对象,接入点和底层存储桶都必须允许该请求。

请注意,当直接通过存储桶的名称或 Amazon 资源名称 (ARN) 访问存储桶时,向存储桶添加 S3 接入点不会改变存储桶的行为。针对存储桶的所有现有操作将继续像以前一样运行。您在接入点策略中包含的限制仅适用于通过该接入点发出的请求。

接入点策略示例

以下访问点策略授予 IAM 用户 Alice 通过账户 111122223333 中的接入点 my-access- point 获取和放置对象的权限。

{
  “Version”: “2012-10-17”,
  “Statement”:[{
    “Effect”: “Allow”,
    “Principal”: { “亚马逊云科技”: “arn:aws:iam::111122223333:user/Alice” },
    “Action”: [“s3:GetObject”, “s3:PutObject”],
    “Resource”: “arn:aws:s3:us-west-2:111122223333:accesspoint/my-access-point/object/*”
    }
  ]
}

封锁账号和存储桶的公共访问权限

您可以通过 ACL、存储桶策略或接入点策略授予对存储桶和对象的公共访问权限。要阻止对存储桶及其对象的公共访问,您可以在存储分区级别或账户级别启用 “ 封锁所有公开 ”。

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

借助 S3 封锁公共访问权限,账户管理员和存储桶所有者可以设置集中控制,限制对其 S3 资源的公开访问。无论如何创建 S3 资源,S3 区块公共访问都会强制执行这些集中控制。

如果您将设置应用于某个账户,则该设置将应用于该账户拥有的存储桶和接入点。同样,如果您将设置应用于存储桶,则该设置将应用于与该存储桶关联的接入点。

封锁存储桶的公共访问权限

如图 2 所示(使用 S3 控制台),在创建账户时,“屏蔽所有公共访问权限” 设置默认处于启用状态。Amazon S3 封锁公共访问(存储桶设置)设置仅适用于此存储桶及其访问点。亚马逊云科技 建议您启用 “阻止所有公共访问”,但在应用这些设置之前,您应该确保您的应用程序在没有公共访问权限的情况下能够正常运行。如果您需要对该存储分区或其中的对象具有一定级别的公共访问权限,则可以自定义图 2 中显示的各个设置以适应您的特定存储用例。

您可以 使用 S3 控制台、亚马逊云科技 CLI、亚马逊云科技 开发工具包和 REST API 来授予对一个或多个存储桶的公有访问权限。

Figure 2:Block Public Access Settings for Bucket

图 2:屏蔽存储桶的公共访问设置

关闭此设置将在账户中创建警告,如图 3 所示,因为除非静态网站托管等经过验证的特定用例需要公共访问,否则 亚马逊云科技 建议启用此设置。

Figure 3: Warning

图 3:警告

您也可以为现有存储分区启用此设置,如下所示。

开启屏蔽现有存储分区的公共访问设置

  1. 在 亚马逊云科技 管理控制台中, 打开 Amazon S3 控制台
  2. 选择存储桶的名称,然后选择 权限 选项卡。
  3. 选择 “编辑” 以更改存储分区的公共访问设置。

封锁账号的公开访问权限

要阻止对您的 S3 存储桶和对象的公开访问,请启 用 “ 阻止该账户的所有公共访问权限”。此设置适用于整个账户,适用于当前和未来的存储分区和接入点。亚马逊云科技 建议您启用 “ 阻止所有公共访问” ,但在应用这些设置之前,您应该确保您的应用程序在没有公共访问权限的情况下能够正常运行。如果您需要对存储分区或对象进行一定级别的公共访问权限,则可以自定义图 4 中显示的各个设置以适应您的特定存储用例。

您可以使用 S3 控制台、 亚马逊云科技 CLI、亚马逊云科技 开发工具包和 REST API 为您的账户中的存储桶配置 S3 阻止公有访问设置。可以按如下方式在 亚马逊云科技 管理控制台中启用此设置。

开启 “屏蔽账户的公共访问设置”

  1. 打开亚马逊 S3 控制台
  2. 在左侧导航窗格中,选择该账户的 阻止公共访问设置
  3. 选择 “编辑” 以更改存储分区的公共访问设置。
    Figure 4: Block Public Access Settings for Account

    图 4:屏蔽账户的公共访问设置

当您与 亚马逊云科技 Organizations 合作时,您可以通过添加拒绝编辑这些设置的 服务控制策略 (SCP) 来防止人们修改账户级别上 的 S 3 阻止公共访问设置。 下面显示了这样的 SCP 的示例。

{
  “Version”: “2012-10-17”,
  “Statement”:[{
    “Sid”: “DenyTurningOffBlockPublicAccessForThisAccount”,
    “Effect”: “Deny”,
    “Action”: “s3:PutAccountPublicAccessBlock”,
    “Resource”: “arn:aws:s3:::*”
    }
  ]
}

授权如何与多种访问控制机制一起使用?

每当 亚马逊云科技 委托人向 S3 发出请求时,授权决定都取决于所有 IAM 策略、S3 存储桶策略和 S3 ACL 的组 合,以及是否在账户、存储桶或接入点上启用 S3 封锁公共访问

根据 最低权限原则 ,决策默认为 “拒绝”,明确拒绝始终优先于 “允许”。例如,如果 IAM 策略授予对对象的访问权限,则 S3 存储桶策略拒绝访问该对象,并且没有 S3 ACL,则访问将被拒绝。同样,如果没有方法指定 ALLOW,则默认情况下该请求将被拒绝。只有当没有方法指定 DENY 且一个或多个方法指定 ALLOW 时,才允许该请求。

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

图 5 说明了授权过程。

Figure 5: Authorization Process

图 5:授权流程

我们希望这篇文章能澄清您关于控制 S3 环境访问的各种方式的一些问题。

使用适用于 S3 的 IAM 访问分析器来查看存储桶访问权限

您可以使用的另一个有趣功能是适用于 S3 的 IAM 访问分析器 ,用于 查看存储桶访问权限。您可以使用适用于 S3 的 IAM 访问分析器来查看具有存储桶 ACL、存储桶策略或授予公共访问权限的访问点策略的存储桶。适用于 S3 的 IAM 访问分析器会提醒您注意配置为允许互联网上的任何人或其他 亚马逊云科技 账户(包括组织外的 亚马逊云科技 账户)访问的存储桶。对于每个公用或共享存储桶,您都会收到报告公共或共享访问权限的来源和级别的调查结果。

在适用于 S3 的 IAM 访问分析器中,您只需单击一下即可阻止对存储桶的所有公共访问。您还可以深入查看存储桶级别的权限设置,以配置精细的访问级别。对于需要公共或共享访问权限的特定且经过验证的用例,您可以通过存档存储桶的调查结果来确认并记录您希望存储桶保持公开或共享的意图。

其他资源

  • IAM 策略文档
  • S3 存储桶策略文档
  • S3 ACL 文档
  • S3 封锁公共访问文档
  • IAM 访问分析器文档

如果您对这篇文章有反馈,请在下面的 评论 部分提交评论。如果您对这篇文章有疑问, 请联系 亚马逊云科技 Support

想了解更多 亚马逊云科技 安全新闻?在 推特 上关注我们 。

Laura Verghote

Laura Verghote

Laura是比荷卢经济联盟公共部门客户的区域解决方案架构师。她与客户合作,在 亚马逊云科技 云中设计和构建解决方案。她通过研究生课程加入 亚马逊云科技 担任技术培训师,在向欧洲、中东和非洲地区的开发人员、管理员、架构师和合作伙伴提供培训内容方面拥有丰富的经验。

Gautam Kumar

Gautam Kumar

Gautam 是 亚马逊云科技 的解决方案架构师。Gautam 帮助各种企业客户在 亚马逊云科技 上设计和架构创新的解决方案,特别热衷于在 亚马逊云科技 上构建安全的工作负载。工作之余,他喜欢旅行和与家人共度时光。