访问控制 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

访问控制

在 Amazon 中,资源是您可使用的实体。在 Amazon Simple Storage Service(S3)中,存储桶对象是最初的 Amazon S3 资源。每个 S3 客户可能都有包含对象的存储桶。当有新功能添加到 S3 时,则会添加额外的资源,但并非每个客户都使用这些特定于功能的资源。有关 Amazon S3 资源的更多信息,请参阅 S3 资源

默认情况下,所有 Amazon S3 资源都是私有的。默认情况下,创建资源的 Amazon Web Services 账户的根用户(资源拥有者)和该账户中具有必要权限的 IAM 用户可以访问他们创建的资源。资源拥有者决定还有谁可以访问该资源以及允许其他人对该资源执行哪些操作。S3 有各种访问管理工具,您可以使用这些工具向其他人授予对您的 S3 资源的访问权限。

以下各节概述了 S3 资源、可用的 S3 访问管理工具以及每种访问管理工具的最佳使用案例。这些章节中的列表力求全面,旨在包括所有 S3 资源、访问管理工具和常见的访问管理使用案例。同时,这些章节设计成目录,可引导您找到所需的技术细节。如果您对以下某些主题有很好的理解,则可以跳到适用于您的章节。

S3 资源

原始 Amazon S3 资源是存储桶及其中包含的对象。随着向 S3 添加新功能,也会添加新的资源。以下是 S3 资源及相应功能的完整列表。

资源类型 Amazon S3 功能 描述

bucket

核心功能

存储桶是对象的容器。要将对象存储在 S3 中,请创建存储桶,然后将一个或多个对象上传到该存储桶。有关更多信息,请参阅 创建、配置和使用 Amazon S3 存储桶

object

对象可以是一个文件和描述该文件的任何元数据。当对象位于存储桶中时,您可以将其打开、下载并移动它。有关更多信息,请参阅 上传、下载和处理 Amazon S3 中的对象

accesspoint

访问点

接入点是附加到存储桶的命名网络端点,您可以使用这些存储桶执行 Amazon S3 object 操作(如 GetObjectPutObject)。每个接入点都有不同的权限、网络控制和自定义的接入点策略,该策略与附加到底层存储桶的存储桶策略结合使用。您可以将任何接入点配置为仅接受来自虚拟私有云(VPC)的请求,或者为每个接入点配置自定义屏蔽公共访问权限设置。有关更多信息,请参阅 使用 Amazon S3 接入点管理数据访问

objectlambdaaccesspoint

对象 Lambda 接入点是也与 Lambda 函数相关联的存储桶的接入点。借助对象 Lambda 接入点,您可以将自己的代码添加到 Amazon S3 GETLISTHEAD 请求中,以便在数据返回到应用程序时修改和处理数据。有关更多信息,请参阅 创建对象 Lambda 接入点

multiregionaccesspoint

多区域接入点提供了一个全局端点,应用程序可以使用该端点来满足来自位于多个 Amazon 区域的 Amazon S3 存储桶的请求。您可以使用多区域接入点通过单个区域中使用的相同架构构建多区域应用程序,然后在世界任何地方运行这些应用程序。向多区域接入点全局端点发出的应用程序请求自动通过 Amazon 全局网络路由到距离最近的 Amazon S3 存储桶,而不是通过拥挤的公共互联网发送请求。有关更多信息,请参阅 Amazon S3 中的多区域接入点

job

S3 批量操作

任务是 S3 批量操作功能的资源。您可以使用 S3 批量操作对您指定的 Amazon S3 对象列表执行大规模批量操作。Amazon S3 跟踪批量操作任务的进度,发送通知,并存储所有操作的详细完成报告,从而提供完全托管式、可审计的无服务器体验。有关更多信息,请参阅 对 Amazon S3 对象执行大规模批量操作

storagelensconfiguration

S3 Storage Lens 存储统计管理工具

S3 Storage Lens 存储分析功能配置负责收集组织范围的存储指标和跨账户的用户数据。S3 Storage Lens 存储分析功能为管理员提供了组织中数百甚至数千个账户的对象存储使用情况和活动的单一视图,并提供了可在多个聚合级别生成见解的详细信息。有关更多信息,请参阅 使用 Amazon S3 Storage Lens 存储统计管理工具评估您的存储活动和使用情况

storagelensgroup

S3 Storage Lens 组使用基于对象元数据的自定义筛选条件来聚合指标。S3 Storage Lens 组可协助您调查数据的特征,例如按龄期划分的对象分布、最常见的文件类型等。有关更多信息,请参阅 使用 S3 Storage Lens 组

accessgrantsinstance

S3 访问授权

S3 Access Grants 实例是您创建的 S3 授权的容器。借助 S3 Access Grants,您可以为您账户中的 IAM 身份、其它账户(跨账户)中的 IAM 身份以及从公司目录中添加到 Amazon IAM Identity Center 的目录身份创建对于您的 Amazon S3 数据的授权。有关 S3 Access Grants 的更多信息,请参阅使用 S3 Access Grants 管理访问权限

accessgrantslocation

