Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用源访问身份限制对 Amazon S3 内容的访问

要限制访对您从 Amazon S3 存储桶提供的内容的访问,您可以创建 CloudFront 签名 URL 或签名 Cookie 来限制对 Amazon S3 存储桶中文件的访问,然后您可创建称为源访问身份 (OAI) 的特殊 CloudFront 用户并将其与您的分配关联。接下来,您配置权限,以便 CloudFront 可以使用 OAI 来访问和向您的用户提供文件,但用户无法使用指向 S3 存储桶的直接 URL 来访问其中的文件。采取以下步骤来帮助您维护对通过 CloudFront 提供的文件的安全访问。

通常而言,如果您使用的是 Amazon S3 存储桶作为 CloudFront 分配的源,则您可以允许每个人有权访问这些文件,或者可以限制访问。例如,如果通过使用 CloudFront 签名 URL 或签名 Cookie 来限制访问,您还不会希望人员能够只需使用该文件的直接 URL 便可查看文件。相反,您希望他们只能通过使用 CloudFront URL 访问文件,以便您的保护有用。有关使用签名 URL 和签名 Cookie 的详细信息,请参阅使用签名 URL 和已签名的 Cookie 提供私有内容

本主题详细介绍了如何设置 OAI 和授予权限以维护对 S3 文件的安全访问。

重要

如果您使用配置为网站终端节点的 Amazon S3 存储桶,则必须使用 CloudFront 作为自定义源来设置它,而且,您不能使用此主题中描述的源访问身份功能。但是,您可以 通过设置自定义标头和配置源来要求提供标头,限制对自定义源上内容的访问。有关更多信息,请参阅 在自定义源上限制对文件的访问

源访问身份设置概述

当您首次将 Amazon S3 存储桶设置为 CloudFront 分配的源时,将授予每个人读取您存储桶中的文件的权限。这样,任何人都可以通过 CloudFront 或使用 Amazon S3 URL 访问您的文件。CloudFront 不会公开 Amazon S3 URL,但如果应用程序从 Amazon S3 中直接提供任何文件,或有人泄露了 Amazon S3 中的特定文件的直接链接,则用户可能会拥有这些 URL。

如果使用 CloudFront 签名 URL 或签名 Cookie 来限制对 Amazon S3 存储桶中文件的访问权,您可能还需要防止用户使用 Amazon S3 URL 访问 Amazon S3 文件。如果用户直接访问 Amazon S3 中的文件,他们将绕过由 CloudFront 签名 URL 或签名 Cookie 提供的控制,例如,对用户无法继续访问内容的日期和时间的控制,以及对可用于访问内容的 IP 地址的控制。此外,如果用户同时通过 CloudFront 和直接使用 Amazon S3 URL 访问文件,则 CloudFront 访问日志将不完整,因此用处不大。

要确保您的用户只使用 CloudFront URL 访问您的文件,无论此 URL 是否签名,请执行以下操作:

  1. 创建源访问身份(一个特殊的 CloudFront 用户),并将源访问身份与分配相关联。您需要将源访问身份与源关联起来,以便您可以保护您的所有 Amazon S3 内容或者只保护其中一部分内容。您也可在创建分配时创建源访问身份并将其添加到您的分配中。有关更多信息,请参阅创建 CloudFront 源访问身份并将其添加到您的分配中

  2. 更改对您的 Amazon S3 存储桶或存储桶中文件的权限,以便只有源访问身份具有读取权限(或读取和下载权限)。当用户通过 CloudFront 访问 Amazon S3 文件时,CloudFront 源访问身份将代表用户获取文件。如果用户直接通过使用 Amazon S3 URL 请求文件,他们将会被拒绝访问。源访问身份有权访问 Amazon S3 存储桶中的文件,但用户不能。有关更多信息,请参阅授予源访问身份读取 Amazon S3 存储桶中文件的权限

提示

如果您刚开始在 S3 存储桶上设置 CloudFront 和私有内容,阅读以下有关该流程的端到端视图的博客文章会很有帮助:如何使用 S3 和 Amazon CloudFront 设置并提供私有内容

创建 CloudFront 源访问身份并将其添加到您的分配中

一个 AWS 账户最多可拥有 100 个 CloudFront 源访问身份。但是,您可将源访问身份添加到您希望尽可能多的分配中,以使一个源访问身份通常就足够了。

如果在创建分配时未创建源访问身份并将其添加到您的分配中,您现在可以使用 CloudFront 控制台或 CloudFront API 创建并添加源访问身份:

