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

访问控制最佳实践

Amazon S3 提供了各种安全功能和工具。以下方案应作为您在执行特定任务或在特定环境中操作时可能需要使用哪些工具和设置的指南。正确应用这些工具有助于维护数据的完整性,并有助于确保目标用户可以访问您的资源。

创建新存储桶

创建新存储桶时,您应该应用以下工具和设置来帮助确保 Amazon S3 资源受到保护。 

阻止公有访问

S3 阻止公有访问提供四种设置,以帮助您避免无意中公开 S3 资源。可以按任意组合将这些设置应用于各访问点、存储桶或整个 AWS 账户。如果您将某一设置应用于某个账户,则该设置将应用于该账户拥有的所有存储桶和访问点。默认情况下,Block all public access (阻止所有公有访问) 设置应用于在 Amazon S3 控制台中创建的新存储桶。 

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的“公有”的含义

如果“S3 阻止公有访问”设置限制性太强,则可以使用 AWS Identity and Access Management (IAM) 身份向特定用户授予访问权限,而不是禁用所有“阻止公有访问”设置。将“阻止公有访问”与 IAM 身份结合使用,有助于确保被“阻止公有访问”设置阻止的任何操作都会被拒绝,除非已向发出请求的用户授予特定权限。

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的阻止公有访问设置

使用 IAM 身份授予访问权限

为需要 S3 访问权限的新团队成员设置账户时,请使用 IAM 用户和角色来确保最低权限。还可以实施一种形式的 IAM 多重验证 (MFA) 来支持强大的身份基础。使用 IAM 身份,您可以向用户授予独特的权限,并指定用户可以访问哪些资源以及他们可以执行什么操作。IAM 身份提供了增强的功能,此类功能包括要求用户在访问共享资源之前先输入登录凭证,并将权限层次结构应用于单个存储桶中的不同对象。

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的示例 1:存储桶拥有者向其用户授予存储桶权限

存储桶策略

通过存储桶策略,您可以对存储桶访问进行个性化设置,以帮助确保只有那些已批准的用户才能访问资源并在其中执行操作。除了存储桶策略之外,还应使用存储桶级别的“阻止公有访问”设置来进一步限制对数据的公有访问。

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的 Amazon S3 中的策略和权限

创建策略时,请避免在 Principal 元素中使用通配符,因为它有效地允许任何人访问您的 Amazon S3 资源。更佳的方法是明确列出允许访问存储桶的用户或组。在适用的情况下向他们授予特定权限,而不是包含通配符来执行其操作。

为进一步保持最小权限的做法, Effect 元素中的 Deny 语句应尽可能宽泛,而 Allow 语句应尽可能受限。与“s3:*”操作配对的 Deny 效果是为策略条件语句中包含的用户实现选择加入最佳实践的另一个好方法。

有关为策略生效时间指定条件的更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的 Amazon S3 条件键

VPC 设置中的存储桶

在企业设置中添加用户时,您可以使用 Virtual Private Cloud (VPC) 终端节点来允许虚拟网络中的任何用户访问您的 Amazon S3 资源。VPC 终端节点使开发人员能够根据用户所连接的网络为用户组提供特定的访问权限。如果请求不是源自指定的终端节点,您可以使用 VPC 终端节点拒绝存储桶访问,而不是将每个用户添加到 IAM 角色或组。

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的 Amazon S3 的 VPC 终端节点的示例存储桶策略

存储和共享数据

使用以下工具和最佳实践来存储和共享您的 Amazon S3 数据。

版本控制和对象锁定以实现数据完整性

如果您使用 Amazon S3 控制台管理存储桶和对象,则应实现 S3 版本控制和 S3 对象锁定。这些功能有助于防止意外地更改关键数据,并使您能够回滚意料之外的操作。当有多个具有完全写入和执行权限的用户访问 Amazon S3 控制台时,此功能特别有用。

有关 S3 版本控制的信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的使用版本控制。有关对象锁定的信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的使用 S3 对象锁定以锁定对象

对象生命周期管理以实现成本效率

要管理您的对象以使其在整个生命周期内经济高效地进行存储,您可以将生命周期策略与对象版本控制配对。生命周期策略定义您希望 S3 在对象的生命周期内执行的操作。例如,您可以创建一个生命周期策略,该策略将对象转换为另一个存储类别,存档对象,或在指定时间段后删除它们。您可以使用共享前缀或标签为存储桶中的所有对象或一部分对象定义生命周期策略。

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的对象生命周期管理

针对多个办公地点的跨区域复制

创建可由不同办公地点访问的存储桶时,应考虑实施 S3 跨区域复制。跨区域复制有助于确保所有用户都能访问他们所需的资源,并提高操作效率。跨区域复制通过跨不同 AWS 区域中的 S3 存储桶复制对象,提高了可用性。但是,使用此工具会增加存储成本。

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的复制