Access Grants 位置是存储桶、存储桶内的前缀或您在 S3 Access Grants 实例中注册的对象。您必须在 S3 Access Grants 实例中注册位置,然后才能创建对该位置的授权。然后,借助 S3 Access Grants,您可以为您账户中的 IAM 身份、其它账户(跨账户)中的 IAM 身份以及从公司目录中添加到 Amazon IAM Identity Center 的目录身份授予对存储桶、前缀或对象的访问权限。有关 S3 Access Grants 的更多信息,请参阅使用 S3 Access Grants 管理访问权限

accessgrant

访问授权是对您的 Amazon S3 数据的单独授权。借助 S3 Access Grants,您可以为您账户中的 IAM 身份、其它账户(跨账户)中的 IAM 身份以及从公司目录中添加到 Amazon IAM Identity Center 的目录身份创建对于您的 Amazon S3 数据的授权。有关 S3 Access Grants 的更多信息,请参阅使用 S3 Access Grants 管理访问权限

存储桶

Amazon S3 存储桶有两种类型:通用型存储桶目录存储桶

对 S3 资源进行分类

Amazon S3 提供了对您的 S3 资源进行分类和整理的功能。对资源进行分类不仅对整理资源很有用,还可以根据资源类别设置访问管理规则。特别是,前缀和标记是设置访问管理权限时可以使用的两个存储整理功能。

注意

以下信息适用于通用型存储桶。目录存储桶不支持标记,并且有前缀限制。有关更多信息,请参阅 适用于 S3 Express One Zone 的 Amazon Identity and Access Management(IAM)

  • 前缀 – Amazon S3 中的前缀是对象键名称开头的一个字符串,用于整理存储在 S3 存储桶中的对象。您可以使用分隔符 [例如正斜杠(/)] 来表示对象键名称中前缀的结尾。例如,您可能有以 engineering/ 前缀开头的对象键名称或以 marketing/campaigns/ 前缀开头的对象键名称。在前缀末尾使用分隔符(例如正斜杠字符 /)可以模拟文件夹和文件命名约定。但是,在 S3 中,前缀是对象键名称的一部分。在通用型 S3 存储桶中,没有实际的文件夹层次结构。

    Amazon S3 支持使用对象的前缀对于对象进行整理和分组。您还可以通过对象的前缀管理对于对象的访问权限。例如,您可以将访问权限限制为仅限名称以特定前缀开头的对象。

    有关更多信息,请参阅 使用前缀组织对象。S3 控制台使用文件夹 的概念,在通用型存储桶中,文件夹本质上是附加在对象键名称之前的前缀。有关更多信息,请参阅 使用文件夹在 Amazon S3 控制台中整理对象

  • 标签 – 每个标签都是您分配给资源的键值对。例如,您可以使用标签 topicCategory=engineering 标记某些资源。您可以使用标记来协助进行成本分配、分类和整理以及访问控制。存储桶标记仅用于成本分配。您可以标记对象、Storage Lens 存储分析功能、任务和 S3 Access Grants,以便进行整理或实施访问控制。在 S3 Access Grants 中,您还可以使用标记进行成本分配。举个使用标签控制资源访问权限的示例,您只能共享具有特定标签或标签组合的对象。

    有关更多信息,请参阅《IAM 用户指南》中的使用资源标签控制对 Amazon 资源的访问

身份

在 Amazon S3 中,资源拥有者是创建资源(例如存储桶或对象)的身份。默认情况下,只有创建资源的账户的根用户和该账户中具有所需权限的 IAM 身份才能访问 S3 资源。资源拥有者可以向其它身份授予对其 S3 资源的访问权限。

不拥有资源的身份可以请求访问该资源。对资源的请求已经过身份验证或未经过身份验证。经过身份验证的请求必须包含可验证请求发送者身份的签名值,但未经身份验证的请求不需要签名。我们建议您仅向经过身份验证的用户授予访问权限。有关请求身份验证的更多信息,请参阅 提出请求

重要

我们建议不要使用 Amazon Web Services 账户根用户凭证发起经过身份验证的请求。而应创建一个 IAM 角色并授予该角色完全访问权限。我们将具有此角色的用户称为管理员用户。您可以使用分配给管理员角色的用户凭证而不是 Amazon Web Services 账户 根用户凭证来与 Amazon 交互和执行任务,例如创建存储桶、创建用户以及授予权限。有关更多信息,请参阅《Amazon Web Services 一般参考》中的 Amazon Web Services 账户 根用户凭证和 IAM 用户凭证,并参阅《IAM 用户指南》中的 IAM 中的安全最佳实践

在 Amazon S3 中访问您的数据的身份可以是以下身份之一:

Amazon Web Services 账户拥有者

创建资源的 Amazon Web Services 账户。例如,创建存储桶的账户。此账户是该资源的拥有者。有关更多信息,请参阅 Amazon 账户根用户

与 Amazon Web Services 账户拥有者同属一个账户的 IAM 身份

在为需要 S3 访问权限的新团队成员设置账户时,Amazon Web Services 账户拥有者可以使用 Amazon Identity and Access Management(IAM)来创建用户角色。然后,Amazon Web Services 账户拥有者可以与这些 IAM 身份共享资源。账户拥有者还可以指定要向 IAM 身份授予的权限,这些权限允许或拒绝可以对共享资源执行的操作。