注意

要创建源访问身份,您必须使用 CloudFront 控制台或 CloudFront API 版本 2009-09-09 或更高版本。

创建源访问身份并将其添加到您的分配中

如果您在创建分配时未创建源访问身份,请执行以下操作。

使用 CloudFront 控制台创建 CloudFront 源访问身份。

  1. 登录 AWS 管理控制台,通过以下网址打开 CloudFront 控制台:https://console.amazonaws.cn/cloudfront/

  2. 单击具有 S3 源的分配的 ID,然后选择分配设置

  3. 选择选项卡。

  4. 选择一个源,然后选择 Edit (编辑)

  5. Restrict Bucket Access (限制存储桶访问) 选择

    注意

    如果您未看到 Restrict Bucket Access (限制存储桶访问) 选项,您的 Amazon S3 源可能已配置为网站终端节点。在该配置中,必须使用 CloudFront 将 S3 存储桶设置为自定义源,并且您不能将源访问身份与这些存储桶结合使用。

  6. 如果您已有要使用的源访问身份,请单击 Use an Existing Identity (使用现有身份)。然后选择“Your Identities”列表中的身份。

    注意

    如果您已经具有源访问身份,我们建议您重新使用它来简化维护。

    如果要创建一个身份,请单击创建新的身份。如果您愿意,可以将注释字段中的存储桶名称替换为自定义的描述。

  7. 如果您希望 CloudFront 自动提供读取 Origin Domain Name (源域名) 中指定的 Amazon S3 存储桶中的文件的源访问身份权限,请单击 Yes, Update Bucket Policy (是,更新存储桶策略)

    重要

    如果您选择 Yes, Update Bucket Policy (是,更新存储桶策略),CloudFront 将更新存储桶权限,以授予指定的源访问身份读取存储桶中文件的权限。但是,CloudFront 并没有删除现有权限。如果用户目前具有使用 Amazon S3 URL 访问存储桶中文件的权限,在 CloudFront 更新存储桶权限后,他们仍具有该权限。要查看或删除现有存储桶权限,使用 Amazon S3 提供的方法。有关更多信息,请参阅授予源访问身份读取 Amazon S3 存储桶中文件的权限

    如果您希望手动更新 Amazon S3 存储桶的权限,请选择否,我将更新权限

  8. 选择是,编辑

  9. 如果您拥有多个源,则重复以上步骤为每个源添加源访问身份。

使用 CloudFront API 创建源访问身份

如果您已经具有一个源访问身份并要重新使用它,而不是另外创建一个,请跳到使用 CloudFront API 将源访问身份添加到您的分配中

要使用 CloudFront API 创建 CloudFront 源访问身份,请使用 POST Origin Access Identity API 操作。对于新的源访问身份,响应包括一个 Id 和一个 S3CanonicalUserId。记录这些值,因为在稍后的过程中会用到它们:

  • Id 元素 – 您使用 Id 元素值将源访问 ID 与您的分配相关联。

  • S3CanonicalUserId 元素 – 当您为 CloudFront 授予 Amazon S3 存储桶或文件的访问权时,您可以使用 S3CanonicalUserId 元素值。

有关更多信息,请参阅 Amazon CloudFront API Reference 中的 CreateCloudFrontOriginAccessIdentity

使用 CloudFront API 将源访问身份添加到您的分配中

您可以使用 CloudFront API 将 CloudFront 源访问身份添加到现有分配中,或者创建包含源访问身份的新分配。在这两种情况下,都包括OriginAccessIdentity元素。该元素包含您创建源访问身份时 IdAPI 操作返回的 POST Origin Access Identity 元素的值。您可以将 OriginAccessIdentity 元素添加到一个或多个源中。

请参阅 Amazon CloudFront API Reference 中的以下主题:

授予源访问身份读取 Amazon S3 存储桶中文件的权限

当您创建或更新分配时,可以添加源访问身份并自动更新存储桶策略,以为源访问身份提供访问存储桶的权限。或者,您可选择手动更改存储桶策略或更改控制存储桶中个别文件权限的 ACL。

无论使用哪种方法,您应该仍然可以查看存储桶中的存储桶策略以及查看文件的权限,以确保:

  • CloudFront 可代表通过 CloudFront 请求您的文件的用户访问存储桶中的文件。

  • 用户不能使用 Amazon S3 URL 访问您的文件。

重要

