

# 限制对 Amazon S3 源的访问
<a name="private-content-restricting-access-to-s3"></a>

CloudFront 提供两种向 Amazon S3 源发送经身份验证的请求的方式：*源访问控制（OAC）*和*源访问身份* (OAI)。OAC 有助于您保护源（如 Amazon S3）。

我们*建议*您改用 OAC，因为它支持以下功能：
+ AWS 区域 中的所有 Amazon S3 存储桶，包括 2022 年 12 月之后推出的选择加入区域
+ Amazon S3 [使用 AWS KMS 的服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html) (SSE-KMS)
+ 对 Amazon S3 的动态请求（`PUT` 和 `DELETE`）

OAI 不支持这些功能，或者在这些情况下需要额外的解决方法。如果您已经在使用 OAI 并想要迁移，请参阅[从源访问身份 (OAI) 迁移到源访问控制（OAC）](#migrate-from-oai-to-oac)。

**注意**  
当您将 CloudFront OAC 与 Amazon S3 存储桶来源一起使用时，必须将 **Amazon S3 对象所有权**设置为**强制存储桶拥有者**，这是新 Amazon S3 存储桶的默认值。如果您需要 ACL，请使用**存储桶拥有者优先**设置来控制通过 CloudFront 上传的对象。
如果您的源是配置为[网站端点](https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteEndpoints.html)的 Amazon S3 存储桶，则必须使用 CloudFront 将其设置为自定义源。这意味着您无法使用 OAC（或 OAI）。OAC 不支持使用 Lambda@Edge 进行源重定向。

以下主题介绍了如何将 OAC 与 Amazon S3 源配合使用。

**主题**
+ [创建新的源访问控制](#create-oac-overview-s3)
+ [删除将其 OAC 附加到 S3 存储桶的分配](#delete-oac-distribution-s3)
+ [从源访问身份 (OAI) 迁移到源访问控制（OAC）](#migrate-from-oai-to-oac)
+ [源访问控制的高级设置](#oac-advanced-settings-s3)

## 创建新的源访问控制
<a name="create-oac-overview-s3"></a>

完成以下主题中描述的步骤，在 CloudFront 中设置新的源访问控制。

**Topics**
+ [

### 先决条件
](#oac-prerequisites-s3)
+ [

### 向 CloudFront 授予访问 S3 存储桶的权限
](#oac-permission-to-access-s3)
+ [

### 创建源访问控制
](#create-oac-s3)

### 先决条件
<a name="oac-prerequisites-s3"></a>

在创建和设置源访问控制（OAC）之前，您必须拥有带有 Amazon S3 存储桶源的 CloudFront 分配。此源必须是常规 S3 存储桶，而不是配置为[网站端点](https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteEndpoints.html)的存储桶。有关设置 CloudFront 分配与 S3 存储桶源配合使用的更多信息，请参阅[开始使用 CloudFront 标准分配](GettingStarted.SimpleDistribution.md)。

**重要**  
当您使用 OAC 保护 Amazon S3 源时，CloudFront 和 Amazon S3 之间的通信*始终* 通过 HTTPS 进行，但前提是您选择*始终签署请求*。您必须在控制台中选择**签署请求（推荐）**，或者在 CloudFront API、AWS CLI 或 CloudFormation 中指定 `always`。  
如果您改为选择**请勿签署请求**或**请勿覆盖授权标头**选项，则 CloudFront 将使用您在以下策略中指定的连接协议：  
[查看器协议策略](using-https-viewers-to-cloudfront.md) 
[源协议策略](DownloadDistValuesOrigin.md#DownloadDistValuesOriginProtocolPolicy)（仅自定义源）
例如，如果您选择**请勿覆盖授权标头**，并希望在 CloudFront 和 Amazon S3 源之间使用 HTTPS，请为[查看器协议策略](using-https-viewers-to-cloudfront.md)使用**将 HTTP 重定向到 HTTPS** 或**仅 HTTPS**。

### 向 CloudFront 授予访问 S3 存储桶的权限
<a name="oac-permission-to-access-s3"></a>

在 CloudFront 分配中创建来源访问控制（OAC）或对其设置之前，请确保 CloudFront 具有访问 S3 存储桶源的权限。请在创建 CloudFront 分配后，但在分配配置中将 OAC 添加到 S3 源之前，执行此操作。

使用 S3 [存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)来支持 CloudFront 服务主体 (`cloudfront.amazonaws.com`) 访问存储桶。使用策略中的 `Condition` 元素，仅在请求代表包含 S3 源的 CloudFront 分配时，才允许 CloudFront 访问存储桶。这是要向其添加 OAC 的具有 S3 源的分配。

有关添加或修改存储桶策略的信息，请参阅 *Amazon S3 用户指南* 中的[使用 Amazon S3 控制台添加存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)。

以下是支持启用了 OAC 的 CloudFront 分配访问 S3 源的 S3 存储桶策略示例。

**Example 支持启用了 OAC 的 CloudFront 分配进行只读访问的 S3 存储桶策略**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCloudFrontServicePrincipalReadOnly",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>"
        }
      }
    }
  ]
}
```

**Example 支持启用了 OAC 的 CloudFront 分配进行读写访问的 S3 存储桶策略**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCloudFrontServicePrincipalReadWrite",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/CloudFront-distribution-ID>"
        }
      }
    }
  ]
}
```

#### SSE-KMS
<a name="oac-permissions-sse-kms"></a>

如果 S3 存储桶源中的对象是通过[具有 AWS Key Management Service 的服务器端加密（SSE-KMS）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)进行加密的，您必须确保 CloudFront 分配具有使用 AWS KMS 密钥的权限。要向 CloudFront 分配授予使用 KMS 密钥的权限，请向 [KMS 密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)中添加一条语句。有关如何修改密钥策略的信息，请参阅 *AWS Key Management Service 开发人员指南* 中的[更改密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html)。

**Example KMS 密钥政策语句：**  
以下示例显示了一条 AWS KMS 策略语句，该语句支持具有 OAC 的 CloudFront 分配访问 KMS 密钥来实施 SSE-KMS。  

```
{
    "Sid": "AllowCloudFrontServicePrincipalSSE-KMS",
    "Effect": "Allow",
    "Principal": {
        "Service": [
            "cloudfront.amazonaws.com"
        ]
     },
    "Action": [
        "kms:Decrypt",
        "kms:Encrypt",
        "kms:GenerateDataKey*"
    ],
    "Resource": "*",
    "Condition": {
            "StringEquals": {
                "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>"
            }
        }
}
```

### 创建源访问控制
<a name="create-oac-s3"></a>

要创建源访问控制（OAC），可以使用 AWS 管理控制台、CloudFormation、AWS CLI 或 CloudFront API。

------
#### [ Console ]

**创建源访问控制**

1. 登录 AWS 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 在导航窗格中，选择 **Origin access**（源访问）。

1. 选择 **Create control setting**（创建控制设置）。

1. 在 **Create control setting**（创建控制设置）表单上，执行以下操作：

   1. 在 **Details**（详细信息）窗格中，输入源访问控制的 **Name**（名称）和（可选）**Description**（描述）。

   1. 在 **Settings**（设置）中，建议保留默认设置 [**Sign requests (recommended)**（签署请求（推荐））]。有关更多信息，请参阅 [源访问控制的高级设置](#oac-advanced-settings-s3)。

1. 从 **Origin type**（源类型）下拉列表中选择 S3。

1. 选择**创建**。

   创建 OAC 后，记下 **Name**（名称）。在以下过程中，您需要此名称。

**向分配中的 S3 源添加源访问控制**

1. 通过以下网址打开 CloudFront 控制台：[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 选择具有要向其添加 OAC 的 S3 源的分配，然后选择 **Origins**（源）选项卡。

1. 选择要向其添加 OAC 的 S3 源，然后选择**编辑**。

1. 在**源访问**部分，选择**源访问控制设置（推荐）**。

1. 从**源访问控制**下拉菜单中，选择要使用的 OAC。

1. 选择**保存更改**。

分配开始部署到所有 CloudFront 边缘站点。当边缘站点收到新配置时，它会签署其发送到 S3 存储桶源的所有请求。

------
#### [ CloudFormation ]

要使用 CloudFormation 创建源访问控制（OAC），请使用 `AWS::CloudFront::OriginAccessControl` 资源类型。以下示例显示了 YAML 格式的 CloudFormation 模板语法，用于创建源访问控制。

```
Type: AWS::CloudFront::OriginAccessControl
Properties: 
  OriginAccessControlConfig: 
      Description: An optional description for the origin access control
      Name: ExampleOAC
      OriginAccessControlOriginType: s3
      SigningBehavior: always
      SigningProtocol: sigv4
```

有关更多信息，请参阅 *AWS CloudFormation 用户指南* 中的 [AWS::CloudFront::OriginAccessControl](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-originaccesscontrol.html)。

------
#### [ CLI ]

要使用 AWS Command Line Interface (AWS CLI) 创建源访问控制，请使用 **aws cloudfront create-origin-access-control** 命令。您可以使用输入文件来提供命令的输入参数，而不是将每个单独的参数指定为命令行输入。

**创建源访问控制（带输入文件的 CLI）**

1. 使用以下命令创建名为 `origin-access-control.yaml` 的文件。此文件包含 **create-origin-access-control** 命令的所有输入参数。

   ```
   aws cloudfront create-origin-access-control --generate-cli-skeleton yaml-input > origin-access-control.yaml
   ```

1. 打开刚创建的 `origin-access-control.yaml` 文件。编辑文件以添加 OAC 的名称、描述（可选），然后将 `SigningBehavior` 更改为 `always`。然后保存文件。

   有关其他 OAC 设置的信息，请参阅[源访问控制的高级设置](#oac-advanced-settings-s3)。

1. 使用以下命令通过 `origin-access-control.yaml` 文件中的输入参数创建源访问控制。

   ```
   aws cloudfront create-origin-access-control --cli-input-yaml file://origin-access-control.yaml
   ```

   记下命令输出中的 `Id` 值。您需要使用它将 OAC 添加到 CloudFront 分配中的 S3 存储桶源。

**将 OAC 附加到现有分配中的 S3 存储桶源（带输入文件的 CLI）**

1. 使用以下命令保存要向其添加 OAC 的 CloudFront 分配的分配配置。该分配必须有 S3 存储桶源。

   ```
   aws cloudfront get-distribution-config --id <CloudFront distribution ID> --output yaml > dist-config.yaml
   ```

1. 打开刚创建的名为 `dist-config.yaml` 的文件。编辑文件，进行以下更改：
   + 在 `Origins` 对象中，将 OAC 的 ID 添加到名为 `OriginAccessControlId` 的字段中。
   + 从名为 `OriginAccessIdentity` 的字段中移除值（如果存在）。
   + 将 `ETag` 字段重命名为 `IfMatch`，但不更改字段的值。

   完成后保存该文件。

1. 使用以下命令更新分配以使用源访问控制。

   ```
   aws cloudfront update-distribution --id <CloudFront distribution ID> --cli-input-yaml file://dist-config.yaml
   ```

分配开始部署到所有 CloudFront 边缘站点。当边缘站点收到新配置时，它会签署其发送到 S3 存储桶源的所有请求。

------
#### [ API ]

要使用 CloudFront API 创建源访问控制，请使用 [CreateOriginAccessControl](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateOriginAccessControl.html)。有关您在此 API 调用中指定的字段的更多信息，请参阅 AWS 开发工具包或其他 API 客户端的 API 参考文档。

创建源访问控制后，可以使用下面的任何一个 API 调用将其附加到分配中的 S3 存储桶源：
+ 要将它附加到现有分配，请使用 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。
+ 要将它附加到新分配，请使用 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)。

对于这两个 API 调用，请在源内的 `OriginAccessControlId` 字段中提供源访问控制 ID。有关您在这些 API 调用中指定的其他字段的更多信息，请参阅 [所有分配设置参考](distribution-web-values-specify.md) 以及有关 AWS SDK 或其他 API 客户端的 API 参考文档。

------

## 删除将其 OAC 附加到 S3 存储桶的分配
<a name="delete-oac-distribution-s3"></a>

如果您需要删除将其 OAC 附加到 S3 存储桶的分配，则应首先删除该分配，然后再删除 S3 存储桶源。或者，在源域名中包含该区域。如果无法做到这一点，则可以在删除之前切换到公共模式以便从分配中删除 OAC。有关更多信息，请参阅 [删除分配](HowToDeleteDistribution.md)。

## 从源访问身份 (OAI) 迁移到源访问控制（OAC）
<a name="migrate-from-oai-to-oac"></a>

要从旧式来源访问身份（OAI）迁移到来源访问控制（OAC），请先更新 S3 存储桶源，以支持 OAI 和启用了 OAC 的分配访问存储桶的内容。这可确保 CloudFront 在过渡期间不会丢失对存储桶的访问权限。要支持 OAI 和启用了 OAC 的分配访问 S3 存储桶，请更新[存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)来包括两条语句，每种主体对应于一条语句。

以下示例 S3 存储桶策略支持 OAI 和启用了 OAC 的分配访问 S3 源。

**Example 支持 OAI 和启用了 OAC 的 CloudFront 分配进行只读访问的 S3 存储桶策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipalReadOnly",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<S3 bucket name>/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>"
                }
            }
        },
        {
            "Sid": "AllowLegacyOAIReadOnly",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<S3 bucket name>/*"
        }
    ]
}
```

在更新 S3 源的存储桶策略以允许访问 OAI 和 OAC 之后，您可以更新分配配置以使用 OAC（而不是 OAI）。有关更多信息，请参阅 [创建新的源访问控制](#create-oac-overview-s3)。

完全部署分配后，您可以删除存储桶策略中允许访问 OAI 的语句。有关更多信息，请参阅 [向 CloudFront 授予访问 S3 存储桶的权限](#oac-permission-to-access-s3)。

## 源访问控制的高级设置
<a name="oac-advanced-settings-s3"></a>

CloudFront 源访问控制特征包括仅适用于特定使用案例的高级设置。除非您特别需要高级设置，否则请使用推荐的设置。

源访问控制包含一个名为 **Signing behavior**（签名行为）（在控制台中）或 `SigningBehavior`（在 API、CLI 和 CloudFormation）的设置。此设置提供以下选项：

**始终签署源请求（推荐设置）**  
我们建议使用此设置，此设置在控制台中名为 **Sign requests (recommended)** [签署请求（推荐）]，在 API、CLI 和 CloudFormation 中名为 `always`。使用此设置，CloudFront 将始终签署其发送到 S3 存储桶源的所有请求。

**切勿签署源请求**  
此设置在控制台中名为 **Do not sign requests**（请勿签署请求），在 API、CLI 和 CloudFormation 中名为 `never`。使用此设置关闭所有使用此源访问控制的分配中所有源的源访问控制。与从所有使用源访问控制的源和分配中逐一删除源访问控制相比，这可以节省时间和精力。使用此设置，CloudFront 不会签署其发送到 S3 存储桶源的任何请求。  
要使用此设置，S3 存储桶源必须可公开访问。如果您将此设置用于不可公开访问的 S3 存储桶源，则 CloudFront 无法访问该源。S3 存储桶源向 CloudFront 返回错误，而 CloudFront 会将这些错误传递给查看器。

**不要改写查看器（客户端）`Authorization` 标头**  
此设置在控制台中名为 **Do not override authorization header**（请勿改写授权标头），在 API、CLI 和 CloudFormation 中名为 `no-override`。如果您希望 CloudFront 仅在相应的查看器请求不包含 `Authorization` 标头时签署源请求，请使用此设置。使用此设置，CloudFront 会在查看器请求中存在 `Authorization` 标头时传递该标头，但在查看器请求不包含 `Authorization` 标头时对源请求进行签名（添加自己的 `Authorization` 标头）。  
要传递查看器请求的 `Authorization` 标头，您*必须* 针对所有使用与此源访问控制关联的 S3 存储桶源的缓存行为将 `Authorization` 标头添加到[缓存策略](controlling-the-cache-key.md)中。

## 使用源访问身份（旧版，不推荐）
<a name="private-content-restricting-access-to-s3-oai"></a>

### 源访问身份概述
<a name="private-content-restricting-access-to-s3-overview"></a>

CloudFront *源访问身份* (OAI) 提供与*源访问控制（OAC）*类似的功能，但它并不适用于所有场景。具体而言，OAI 不支持：
+ 所有 AWS 区域中的 Amazon S3 存储桶，包括可选择加入的区域
+ Amazon S3 [使用 AWS KMS 的服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html) (SSE-KMS)
+ 对 Amazon S3 的动态请求（`PUT`、`POST` 或 `DELETE`）
+ 2023 年 1 月之后推出的新 AWS 区域

**提示**  
我们建议您改用 OAC。要设置 OAC，请参阅[创建新的源访问控制](#create-oac-overview-s3)。有关如何从 OAI 迁移到 OAC 的信息，请参阅[从源访问身份 (OAI) 迁移到源访问控制（OAC）](#migrate-from-oai-to-oac)。

### 授予源访问身份读取 Amazon S3 存储桶中文件的权限
<a name="private-content-granting-permissions-to-oai"></a>

当您使用 CloudFront 控制台创建 OAI 或将 OAI 添加到分配时，可以自动更新 Amazon S3 存储桶策略以向 OAI 提供访问存储桶的权限。您也可以选择手动创建或更新存储桶策略。无论使用哪种方法，您仍应查看权限，从而确保：
+ 您的 CloudFront OAI 可以代表通过 CloudFront 发出请求的查看器来访问存储桶中的文件。
+ 查看器不能使用 Amazon S3 URL 访问位于 CloudFront 外部的文件。

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

#### 使用 Amazon S3 存储桶策略
<a name="private-content-updating-s3-bucket-policies"></a>

您可以通过以下方式创建或更新 Amazon S3 存储桶策略，向 CloudFront OAI 授予对该存储桶中文件的访问权限：
+ 使用 [Amazon S3 控制台](https://console.aws.amazon.com/s3/home)中 Amazon S3 存储桶的 **Permissions**（权限）选项卡。
+ 使用 Amazon S3 API 中的 [PutBucketPolicy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketPolicy.html)。
+ 使用 [CloudFront 控制台](https://console.aws.amazon.com/cloudfront/v4/home)。在 CloudFront 控制台中向源设置添加 OAI 时，您可以选择 **Yes, update the bucket policy**（是，更新存储桶策略），从而让 CloudFront 代表您更新存储桶策略。

如果您手动更新存储桶策略，请务必：
+ 在策略中指定正确的 OAI 为 `Principal`。
+ 授予 OAI 所需的权限以便代表查看器访问对象。

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

##### 在存储桶策略中将 OAI 指定为 `Principal`
<a name="private-content-updating-s3-bucket-policies-principal"></a>

要在 Amazon S3 存储桶策略中将 OAI 指定为 `Principal`，请使用 OAI 的 Amazon 资源名称 (ARN)，其中包括 OAI 的 ID。例如：

```
"Principal": {
    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>"
}
```

在 CloudFront 控制台的**安全**、**源访问**、**身份（遗留）**下找到 OAI ID。或者，在 CloudFront API 中使用 [ListCloudFrontOriginAccessIdentities](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListCloudFrontOriginAccessIdentities.html)。

##### 向 OAI 授予权限
<a name="private-content-updating-s3-bucket-policies-permissions"></a>

要向 OAI 授予对 Amazon S3 存储桶中对象的访问权限，请使用策略中与特定 Amazon S3 API 操作相关的操作。例如，`s3:GetObject` 操作允许 OAI 读取存储桶中的对象。有关更多信息，请参阅下一部分的示例，或者参阅《Amazon Simple Storage Service 用户指南》**中的 [Amazon S3 操作](https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html)。

##### Amazon S3 存储桶策略示例
<a name="private-content-updating-s3-bucket-policies-examples"></a>

以下示例显示了允许 CloudFront OAI 访问 S3 存储桶的 Amazon S3 存储桶策略。

在 CloudFront 控制台的**安全**、**源访问**、**身份（遗留）**下找到 OAI ID。或者，在 CloudFront API 中使用 [ListCloudFrontOriginAccessIdentities](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListCloudFrontOriginAccessIdentities.html)。

**Example 向 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 <origin access identity ID>"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<S3 bucket name>/*"
        }
    ]
}
```

**Example 向 OAI 授予读写访问权限的 Amazon S3 存储桶策略**  
下面的示例允许 OAI 读取和写入指定存储桶（`s3:GetObject` 和 `s3:PutObject`）中的对象。这允许查看器通过 CloudFront 将文件上传到您的 Amazon S3 存储桶。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::<S3 bucket name>/*"
        }
    ]
}
```

#### 使用 Amazon S3 对象 ACL（不建议）
<a name="private-content-updating-s3-acls"></a>

**重要**  
我们建议[使用 Amazon S3 存储桶策略](#private-content-updating-s3-bucket-policies)向 OAI 提供对 S3 存储桶的访问权限。您也可以按照这一部分的描述使用访问控制列表 (ACL)，但我们不建议您这样做。  
Amazon S3 建议将 [bS3 Object Ownership](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)（S3 对象所有权）设置为 **bucket owner enforced**（强制执行存储桶拥有者），这意味着存储桶以及其中的对象禁用 ACL。当您应用此对象所有权设置后，必须使用存储桶策略向 OAI 授予访问权限（请参阅上一部分）。  
以下部分仅适用于需要 ACL 的传统使用案例。

您可以通过以下方式创建或更新文件的 ACL，向 CloudFront OAI 授予对 Amazon S3 存储桶中文件的访问权限：
+ 使用 [Amazon S3 控制台](https://console.aws.amazon.com/s3/home)中 Amazon S3 对象的 **Permissions**（权限）选项卡。
+ 使用 Amazon S3 API 中的 [PutObjectAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectAcl.html)。

使用 ACL 向 OAI 授予访问权限时，您必须使用其 Amazon S3 规范用户 ID 来指定 OAI。在 CloudFront 控制台中，您可以在**安全**、**源访问**、**身份（遗留）**下找到此 ID。如果使用 CloudFront API，请使用您在创建 OAI 时返回的 `S3CanonicalUserId` 元素值，或者调用 CloudFront API 中的 [ListCloudFrontOriginAccessIdentities](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListCloudFrontOriginAccessIdentities.html)。

### 在仅支持签名版本 4 身份验证的 Amazon S3 区域中使用源访问身份
<a name="private-content-origin-access-identity-signature-version-4"></a>

较新的 Amazon S3 区域要求对通过身份验证的请求使用签名版本 4。（有关各个 Amazon S3 区域支持的签名版本，请参阅《AWS 一般参考》**中的 [Amazon Simple Storage Service 端点和限额](https://docs.aws.amazon.com/general/latest/gr/s3.html)。) 如果您使用源访问身份并且存储桶位于要求使用签名版本 4 的区域之一，请注意以下几点：
+ 支持 `DELETE`、`GET`、`HEAD`、`OPTIONS` 和 `PATCH` 请求，无限定条件。
+ `POST`不支持 请求。