IAM 身份提供了增强的功能,包括要求用户在访问共享资源之前先输入登录凭证的功能。通过使用 IAM 身份,您可以实施一种形式的 IAM 多重身份验证(MFA)来支持强大的身份基础。IAM 最佳实践是创建用于访问管理的角色,而不是向每个单独用户授予权限。您可以将各个用户分配给相应的角色。有关更多信息,请参阅 IAM 安全最佳实践

其它 Amazon 账户拥有者及其 IAM 身份(跨账户存取)

Amazon Web Services 账户拥有者还可以向其它 Amazon 账户拥有者或属于其它 Amazon 账户的 IAM 身份授予对资源的访问权限。

注意

权限委托 – 如果某个 Amazon Web Services 账户拥有一项资源,则该账户可以将这些权限授予其它 Amazon Web Services 账户。然后,这个账户就可以将这些权限或其子集委托给同一账户中的用户。这称为 权限委托。但从另一账户接收权限的账户不能“跨账户”向其它 Amazon Web Services 账户委托这些权限。

匿名用户(公共访问权限)

Amazon Web Services 账户拥有者可以公开资源。从技术上讲,公开某资源会与匿名用户 共享该资源。除非您更改此设置,否则默认情况下,自 2023 年 4 月以来创建的存储桶会屏蔽所有公共访问权限。我们建议您将存储桶设置为屏蔽公共访问权限,并且仅向经过身份验证的用户授予访问权限。有关屏蔽公共访问权限的更多信息,请参阅阻止对您的 Amazon S3 存储的公有访问

Amazon Web Services

资源拥有者可以向其它 Amazon 服务授予对 Amazon S3 资源的访问权限。例如,您可以向 Amazon CloudTrail 服务授予将日志文件写入存储桶的 s3:PutObject 权限。有关更多信息,请参阅向 Amazon 服务提供访问权限

公司目录身份

资源拥有者可以使用 S3 Access Grants 向公司目录中的用户或角色授予对 S3 资源的访问权限。有关将公司目录添加到 Amazon IAM Identity Center 的更多信息,请参阅 What is IAM Identity Center?

存储桶拥有者或资源拥有者

用于创建存储桶和上传对象的 Amazon Web Services 账户拥有这些资源。存储桶拥有者可以向其他 Amazon Web Services 账户(或其他账户中的用户)授予上传对象的跨账户权限。

当存储桶拥有者允许其它账户向存储桶上传对象时,默认情况下,该存储桶拥有者拥有上传到其存储桶的所有对象。但是,如果强制存储桶拥有者存储桶拥有者优先 存储桶设置都处于关闭状态,则上传对象的 Amazon Web Services 账户将拥有这些对象,而存储桶拥有者对其它账户拥有的对象没有权限,但以下情况除外:

  • 账单由存储桶拥有者支付。存储桶拥有者可以拒绝对任何对象的访问,或删除存储桶中的任何对象,而无论它们的拥有者是谁。

  • 存储桶拥有者可以归档任何对象或还原归档的对象,而无论它们的拥有者是谁。归档是指用于存储对象的存储类。有关更多信息,请参阅 管理存储生命周期

访问管理工具

Amazon S3 提供了各种安全功能和工具。以下是这些功能和工具的完整列表。您并不需要所有这些访问管理工具,但必须使用一个或多个工具来授予对您的 Amazon S3 资源的访问权限。正确应用这些工具有助于确保只有目标用户才能访问您的资源。

最常用的访问管理工具是访问策略。访问策略可以是附加到 Amazon 资源的基于资源的策略,例如存储桶的存储桶策略。访问策略也可以是附加到 Amazon Identity and Access Management(IAM)身份(如 IAM 用户、组或角色)的基于身份的策略。编写访问策略来向 Amazon Web Services 账户和 IAM 用户、组和角色授予对资源执行操作的权限。例如,您可以向另一个 Amazon Web Services 账户授予 PUT Object 权限,以使该账户可以向您的存储桶上传对象。

访问策略描述了谁可以访问哪些内容。当 Amazon S3 收到请求时,它必须评估所有访问策略,来决定是授权还是拒绝该请求。有关 Amazon S3 如何评估这些策略的更多信息,请参阅 Amazon S3 如何对请求授权

以下是 Amazon S3 中提供的访问管理工具。

Amazon S3 存储桶策略是采用 JSON 格式的 Amazon Identity and Access Management(IAM)基于资源的策略,该策略附加到特定的存储桶。使用存储桶策略来向其它 Amazon Web Services 账户或 IAM 身份授予对相应存储桶及其中对象的权限。使用存储桶策略可以满足许多 S3 访问管理使用案例的要求。通过存储桶策略,您可以对存储桶访问权限进行个性化设置,以协助确保只有您已批准的身份才能访问资源并在其中执行操作。有关更多信息,请参阅 Amazon S3 的存储桶策略

