访问控制最佳实践
Amazon S3 提供了各种安全功能和工具。以下方案应作为您在执行特定任务或在特定环境中操作时可能需要使用哪些工具和设置的指南。正确应用这些工具有助于维护数据的完整性,并有助于确保目标用户可以访问您的资源。
创建新存储桶
创建新存储桶时,您应该应用以下工具和设置来帮助确保 Amazon S3 资源受到保护。
S3 Object Ownership 用于简化访问控制
S3 Object Ownership 是 Amazon S3 存储桶级设置,您可以使用它禁用访问控制列表 (ACL) 并获取存储桶中每个对象的所有权,从而简化了对存储在 Amazon S3 中的数据的访问管理。预设情况下,当另一个 Amazon Web Services 账户 将对象上载到您的 S3 存储桶,该账户(对象编写者)拥有该对象,拥有对象的访问权限,并可以授予其他用户通过 ACL 访问该数据元的权限。您可以使用对象所有权来更改此原定设置行为,以便禁用 ACL,并且作为存储桶拥有者,您可以自动拥有存储桶中的每个对象。因此,数据的访问控制基于策略,例如 IAM 策略、S3 存储桶策略、Virtual Private Cloud (VPC) 终端节点策略和 Amazon Organizations 服务控制策略 (SCP)。
Object Ownership 有三个设置,您可以使用它来控制上载到存储桶的对象的所有权,并禁用或启用 ACL:
已禁用 ACL
-
强制存储桶拥有者(推荐)— ACL 被禁用,存储桶拥有者自动拥有并完全控制存储桶中的每个对象。ACL 不再影响 S3 存储桶中对数据的权限。存储桶专门使用策略来定义访问控制。
已启用 ACL
-
Bucket owner preferred(首选存储桶拥有者)— 存储桶拥有者拥有并完全控制其他账户使用
bucket-owner-full-control
标准 ACL 写入存储桶的新对象。 -
对象写入器(原定设置)— 该 Amazon Web Services 账户 上载对象拥有该对象,对其拥有完全控制权,并且可以通过 ACL 授予其他用户访问该对象的权限。
有关更多信息,请参阅为您的存储桶控制对象所有权和禁用 ACL。。
阻止公有访问
S3 阻止公有访问提供四种设置,以帮助您避免无意中公开 S3 资源。您可以任意组合将这些设置应用于单个访问点、存储桶或整个 Amazon Web Services 账户。如果您将某一设置应用于某个账户,则该设置将应用于该账户拥有的所有存储桶和访问点。默认情况下,Block all public access (阻止所有公有访问) 设置应用于在 Amazon S3 控制台中创建的新存储桶。
有关更多信息,请参阅 “公有”的含义。
如果“S3 阻止公有访问”设置限制性太强,则可以使用 Amazon Identity and Access Management (IAM) 身份向特定用户授予访问权限,而不是禁用所有“阻止公有访问”设置。将“阻止公有访问”与 IAM 身份结合使用,有助于确保被“阻止公有访问”设置阻止的任何操作都会被拒绝,除非已向发出请求的用户授予特定权限。
有关更多信息,请参阅 阻止公有访问设置。
使用 IAM 身份授予访问权限
为需要 S3 访问权限的新团队成员设置账户时,请使用 IAM 用户和角色来确保最低权限。还可以实施一种形式的 IAM 多重验证 (MFA) 来支持强大的身份基础。使用 IAM 身份,您可以向用户授予独特的权限,并指定用户可以访问哪些资源以及他们可以执行什么操作。IAM 身份提供了增强的功能,此类功能包括要求用户在访问共享资源之前先输入登录凭证,并将权限层次结构应用于单个存储桶中的不同对象。
有关更多信息,请参阅 示例 1:存储桶拥有者向其用户授予存储桶权限 。
存储桶策略
通过存储桶策略,您可以对存储桶访问进行个性化设置,以帮助确保只有那些已批准的用户才能访问资源并在其中执行操作。除了存储桶策略之外,还应使用存储桶级别的“阻止公有访问”设置来进一步限制对数据的公有访问。
有关更多信息,请参阅使用存储桶策略。
创建策略时,请避免在 Principal
元素中使用通配符,因为它有效地允许任何人访问您的 Amazon S3 资源。更佳的方法是明确列出允许访问存储桶的用户或组。在适用的情况下向他们授予特定权限,而不是包含通配符来执行其操作。
为进一步保持最低权限的做法,Effect
元素中的 Deny
语句应尽可能宽泛,而 Allow
语句应尽可能受限。与“s3:*
”操作配对的 Deny
效果是为策略条件语句中包含的用户实现选择加入最佳实践的另一个好方法。
有关指定策略生效的条件的更多信息,请参阅Amazon S3 条件键示例。
VPC 设置中的存储桶
在企业设置中添加用户时,您可以使用 Virtual Private Cloud (VPC) 终端节点来允许虚拟网络中的任何用户访问您的 Amazon S3 资源。VPC 终端节点使开发人员能够根据用户所连接的网络为用户组提供特定的访问权限。如果请求不是源自指定的终端节点,您可以使用 VPC 终端节点拒绝存储桶访问,而不是将每个用户添加到 IAM 角色或组。
有关更多信息,请参阅 使用存储桶策略控制从 VPC 端点的访问。
存储和共享数据
使用以下工具和最佳实践来存储和共享您的 Amazon S3 数据。
版本控制和对象锁定以实现数据完整性
如果您使用 Amazon S3 控制台管理存储桶和对象,则应实现 S3 版本控制和 S3 对象锁定。这些功能有助于防止意外地更改关键数据,并使您能够回滚意料之外的操作。当有多个具有完全写入和执行权限的用户访问 Amazon S3 控制台时,此功能特别有用。
有关 S3 版本控制的信息,请参阅在 S3 存储桶中使用版本控制。有关对象锁定的信息,请参阅使用 S3 对象锁定。
对象生命周期管理以实现成本效率
要管理您的对象以使其在整个生命周期内经济高效地进行存储,您可以将生命周期策略与对象版本控制配对。生命周期策略定义您希望 S3 在对象的生命周期内执行的操作。例如,您可以创建一个生命周期策略,该策略将对象转换为另一个存储类别,存档对象,或在指定时间段后删除它们。您可以使用共享前缀或标签为存储桶中的所有对象或一部分对象定义生命周期策略。
有关更多信息,请参阅 管理存储生命周期。
针对多个办公地点的跨区域复制
创建可由不同办公地点访问的存储桶时,应考虑实施 S3 跨区域复制。跨区域复制有助于确保所有用户都能访问他们所需的资源,并提高操作效率。跨区域复制通过跨不同 Amazon Web Services 区域 中的 S3 存储桶复制对象,提高了可用性。但是,使用此工具会增加存储成本。
有关更多信息,请参阅 复制对象。
安全静态网站托管的权限
将存储桶配置为用作公开访问的静态网站时,您必须禁用所有“阻止公有访问”设置。在为静态网站编写存储桶策略时,务必仅提供 s3:GetObject
操作而非 ListObject
或 PutObject
权限。这有助于确保用户无法查看存储桶中的所有对象或添加自己的内容。
有关更多信息,请参阅 设置访问网站的权限。
Amazon CloudFront 提供了设置安全静态网站所需的功能。Amazon S3 静态网站仅支持 HTTP 终端节点。CloudFront 使用 Amazon S3 的持久存储,同时提供额外的安全标头,如 HTTPS。HTTPS 通过加密正常 HTTP 请求并防范常见的网络攻击来增强安全性。
有关更多信息,请参阅《Amazon CloudFront 开发人员指南》中的安全静态网站入门。
共享资源
您可以通过多种不同的方式与特定用户组共享资源。您可以使用以下工具将一组文档或其他资源共享给单个用户、部门或办公室。尽管它们都可以用来实现相同的目标,但某些工具可能比其他工具更好地与您的现有设置配对。
S3 对象所有权
S3 对象所有权是 Amazon S3 存储桶级设置,您可以使用它禁用 ACL 并获取存储桶中每个对象的所有权,从而简化了对存储在 Amazon S3 中的数据的访问管理。预设情况下,当另一个 Amazon Web Services 账户 将对象上载到您的 S3 存储桶,该账户(对象编写者)拥有该对象,拥有对象的访问权限,并可以授予其他用户通过 ACL 访问该数据元的权限。您可以使用对象所有权来更改此原定设置行为,以便禁用 ACL,并且作为存储桶拥有者,您可以自动拥有存储桶中的每个对象。因此,数据的访问控制基于策略。有关更多信息,请参阅为您的存储桶控制对象所有权和禁用 ACL。。
用户策略
您可以使用 IAM 组和用户策略与有限的一组用户共享资源。创建新的 IAM 用户时,系统会提示您创建这些用户并将其添加到组中。但是,您可以随时创建用户并将其添加到组。如果您打算与之共享这些资源的各用户已在 IAM 中设置,则可以将他们添加到公共组,并在用户策略中与他们的组共享存储桶。还可以使用 IAM 用户策略共享存储桶中的各个对象。
有关更多信息,请参阅 允许 IAM 用户访问某个存储桶。
访问控制列表
作为一般规则,我们建议您使用 S3 存储桶策略或 IAM 策略进行访问控制。Amazon S3 ACL 是 Amazon S3 中早于 IAM 的原始访问控制机制。如果您已经使用 S3 ACL 并且发现它们足够,则无需更改。但是,某些访问控制方案要求使用 ACL。例如,当存储桶拥有者想要向对象授予权限,但并非所有对象都归存储桶拥有者所拥有时,对象所有者必须首先向存储桶拥有者授予权限。这是使用对象 ACL 完成的。
Amazon S3 中的大多数现代使用案例不再需要使用 ACL,我们建议您禁用 ACL,除非在必须单独控制每个对象的访问的异常情况下。使用对象所有权,您可以禁用 ACL 并依赖策略进行访问控制。禁用 ACL 时,您可以轻松通过不同的 Amazon Web Services 账户 上载的对象维护存储桶。作为存储桶拥有者,您拥有存储桶中的所有对象,并可以使用策略管理对它们的访问。
如果您的存储桶使用存储桶拥有者强制执行的 S3 Object Ownership 设置,则必须使用策略授予对存储桶及其中对象的访问权限。设置 ACL 或更新 ACL 的请求失败并返回 AccessControlListNotSupported
错误代码。仍然支持读取 ACL 的请求。
有关 ACL 的更多信息,请参阅 示例 3:存储桶拥有者授予不属于自己的对象的权限。
前缀
尝试共享存储桶中的特定资源时,您可以使用前缀复制文件夹级别的权限。Amazon S3 控制台支持将文件夹概念作为通过为对象使用共享的名称前缀而对对象进行分组的一种方式。然后,您可以在 IAM 用户策略的条件中指定前缀,以向他们授予访问与该前缀关联的资源的明确权限。
有关更多信息,请参阅使用文件夹在 Amazon S3 控制台中组织对象。
Tagging
如果您使用对象标签对存储进行分类,则可以与指定的用户共享已使用特定值标记的对象。通过资源标签,您可以根据与用户尝试访问的资源相关联的标签来控制对对象的访问。要执行此操作,请使用 IAM 用户策略中的 ResourceTag/key-name
条件以允许访问贴标签的资源。
有关更多信息,请参阅《IAM 用户指南》中的使用资源标签控制对 Amazon 资源的访问。
保护数据
使用以下工具来帮助保护传输中的数据和静态数据,这两者对于保持数据的完整性和可访问性至关重要。
Object encryption
Amazon S3 提供了多种对象加密选项,用于保护传输中的数据和静态数据。服务器端加密在将对象保存到数据中心的磁盘上之前加密对象,然后在下载对象时对数据进行解密。只要您验证了您的请求并且拥有访问权限,您访问加密和未加密对象的方式就没有区别。设置服务器端加密时,您有三个相互排斥的选项:
-
具有 Amazon S3 托管式密钥的服务器端加密 (SSE-S3)
-
具有 Amazon Key Management Service (Amazon KMS) 密钥的服务器端加密 (SSE-KMS)
-
使用客户提供的密钥进行服务器端加密 (SSE-C)
有关更多信息,请参阅使用服务器端加密保护数据。
客户端加密是在将数据发送到 Amazon S3 之前加密数据的行为。有关更多信息,请参阅 使用客户端加密保护数据。
签名方法
签名版本 4 是将身份验证信息添加到通过 HTTP 发送的 Amazon 请求的过程。出于安全考虑,大多数 Amazon 请求都必须使用访问密钥(包括访问密钥 ID 和秘密访问密钥)进行签名。这两个密钥通常称为您的安全凭证。
有关更多信息,请参阅对请求进行身份验证 (Amazon Signature Version 4) 和 Signature Version 4 签名过程。
日志记录和监控
监控是维护 Amazon S3 解决方案的可靠性、可用性和性能的重要组成部分,以便在发生多点故障时,您可以更轻松地调试多点故障。日志记录可以帮助您深入了解用户收到的任何错误,以及何时发出了什么样的请求。Amazon 提供了几种用于监控 Amazon S3 资源的工具:
-
Amazon CloudWatch
-
Amazon CloudTrail
-
Amazon S3 访问日志
-
Amazon Trusted Advisor
有关更多信息,请参阅 Amazon S3 中的日志记录和监控。
Amazon S3 与 Amazon CloudTrail 集成,后者是在 Amazon S3 中提供用户、角色或 Amazon 服务所采取操作的记录的服务。此功能可与 Amazon GuardDuty 配对,以通过分析 CloudTrail 管理事件和 CloudTrail S3 数据事件来监控 Amazon S3 资源威胁。这些数据源监控不同类型的活动。例如,与 S3 相关的 CloudTrail 管理事件包括列出或配置 S3 项目的操作。GuardDuty 分析来自您的所有 S3 存储桶的 S3 数据事件,并监控它们是否存在恶意和可疑活动。
有关更多信息,请参阅《Amazon GuardDuty 用户指南》中的 Amazon GuardDuty 中的 Amazon S3 保护。