如果您将 CloudFront 配置为接受 CloudFront 支持的所有 HTTP 方法并将这些方法转发到 Amazon S3,请创建一个 CloudFront 源访问身份以限制对 Amazon S3 内容的访问,并为该源访问身份授予所需的权限。例如,如果您由于要使用 PUT 方法而将 CloudFront 配置为接受和转发这些方法,您必须配置 Amazon S3 存储桶策略或 ACL 以相应地处理 DELETE 请求,以便用户无法删除您不希望他们删除的资源。

请注意以下几点:

  • 您可能发现更新 Amazon S3 存储桶策略比 ACL 更容易,因为您可将文件添加到存储桶而无需更新权限。但是,ACL 可以给予您更多细粒度的控制,因为您可授予每个文件的权限。

  • 默认情况下,您的 Amazon S3 存储桶和其中的所有文件都是私有的,—只有创建该存储桶的 AWS 账户有权读取或写入文件。

  • 如果您将源访问身份添加到现有分配中,则视情况修改存储桶策略或任何文件 ACL,以确保文件不是公开可用的。

  • 授予一个或多个安全管理员账户额外的权限,以便您可继续更新 Amazon S3 存储桶的内容。

重要

在保存对 Amazon S3 权限的更改和更改生效之间可能有短暂的延迟。在更改生效之前,尝试访问存储桶中的文件时可能会得到权限被拒绝错误。

更新 Amazon S3 存储桶策略

您可使用 AWS 管理控制台或 Amazon S3 API 更新 Amazon S3 存储桶政策:

  • 向 CloudFront 源访问身份授予对存储桶的所需权限。

    要指定源访问身份,请使用 CloudFront 控制台中的源访问身份页面上的 Amazon S3 规范用户 ID 的值。如果使用 CloudFront API,请使用在创建源访问身份时返回的 S3CanonicalUserId 元素值。

  • 拒绝您不希望有权使用 Amazon S3 URL 访问的任何人。

有关更多信息,请转到 Amazon Simple Storage Service 开发人员指南 中的使用存储桶策略和用户策略

有关示例,请参阅同样位于 Amazon Simple Storage Service 开发人员指南 中的存储桶策略示例主题中的“为 Amazon CloudFront 源标识授予权限”。

更新 Amazon S3 ACL

使用 AWS 管理控制台或 Amazon S3 API 更改 Amazon S3 ACL:

  • 向 CloudFront 源访问身份授予对 CloudFront 分配提供的每个文件的所需权限。

    要指定源访问身份,请使用 CloudFront 控制台中的源访问身份页面上的 Amazon S3 规范用户 ID 的值。如果使用 CloudFront API,请使用在创建源访问身份时返回的 S3CanonicalUserId 元素值。

  • 拒绝您不希望有权使用 Amazon S3 URL 访问的任何人。

如果另一个 AWS 账户将文件上传到您的存储桶,则该账户是这些文件的所有者。存储桶策略仅适用于存储桶拥有者所拥有的文件。这就意味着,如果另一账户将文件上传到您的存储桶,将不会针对这些文件评估由您为您的 OAI 创建的存储桶策略。

有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的使用 ACL 管理访问

你还可使用 AWS 开发工具包之一通过编程方式更改 ACL。例如,请参阅使用 C# 和 .NET Framework 创建 URL 签名中可下载的示例代码。

在仅支持签名版本 4 身份验证的 Amazon S3 区域中使用源访问身份

较新的 Amazon S3 区域要求对通过身份验证的请求使用签名版本 4。(有关在每个 Amazon S3 区域中支持的签名版本,请参阅 Amazon Web Services 一般参考区域和终端节点主题中的 Amazon Simple Storage Service (S3)。) 不过,如果您创建源访问身份并将其添加到 CloudFront 分配中,在请求您的 Amazon S3 存储桶中的文件时,CloudFront 通常使用签名版本 4 进行身份验证。如果使用源访问身份并且存储桶位于要求使用签名版本 4 进行身份验证的区域之一,请注意以下几点:

  • 支持 DELETEGETHEADOPTIONSPATCH 请求,无限定条件。

  • 如果要将 PUT 请求提交到 CloudFront 以将文件上传到 Amazon S3 存储桶,您必须在请求中添加 x-amz-content-sha256 标头,并且标头值必须包含请求主体的 SHA256 哈希值。有关更多信息,请参阅 Amazon Simple Storage Service API Reference 中的常见请求标头页面上有关 x-amz-content-sha256 标头的文档。

  • 不支持 POST 请求。