下面是一个示例存储桶策略。您可以使用 JSON 文件来表示存储桶策略。此示例策略向 IAM 角色授予对存储桶中所有对象的读取权限。该策略包含一条名为 BucketLevelReadPermissions 的语句,该语句允许对名为 DOC-EXAMPLE-BUCKET1 的存储桶中的对象执行 s3:GetObject 操作(读取权限)。通过将 IAM 角色指定为 Principal,此策略向具有该角色的任何 IAM 用户授予访问权限。要使用此示例策略,请将 user input placeholders 替换为您自己的信息。

{ "Version":"2012-10-17", "Statement": [ { "Sid":"BucketLevelReadPermissions", "Effect":"Allow", "Principal": { "AWS": "arn:aws:iam::123456789101:role/s3-role" }, "Action":["s3:GetObject"], "Resource":["arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*"] }] }
注意

创建策略时,请避免在 Principal 元素中使用通配符(*),因为使用通配符将允许任何人访问您的 Amazon S3 资源。而是应显式列出允许访问存储桶的用户或组,或者使用策略中的条件子句列出必须满足的条件。此外,在适用的情况下,向用户或组授予特定的权限,而不是包含通配符来让用户或组执行操作。

基于身份的策略或 IAM 用户策略是一种 Amazon Identity and Access Management(IAM)策略。基于身份的策略是采用 JSON 格式的策略,该策略附加到您的 Amazon 账户中的 IAM 用户、组或角色。您可以使用基于身份的策略,来向 IAM 身份授予对您的存储桶或对象的访问权限。您可以在您的账户中创建 IAM 用户、组和角色,并为其附加访问策略。然后,您可以授予对 Amazon 资源(包括 Amazon S3 资源)的访问权限。有关更多信息,请参阅 Amazon S3 基于身份的策略

下面是基于身份的策略的示例。此示例策略允许关联的 IAM 角色对存储桶及其中的对象执行六种不同的 Amazon S3 操作(权限)。如果您将此策略附加到您账户中的 IAM 角色,并将该角色分配给您的某些 IAM 用户,则具有此角色的用户将能够对在策略中指定的资源(存储桶)执行这些操作。要使用此示例策略,请将 user input placeholders 替换为您自己的信息。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AssignARoleActions", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket", "s3:DeleteObject", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1" ] }, { "Sid": "AssignARoleActions2", "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" } ] }

使用 S3 Access Grants 为企业身份目录(例如 Active Directory)中的身份以及 Amazon Identity and Access Management(IAM)身份创建对您的 Amazon S3 数据的访问授权。S3 Access Grants 可协助您大规模管理数据权限。此外,S3 Access Grants 还会记录最终用户身份以及用于访问 Amazon CloudTrail 中 S3 数据的应用程序。这提供了详细的审计历史记录,细至与 S3 存储桶中数据的所有访问权限对应的最终用户身份。有关更多信息,请参阅 使用 S3 Access Grants 管理访问权限

对于使用 S3 上的共享数据集的应用程序,Amazon S3 接入点可简化大规模管理数据访问的事宜。接入点是附加到存储桶的命名网络端点。您可以使用接入点来大规模执行 S3 对象操作,例如上传和检索对象。一个存储桶最多可附加 10000 个接入点,对于每个接入点,您可以强制实施不同的权限和网络控制,从而让您可以详细控制对于 S3 对象的访问权限。S3 接入点可以与同一个账户或其它可信账户中的存储桶相关联。接入点策略是与底层存储桶策略一起进行评估的基于资源的策略。有关更多信息,请参阅 使用 Amazon S3 接入点管理数据访问

ACL 是用于确定被授权者和所授予权限的授权列表。ACL 向其它 Amazon Web Services 账户授予基本的读取或写入权限。ACL 使用特定于 Amazon S3 的 XML 架构。ACL 是一种 Amazon Identity and Access Management(IAM)策略。对象 ACL 用于管理对于对象的访问权限,而存储桶 ACL 用于管理对存储桶的访问权限。使用存储桶策略,整个存储桶只有单个策略,但可以为每个对象指定对象 ACL。我们建议您将 ACL 保持为关闭状态,除非有必须单独控制每个对象的访问权限的特殊情况。有关 ACL 的更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。

警告

Amazon S3 中的大多数现代使用案例不需要使用 ACL。

下面是一个示例存储桶 ACL。ACL 中的授权显示一个具有完全控制权限的存储桶拥有者。

<?xml version="1.0" encoding="UTF-8"?> <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Owner> <ID>Owner-Canonical-User-ID</ID> <DisplayName>owner-display-name</DisplayName> </Owner> <AccessControlList> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Canonical User"> <ID>Owner-Canonical-User-ID</ID> <DisplayName>display-name</DisplayName> </Grantee> <Permission>FULL_CONTROL</Permission> </Grant> </AccessControlList> </AccessControlPolicy>

要管理对于对象的访问权限,您必须是该对象的拥有者。您可以使用对象所有权存储桶级别设置,来控制上传到存储桶的对象的所有权。此外,使用对象所有权来开启 ACL。默认情况下,对象所有权设为强制存储桶拥有者设置,并且所有 ACL 均处于关闭状态。关闭 ACL 后,存储桶拥有者拥有存储桶中的所有对象,并独占管理对数据的访问权限。为了管理访问权限,存储桶拥有者使用策略或其它访问管理工具(ACL 除外)。有关更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。