安全静态网站托管的权限

将存储桶配置为用作公开访问的静态网站时,您需要禁用所有“阻止公有访问”设置。在为静态网站编写存储桶策略时,务必仅提供 s3:GetObject 操作而非 ListObjectPutObject 权限。这有助于确保用户无法查看存储桶中的所有对象或添加自己的内容。

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的设置访问网站的权限

Amazon CloudFront 提供了设置安全静态网站所需的功能。Amazon S3 静态网站仅支持 HTTP 终端节点。CloudFront 使用 Amazon S3 的持久存储,同时提供额外的安全标头,如 HTTPS。HTTPS 通过加密正常 HTTP 请求并防范常见的网络攻击来增强安全性。

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

共享资源

您可以通过多种不同的方式与特定用户组共享资源。您可以使用以下工具将一组文档或其他资源共享给单个用户、部门或办公室。尽管它们都可以用来实现相同的目标,但某些工具可能比其他工具更好地与您的现有设置配对。

用户策略

您可以使用 IAM 组和用户策略与有限的一组用户共享资源。创建新的 IAM 用户时,系统会提示您创建这些用户并将其添加到组中。但是,您可以随时创建用户并将其添加到组。如果您打算与之共享这些资源的各用户已在 IAM 中设置,则可以将他们添加到公共组,并在用户策略中与他们的组共享存储桶。还可以使用 IAM 用户策略共享存储桶中的各个对象。

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的允许 IAM 用户访问您的其中一个存储桶

访问控制列表

作为一般规则,我们建议您使用 S3 存储桶策略或 IAM 策略进行访问控制。Amazon S3 访问控制列表 (ACL) 是早于 IAM 的传统访问控制机制。如果您已经使用 S3 ACL 并且发现它们足够,则无需更改。但是,某些访问控制方案要求使用 ACL。例如,当存储桶拥有者想要向对象授予权限,但并非所有对象都归存储桶拥有者所拥有时,对象所有者必须首先向存储桶拥有者授予权限。这是使用对象 ACL 完成的。

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的示例 3:存储桶拥有者向其用户授予不属于自己的对象的权限

前缀

尝试共享存储桶中的特定资源时,您可以使用前缀复制文件夹级别的权限。Amazon S3 控制台支持将文件夹概念作为通过为对象使用共享的名称前缀而对对象进行分组的一种方式。 然后,您可以在 IAM 用户策略的条件中指定前缀,以向他们授予访问与该前缀关联的资源的明确权限。 

有关更多信息,请参阅《Amazon Simple Storage Service 控制台用户指南》中的使用文件夹

标记

如果您使用对象标记对存储进行分类,则可以与指定的用户共享已使用特定值标记的对象。通过资源标记,您可以根据与用户尝试访问的资源相关联的标签来控制对对象的访问。要执行此操作,请使用 IAM 用户策略中的 ResourceTag/key-name 条件以允许访问标记的资源。

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

保护数据

使用以下工具来帮助保护传输中的数据和静态数据,这两者对于保持数据的完整性和可访问性至关重要。

Object encryption

Amazon S3 提供了多种对象加密选项,用于保护传输中的数据和静态数据。服务器端加密在将对象保存到数据中心的磁盘上之前加密对象,然后在下载对象时对数据进行解密。只要您验证了您的请求并且拥有访问权限,您访问加密和未加密对象的方式就没有区别。设置服务器端加密时,您有三个相互排斥的选项:

  • Amazon S3 托管密钥 (SSE-S3)

  • 存储在 AWS Key Management Service (SSE-KMS) 中的客户主密钥 (CMK)

  • 客户提供的密钥 (SSE-C)

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的使用服务器端加密保护数据

客户端加密是在将数据发送到 Amazon S3 之前加密数据的行为。有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的使用客户端加密保护数据

签名方法

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

有关更多信息,请参阅对请求进行身份验证(AWS 签名版本 4)签名版本 4 签署过程

日志记录和监控

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

  • Amazon CloudWatch

  • AWS CloudTrail

  • Amazon S3 访问日志

  • AWS Trusted Advisor

有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的 Amazon S3 中的日志记录和监控

Amazon S3 与 AWS CloudTrail 集成,后者是一项提供 Amazon S3 中由用户、角色或 AWS 服务所采取操作的记录的服务。此功能可与 Amazon GuardDuty 配对,以通过分析 CloudTrail 管理事件和 CloudTrail S3 数据事件来监控 Amazon S3 资源威胁。这些数据源监控不同类型的活动。例如,与 S3 相关的 CloudTrail 管理事件包括列出或配置 S3 项目的操作。GuardDuty 分析来自您的所有 S3 存储桶的 S3 数据事件,并监控它们是否存在恶意和可疑活动。

有关更多信息,请参阅《Amazon GuardDuty 用户指南》中的 Amazon GuardDuty 中的 Amazon S3 保护