使用来源访问标识 (OAI) 限制对 Amazon S3 内容的访问 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用来源访问标识 (OAI) 限制对 Amazon S3 内容的访问

要限制对您通过 Amazon S3 存储桶提供的内容的访问,请执行以下步骤:

  1. 创建一个称为源访问身份 (OAI) 的特殊 CloudFront 用户,并将该用户与您的分配相关联。

  2. 配置 S3 存储桶权限,以便 CloudFront 能够使用 OAI 访问存储桶中的文件并将这些文件提供给您的用户。确保用户无法使用 S3 存储桶的直接 URL 访问该存储桶中的文件。

执行完这些步骤后,用户只能通过 CloudFront 访问您的文件,而无法直接从 S3 存储桶访问您的文件。

注意

如果您使用 CloudFront 签名 URL 或签名 Cookie 来限制对文件的访问权限,则不应允许查看器能够使用该文件的直接 Amazon S3 URL 查看文件。相反,您希望他们只能通过使用 CloudFront URL 访问文件,以便您的保护起作用。有关使用签名 URL 和签名 Cookie 的详细信息,请参阅使用签名 URL 和签名 Cookie 提供私有内容

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

重要

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

OAI 设置概览

当您首次将 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 OAI 并将其添加到您的分配

  2. 而应更改 Amazon S3 存储桶或存储桶中文件的权限,以确保只有源访问身份具有读取权限。当查看器通过 CloudFront 访问 Amazon S3 文件时,CloudFront 源访问身份将代表查看器获取文件。如果查看器使用 Amazon S3 URL 直接请求文件,它们将会被拒绝访问。源访问身份拥有访问 Amazon S3 存储桶中文件的权限,但查看器不具有。有关更多信息,请参阅 授予 OAI 读取 Amazon S3 存储桶中文件的权限

创建 CloudFront OAI 并将其添加到您的分配

一个 Amazon 账户最多可以拥有 100 个 CloudFront 源访问身份 (OAI)。但是,您可以根据需要将 OAI 添加到任意数量的分配中,因此一个 OAI 通常就足够了。

如果在创建分配时未创建 OAI 并将其添加到您的分配中,您现在可以使用 CloudFront 控制台或 CloudFront API 创建并添加一个 OAI:

创建 OAI 并将其添加到您的分配

如果您在创建分配时未创建 OAI,请执行以下操作。

使用 CloudFront 控制台创建 CloudFront OAI

  1. 登录 Amazon Web Services Management Console,并通过以下网址打开 CloudFront 控制台:https://console.amazonaws.cn/cloudfront/v3/home

  2. 选择具有 S3 源的分配的 ID。

  3. 选择选项卡。

  4. 选择 Amazon S3 源,然后选择编辑

  5. 对于 S3 存储桶访问权限,选择是,使用 OAI

  6. 如果您已拥有要使用的 OAI,请从下拉列表中选择该 OAI。如果您已经拥有 OAI,我们建议您重复使用它以简化维护。

    如果要创建 OAI,请选择创建新身份。如果需要,可以使用自定义名称替换自动生成的 OAI 名称。

  7. 如果您希望 CloudFront 自动更新 Amazon S3 存储桶策略以向 OAI 授予读取访问权限,请选择是,更新存储桶策略

    重要

    如果您选择是,更新存储桶策略,CloudFront 将会更新存储桶权限,以向指定的 OAI 授予读取存储桶中文件的权限。但是,CloudFront 不会删除现有权限。如果用户目前具有使用 Amazon S3 URL 访问存储桶中文件的权限,在 CloudFront 更新存储桶权限后,他们仍具有该权限。要查看或删除现有存储桶权限,使用 Amazon S3 提供的方法。

    如果您希望手动更新对 Amazon S3 存储桶的权限,请选择否,我会更新存储桶策略。有关更多信息,请参阅 授予 OAI 读取 Amazon S3 存储桶中文件的权限

  8. 在页面底部,选择保存更改

  9. 如果您有多个 Amazon S3 源,请为每个源重复这些步骤以添加 OAI。

使用 CloudFront API 创建 OAI

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

要使用 CloudFront API 创建 CloudFront OAI,请使用 CreateCloudFrontOriginAccessIdentity API 操作。对于新的 OAI,响应包括一个 Id 和一个 S3CanonicalUserId。记下这些值,因为在此过程的稍后阶段将会用到它们。有关更多信息,请参阅《Amazon CloudFront API 参考》中的 CreateCloudFrontOriginAccessIdentity

使用 CloudFront API 向您的分配添加 OAI

您可以使用 CloudFront API 将 CloudFront OAI 添加到现有分配或创建包含 OAI 的新分配。在这两种情况下,都包括OriginAccessIdentity元素。该元素包含您创建 OAI 时 CreateCloudFrontOriginAccessIdentity API 操作返回的 Id 元素的值。您可以将 OriginAccessIdentity 元素添加到一个或多个源中。

请参阅《Amazon CloudFront API 参考》中的以下主题:

授予 OAI 读取 Amazon S3 存储桶中文件的权限

当您使用 CloudFront 控制台创建 OAI 或将 OAI 添加到分配时,可以自动更新 Amazon S3 存储桶策略以向 OAI 提供访问存储桶的权限。您也可以选择手动创建或更新存储桶策略。无论使用哪种方法,您仍应查看权限,从而确保:

  • 您的 CloudFront OAI 可以代表通过 CloudFront 发出请求的查看器来访问存储桶中的文件。

  • 查看器不能使用 Amazon S3 URL 访问位于 CloudFront 外部的文件。

重要

如果您将 CloudFront 配置为接受并转发 CloudFront 支持的所有 HTTP 方法,请确保为您的 CloudFront OAI 授予所需的权限。例如,假设您将 CloudFront 配置为接受和转发使用 DELETE 方法的请求,则配置您的存储桶策略以适当地处理 DELETE 请求,从而确保查看器只能删除您希望它们删除的文件。

使用 Amazon S3 存储桶策略

您可以通过以下方式创建或更新 Amazon S3 存储桶策略,向 CloudFront OAI 授予对该存储桶中文件的访问权限:

  • 使用 Amazon S3 控制台中的 Amazon S3 存储桶的权限选项卡。

  • 使用 Amazon S3 API 中的 PutBucketPolicy

  • 使用 CloudFront 控制台。在 CloudFront 控制台中向源设置添加 OAI 时,您可以选择 Yes, update the bucket policy(是,更新存储桶策略),从而让 CloudFront 代表您更新存储桶策略。

如果您手动更新存储桶策略,请务必:

  • 在策略中指定正确的 OAI 为 Principal

  • 授予 OAI 所需的权限以便代表查看器访问对象。

有关更多信息,请参阅以下部分。

在存储桶策略中将 OAI 指定为 Principal

要在 Amazon S3 存储桶策略中将 OAI 指定为 Principal,请使用 OAI 的 Amazon Resource Name (ARN),其中包括 OAI 的 ID。例如:

"Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC" }

在使用上述示例时,将 EH1HDMB1FH2TC 替换为 OAI 的 ID。要查找 OAI 的 ID,请查看 CloudFront 控制台中的 源访问身份页面,或者使用 CloudFront API 中的 ListCloudFrontOriginAccessIdentities

向 OAI 授予权限

要向 OAI 授予对 Amazon S3 存储桶中对象的访问权限,请使用策略中与特定 Amazon S3 API 操作相关的关键字。例如,s3:GetObject 权限允许 OAI 读取存储桶中的对象。有关更多信息,请参阅下一部分的示例,或者参阅《Amazon Simple Storage Service 用户指南》中的 Amazon S3 操作

Amazon S3 存储桶策略示例

以下示例显示了向 CloudFront OAI 授予访问权限的 Amazon S3 存储桶策略。在使用这些示例时:

例 向 OAI 授予读取访问权限的 Amazon S3 存储桶策略

下面的示例允许 OAI 读取指定存储桶 (s3:GetObject) 中的对象。

{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }

例 向 OAI 授予读写访问权限的 Amazon S3 存储桶策略

下面的示例允许 OAI 读取和写入指定存储桶(s3:GetObjects3:PutObject)中的对象。这允许查看器通过 CloudFront 将文件上传到您的 Amazon S3 存储桶。

{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC" }, "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }

使用 Amazon S3 对象 ACL(不建议)

重要

我们建议使用 Amazon S3 存储桶策略向 OAI 提供对 S3 存储桶的访问权限。您也可以按照这一部分的描述使用 ACL,但我们不建议您这样做。

Amazon S3 建议将 bS3 Object Ownership(S3 对象所有权)设置为 bucket owner enforced(强制执行存储桶拥有者),这意味着存储桶以及其中的对象禁用 ACL。当您应用此对象所有权设置后,必须使用存储桶策略向 OAI 授予访问权限(请参阅上一部分)。

以下部分仅适用于需要 ACL 的传统使用案例。

您可以通过以下方式创建或更新文件的 ACL,向 CloudFront OAI 授予对 Amazon S3 存储桶中文件的访问权限:

使用 ACL 向 OAI 授予访问权限时,您必须使用其 Amazon S3 规范用户 ID 来指定 OAI。这是 CloudFront 控制台的源访问身份页面上 Amazon S3 canonical user ID(Amazon S3 规范用户 ID)的值。如果使用 CloudFront API,请使用您在创建 OAI 时返回的 S3CanonicalUserId 元素值,或者调用 CloudFront API 中的 ListCloudFrontOriginAccessIdentities

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

较新的 Amazon S3 区域要求对通过身份验证的请求使用签名版本 4。(有关各个 Amazon S3 区域支持的签名版本,请参阅《Amazon一般参考》中的 Amazon Simple Storage Service 端点和配额。) 如果使用源访问身份并且存储桶位于要求使用签名版本 4 的区域,请注意以下几点:

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

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

  • 不支持 POST 请求。