对象所有权有三个设置,您可以使用它们来控制上传到存储桶的对象的所有权并开启 ACL:

ACL 已关闭
  • 强制存储桶拥有者(默认)– ACL 已关闭,存储桶拥有者自动拥有并完全控制存储桶中的每个对象。ACL 不影响对 S3 存储桶中数据的权限。存储桶专门使用策略来定义访问控制。

ACL 已开启
  • Bucket owner preferred(首选存储桶拥有者)— 存储桶拥有者拥有并完全控制其他账户使用 bucket-owner-full-control 标准 ACL 写入存储桶的新对象。

  • 对象编写者— 该 Amazon Web Services 账户上传对象拥有该对象,对其拥有完全控制权,并且可以通过 ACL 授予其他用户访问该对象的权限。

其他最佳实践

考虑使用以下存储桶设置和工具来协助保护传输中数据和静态数据,这两者对于保持数据的完整性和可访问性至关重要:

  • 屏蔽公共访问权限 - 请勿关闭默认的存储桶级别设置屏蔽公共访问权限。默认情况下,此设置会屏蔽对您的数据的公共访问权限。有关屏蔽公共访问权限的更多信息,请参阅阻止对您的 Amazon S3 存储的公有访问

  • S3 版本控制 – 为确保数据完整性,您可以实现 S3 版本控制存储桶设置,此设置在您进行更新时对于对象进行版本控制,而不是覆盖它们。如果需要,您可以使用 S3 版本控制功能来保留、检索和还原以前的版本。有关 S3 版本控制的信息,请参阅在 S3 存储桶中使用版本控制

  • S3 对象锁定 – S3 对象锁定是您可以实施来实现数据完整性的另一个设置。此功能可以实现一次写入多次读取(WORM)模式,从而以不可变的方式存储对象。有关对象锁定的信息,请参阅使用 S3 对象锁定

  • 对象加密 – Amazon S3 提供了多种对象加密选项,用于保护传输中数据和静态数据。服务器端加密 会在将对象保存到数据中心的磁盘上之前为对象加密,然后在下载对象时对数据进行解密。如果您验证了您的请求并且您拥有访问权限,则您访问加密对象或未加密对象的方式就没有区别。有关更多信息,请参阅 使用服务器端加密保护数据。默认情况下,S3 会加密新上传的对象。有关更多信息,请参阅 为 Amazon S3 存储桶设置默认服务器端加密行为客户端加密是在将数据发送到 Amazon S3 之前加密数据的行为。有关更多信息,请参阅 使用客户端加密保护数据

  • 签名方法 – 签名版本 4 是将身份验证信息添加到通过 HTTP 发送的 Amazon 请求的过程。出于安全考虑,大多数 Amazon 请求都必须使用访问密钥(包括访问密钥 ID 和秘密访问密钥)进行签名。这两个密钥通常称为您的安全凭证。有关更多信息,请参阅对请求进行身份验证(Amazon Signature Version 4)Signature Version 4 签名过程

操作

有关 S3 权限和条件键的完整列表,请参阅《服务授权参考》中的 Actions, resources, and condition keys for Amazon S3

操作

Amazon S3 的 Amazon Identity and Access Management(IAM)操作是可以对 S3 存储桶或对象执行的可能操作。您可以向身份授予这些操作,以便这些身份可以对您的 S3 资源执行操作。S3 操作的示例为 s3:GetObject(读取存储桶中的对象)和 s3:PutObject(将对象写入存储桶)。

条件键

除操作外,IAM 条件键限制为仅在满足条件时才授予访问权限。条件键是可选的。

注意

在基于资源的访问策略(例如存储桶策略)或基于身份的策略中,您可以指定以下内容:

  • 策略语句的 Action 元素中的一个操作或一系列操作。

  • 在策略语句的 Effect 元素中,您可以指定 Allow 来授予列出的操作,也可以指定 Deny 来阻止列出的操作。为进一步保持最低权限的做法,访问策略的 Effect 元素中的 Deny 语句应尽可能宽泛,而 Allow 语句应尽可能受限。与 s3:* 操作配对的 Deny 效果是为策略条件语句中包含的身份实现选择加入最佳实践的另一个好方法。

  • 策略语句的 Condition 元素中的条件键。

访问管理使用案例

Amazon S3 为资源拥有者提供了各种用于授予访问权限的工具。您使用的 S3 访问管理工具取决于您要共享的 S3 资源、您要授予访问权限的身份以及您想要允许或拒绝的操作。您可能希望使用一种 S3 访问管理工具或组合使用多种 S3 访问管理工具,来管理对 S3 资源的访问权限。

大多数情况下,您可以使用访问策略来管理权限。访问策略可以是基于资源的策略,此策略附加到资源(例如存储桶)或其它 Amazon S3 资源(S3 资源)。访问策略也可以是基于身份的策略,该策略附加到您账户中的 Amazon Identity and Access Management(IAM)用户、组或角色。您可能会发现存储桶策略更适合您的使用案例。有关更多信息,请参阅 Amazon S3 的存储桶策略。或者,使用 Amazon Identity and Access Management(IAM),您可以在您的 Amazon Web Services 账户中创建 IAM 用户、组和角色,并通过基于身份的策略管理它们对存储桶和对象的访问权限。有关更多信息,请参阅 Amazon S3 基于身份的策略

为了协助您浏览这些访问管理选项,以下是常见的 Amazon S3 客户使用案例和对于每个 S3 访问管理工具的建议。

所有访问管理工具都可以满足这个基本使用案例的要求。对于此使用案例,我们建议使用以下访问管理工具:

  • 存储桶策略 – 如果您要授予对一个存储桶或少量存储桶的访问权限,或者如果不同存储桶之间的存储桶访问权限相似,请使用存储桶策略。使用存储桶策略,您可以为每个存储桶管理一个策略。有关更多信息,请参阅 Amazon S3 的存储桶策略

  • 基于身份的策略 – 如果您有大量的存储桶,每个存储桶的访问权限不同,并且只有几个用户角色需要管理,则可以对用户、组或角色使用 IAM 策略。如果您要管理用户对其它 Amazon 资源以及 Amazon S3 资源的访问权限,IAM 策略也是一个不错的选择。有关更多信息,请参阅 示例 1:存储桶拥有者向其用户授予存储桶权限

  • S3 Access Grants – 您可以使用 S3 Access Grants 来授予对 S3 存储桶、前缀或对象的访问权限。S3 Access Grants 允许您大规模指定不同的对象级别权限,而存储桶策略的大小限制为 20 KB。有关更多信息,请参阅 开始使用 S3 Access Grants

  • 接入点 – 您可以使用接入点,接入点是附加到存储桶的命名网络端点。一个存储桶最多可附加 10000 个接入点,对于每个接入点,您可以强制实施不同的权限和网络控制,从而让您可以详细控制对于 S3 对象的访问权限。有关更多信息,请参阅 使用 Amazon S3 接入点管理数据访问

要向其它 Amazon Web Services 账户授予权限,您必须使用存储桶策略或以下建议的访问管理工具之一。您不能对此使用案例使用基于身份的访问策略。有关授予跨账户存取权限的更多信息,请参阅如何提供对 Amazon S3 存储桶中对象的跨账户存取权限?

对于此使用案例,我们建议使用以下访问管理工具:

  • 存储桶策略 - 使用存储桶策略,您可以为每个存储桶管理一个策略。有关更多信息,请参阅 Amazon S3 的存储桶策略

  • S3 Access Grants – 您可以使用 S3 Access Grants 来授予对 S3 存储桶、前缀或对象的跨账户权限。您可以使用 S3 Access Grants 大规模指定不同的对象级别权限,而存储桶策略的大小限制为 20 KB。有关更多信息,请参阅 开始使用 S3 Access Grants

  • 接入点 – 您可以使用接入点,接入点是附加到存储桶的命名网络端点。一个存储桶最多可附加 10000 个接入点,对于每个接入点,您可以强制实施不同的权限和网络控制,从而让您可以详细控制对于 S3 对象的访问权限。有关更多信息,请参阅 使用 Amazon S3 接入点管理数据访问

例如,在存储桶策略中,您可以授予对存储桶中共享特定 key name prefix 或具有特定标签的对象的访问权限。您可以授予对以键名称前缀 logs/ 开头的对象的读取权限。但是,如果您的访问权限因对象而异,那么使用存储桶策略授予对各个对象的权限可能不太实际,特别是由于存储桶策略的大小限制为 20 KB。

对于此使用案例,我们建议使用以下访问管理工具:

  • S3 Access Grants – 您可以使用 S3 Access Grants 来管理对象级别或前缀级别的权限。与存储桶策略不同,您可以使用 S3 Access Grants 大规模指定不同的对象级别权限。存储桶策略的大小限制为 20 KB。有关更多信息,请参阅 开始使用 S3 Access Grants

  • 接入点 - 您可以使用接入点来管理对象级别或前缀级别的权限。接入点是附加到存储桶的命名网络端点。一个存储桶最多可附加 10000 个接入点,对于每个接入点,您可以强制实施不同的权限和网络控制,从而让您可以详细控制对于 S3 对象的访问权限。有关更多信息,请参阅 使用 Amazon S3 接入点管理数据访问

  • ACL – 我们建议不要使用访问控制列表(ACL),特别是因为 ACL 限制为每个对象 100 个授权。但是,如果您选择开启 ACL,请在存储桶设置中,将对象所有权 设置为存储桶拥有者优先ACL 已启用。有了这个设置,用 bucket-owner-full-control 标准的 ACL 编写的新对象将自动归存储桶拥有者而不是对象编写者所有。然后,您可以使用对象 ACL(一个采用 XML 格式的访问策略)来向其他用户授予对于对象的访问权限。有关更多信息,请参阅 访问控制列表 (ACL) 概述

对于此使用案例,我们建议使用以下访问管理工具:

  • 存储桶策略 - 使用存储桶策略,您可以为每个存储桶管理一个策略。有关更多信息,请参阅 Amazon S3 的存储桶策略

  • 接入点 – 接入点是附加到存储桶的命名网络端点。一个存储桶最多可附加 10000 个接入点,对于每个接入点,您可以强制实施不同的权限和网络控制,从而让您可以详细控制对于 S3 对象的访问权限。有关更多信息,请参阅 使用 Amazon S3 接入点管理数据访问

对于此使用案例,我们建议使用以下访问管理工具:

  • 接入点 – 接入点是附加到存储桶的命名网络端点。一个存储桶最多可附加 10000 个接入点,对于每个接入点,您可以强制实施不同的权限和网络控制,从而让您可以详细控制对于 S3 对象的访问权限。每个接入点强制实施自定义接入点策略,该策略与附加到底层存储桶的存储桶策略结合使用。有关更多信息,请参阅 使用 Amazon S3 接入点管理数据访问

Amazon S3 的虚拟私有云(VPC)端点是 VPC 内仅允许连接到 S3 的逻辑实体。对于此使用案例,我们建议使用以下访问管理工具:

  • VPC 中的存储桶设置 – 您可以使用存储桶策略来控制允许谁访问您的存储桶,以及他们可以访问哪些 VPC 端点。有关更多信息,请参阅 使用存储桶策略控制从 VPC 端点的访问

  • 接入点 - 如果您选择设置接入点,则可以使用接入点策略。您可以将任何接入点配置为仅接受来自 Virtual Private Cloud(VPC)的请求,以限制专用网络的 Amazon S3 数据访问。您还可以为每个接入点配置自定义屏蔽公共访问权限设置。有关更多信息,请参阅 使用 Amazon S3 接入点管理数据访问

使用 S3,您可以托管静态网站,并允许任何人查看该网站的内容(托管在 S3 存储桶中)。

对于此使用案例,我们建议使用以下访问管理工具:

  • Amazon CloudFront – 该解决方案允许您面向公众托管 Amazon S3 静态网站,同时还继续屏蔽对存储桶内容的所有公共访问权限。如果要将所有四个“S3 屏蔽公共访问权限”设置保持为启用状态并托管 S3 静态网站,则可以使用 Amazon CloudFront 来源访问控制(OAC)。Amazon CloudFront 提供了设置安全静态网站所需的功能。此外,不使用此解决方案的 Amazon S3 静态网站只能支持 HTTP 端点。CloudFront 使用 Amazon S3 的持久存储,同时提供额外的安全标头,如 HTTPS。HTTPS 通过加密正常 HTTP 请求并防范常见的网络攻击来增强安全性。

    有关更多信息,请参阅《Amazon CloudFront 开发人员指南》中的安全静态网站入门

  • 让 Amazon S3 存储桶可供公开访问 – 您可以配置存储桶来用作公开访问的静态网站。

    警告

    我们建议不要使用这种方法。相反,我们建议您将 Amazon S3 静态网站用作 Amazon CloudFront 的一部分。有关更多信息,请参阅前一个选项或参阅安全静态网站入门

    要在没有 Amazon CloudFront 的情况下创建 Amazon S3 静态网站,首先必须关闭所有屏蔽公共访问权限设置。在为静态网站编写存储桶策略时,请确保仅允许 s3:GetObject 操作,而非 ListObjectPutObject 权限。这有助于确保用户无法查看存储桶中的所有对象或添加其自己的内容。有关更多信息,请参阅 设置访问网站的权限

创建新的 Amazon S3 存储桶时,屏蔽公共访问权限 设置默认处于启用状态。有关屏蔽公共访问权限的更多信息,请参阅阻止对您的 Amazon S3 存储的公有访问

我们建议不要对存储桶允许公共访问权限。但是,如果您必须针对特定使用案例允许公共访问权限,我们建议您为此使用案例使用以下访问管理工具:

  • 禁用屏蔽公共访问权限设置 - 存储桶拥有者可以允许向存储桶发送未经身份验证的请求。例如,当存储桶具有公有存储桶策略或存储桶 ACL 授予公共访问权限时,允许未经身份验证的 PUT Object 请求。所有未经身份验证的请求均由其他任意 Amazon 用户发出,甚至是由未经身份验证的匿名用户发出。此用户在 ACL 中由特定的规范用户 ID 65a011a29cdf8ec533ec3d1ccaae921c 表示。如果将对象上传到 WRITEFULL_CONTROL,这会专门向“所有用户”组或匿名用户授予访问权限。有关公有存储桶策略和公有访问控制列表(ACL)的更多信息,请参阅 “公有”的含义

存储桶策略和基于身份的策略都有 20 KB 的大小限制。如果您的访问权限要求很复杂,则可能会超过此大小限制。

对于此使用案例,我们建议使用以下访问管理工具:

  • 接入点 – 如果接入点适用于您的使用案例,请使用接入点。对于接入点,每个存储桶都有多个命名网络端点,每个端点都有自己的接入点策略,该策略与底层存储桶策略结合使用。但是,接入点只能对于对象执行操作,而不能对存储桶执行操作,并且不支持跨区域复制。有关更多信息,请参阅 使用 Amazon S3 接入点管理数据访问

  • S3 Access Grants – 使用 S3 Access Grants,这支持大量授权来授予对存储桶、前缀或对象的访问权限。有关更多信息,请参阅 开始使用 S3 Access Grants

您可以将公司目录添加到 Amazon IAM Identity Center,而不必通过 Amazon Identity and Access Management(IAM)管理用户、组和角色。有关更多信息,请参阅 What is IAM Identity Center?

将公司目录添加到 Amazon IAM Identity Center 后,我们建议您使用以下访问管理工具,向公司目录身份授予对 S3 资源的访问权限:

  • S3 Access Grants – 使用 S3 Access Grants,这支持向公司目录中的用户或角色授予访问权限。有关更多信息,请参阅 开始使用 S3 Access Grants

对于此使用案例,我们建议使用以下访问管理工具:

  • 存储桶 ACL – 存储桶 ACL 的唯一建议使用案例是向某些 Amazon Web Services(如 Amazon CloudFront awslogsdelivery 账户)授予权限。当您创建或更新分配并开启 CloudFront 日志记录时,CloudFront 会更新存储桶(ACL)来向 awslogsdelivery 账户授予 FULL_CONTROL 权限,从而将日志写入您的存储桶。有关更多信息,请参阅 Amazon CloudFront Developer Guide(Amazon CloudFront 开发人员指南)中的 Permissions required to configure standard logging and to access your log files(配置标准日志和访问日志文件所需的权限)。如果存储日志的存储桶对于 S3 对象所有权使用强制存储桶拥有者设置来关闭 ACL,则 CloudFront 无法将日志写入存储桶。有关更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。

您可以使用存储桶策略、接入点或 S3 Access Grants,来向其它账户授予将对象上传到您的存储桶的访问权限。如果您已授予对存储桶的跨账户存取权限,则可以确保上传到存储桶的任何对象均保持在您的完全控制之下。

对于此使用案例,我们建议使用以下访问管理工具:

  • 对象所有权 - 将存储桶级别的设置对象所有权 保留为默认的强制存储桶拥有者 设置。

访问管理故障排除

以下资源有助于您排查 S3 访问管理方面的任何问题:

排查拒绝访问(403 禁止)错误

如果您遇到拒绝访问问题,请检查账户级别和存储桶级别的设置。此外,请检查您用于授予访问权限的访问管理功能,来确保策略、设置或配置正确无误。有关 Amazon S3 中拒绝访问(403 禁止)错误的常见原因的更多信息,请参阅排查 Amazon S3 中的拒绝访问(403 禁止)错误

适用于 S3 的 IAM Access Analyzer

如果您不想公开您的任何资源,或者您想限制对资源的公共访问权限,则可以使用适用于 S3 的 IAM Access Analyzer。在 Amazon S3 控制台上,使用适用于 S3 的 IAM Access Analyzer 来查看具有存储桶访问控制列表(ACL)、存储桶策略或授予公共或共享访问权限的接入点策略的所有存储桶。如果存在已配置为允许互联网上的任何人或其他 Amazon Web Services 账户(包括组织外部的 Amazon Web Services 账户)访问的存储桶,适用于 S3 的 IAM Access Analyzer 会向您发出提醒。您会收到每个公共存储桶或共享存储桶的结果,其中报告了公共或共享访问的来源和级别。

在适用于 S3 的 IAM Access Analyzer 中,只需一个操作,即可屏蔽对存储桶的所有公共访问权限。我们建议您屏蔽所有对存储桶的公共访问权限,除非您需要公共访问权限才能支持特定使用案例。在屏蔽所有公共访问权限之前,确保您的应用程序在没有公共访问权限的情况下可以继续正常工作。有关更多信息,请参阅 阻止对您的 Amazon S3 存储的公有访问

您还可以查看存储桶级别的权限设置,来配置详细的访问级别。对于需要公共或共享访问的特定和经验证的使用案例,您可以通过对存储桶的结果进行归档来确认和记录存储桶保持公开或共享的意图。您可以随时重新访问和修改这些存储桶配置。您还可以将结果下载为 CSV 格式的报告以供审计使用。

Amazon S3 控制台上提供适用于 S3 的 IAM Access Analyzer,无需额外费用。适用于 S3 的 IAM Access Analyzer 由 Amazon Identity and Access Management(IAM)IAM Access Analyzer 提供支持。要在 Amazon S3 控制台上使用适用于 S3 的 IAM Access Analyzer,您必须访问 IAM 控制台,然后在 IAM Access Analyzer 中为每个单独区域创建账户级别分析器。

有关适用于 S3 的 IAM Access Analyzer 的更多信息,请参阅使用适用于 S3 的 IAM Access Analyzer 查看存储桶访问权限

日记账记录和监控

监控是维护 Amazon S3 解决方案的可靠性、可用性和性能的重要组成部分,以便您可以更轻松地调试访问故障。日志记录有助于您深入了解用户收到的任何错误,以及何时发出了什么样的请求。Amazon 提供了几种用于监控 Amazon S3 资源的工具,如下所示:

  • Amazon CloudTrail

  • Amazon S3 访问日志

  • Amazon Trusted Advisor

  • Amazon CloudWatch

有关更多信息,请参阅 Amazon S3 中的日志记录和监控