

# 限制对 Amazon S3 多区域接入点源的访问
<a name="private-content-restricting-access-to-s3-mrap"></a>

您可以使用源访问控制（OAC）来限制对 Amazon S3 多区域接入点源的访问。S3 多区域接入点提供了一个全局端点，可根据网络延迟将请求路由至最近的 S3 存储桶。

有关将 OAC 与标准 Amazon S3 存储桶源结合使用的信息，请参阅[限制对 Amazon S3 源的访问](private-content-restricting-access-to-s3.md)。

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

在创建和设置 OAC 之前，您必须拥有带有 Amazon S3 多区域接入点源的 CloudFront 分配。源域名必须使用 S3 多区域接入点主机名格式：

`multi-region-access-point-alias.accesspoint.s3-global.amazonaws.com`

有关创建 S3 多区域接入点的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[创建多区域接入点](https://docs.amazonaws.cn/AmazonS3/latest/userguide/CreatingMultiRegionAccessPoints.html)。

## 向 CloudFront 授予访问 S3 多区域接入点的权限
<a name="oac-permission-to-access-s3-mrap"></a>

更新多区域接入点策略，以支持 CloudFront 服务主体 (`cloudfront.amazonaws.com`) 访问多区域接入点。在策略中使用 `Condition` 元素，仅在请求代表包含源的 CloudFront 分配时，才支持 CloudFront 访问多区域接入点。

有关添加或修改多区域接入点策略的信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[多区域接入点策略示例](https://docs.amazonaws.cn/AmazonS3/latest/userguide/MultiRegionAccessPointPermissions.html)。

**Example 适用于 CloudFront OAC 的多区域接入点策略**  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCloudFrontOACAccess",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3::111122223333:accesspoint/Multi-Region-Access-Point-Alias.mrap/object/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": "arn:aws:cloudfront::111122223333:distribution/CloudFront distribution ID"
                }
            }
        }
    ]
}
```

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

除了多区域接入点策略外，还必须向 CloudFront 授予访问与多区域接入点关联的每个底层 S3 存储桶的权限。您可以通过两种方式之一来执行此操作：

### 选项 1：仅向 CloudFront 授予访问权限
<a name="oac-s3-mrap-bucket-option1"></a>

向每个 S3 存储桶添加一个存储桶策略，以支持 CloudFront 服务主体访问该存储桶。如果您还需要支持从其它来源直接访问存储桶，请使用此选项。

**Example 底层存储桶的 S3 存储桶策略**  

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

### 选项 2：将完全存储桶访问权限委托给多区域接入点
<a name="oac-s3-mrap-bucket-option2"></a>

向多区域接入点授予对每个底层存储桶的完全访问权限。通过这种方法，对存储桶的所有访问权限都由多区域接入点策略控制，这可简化访问权限管理。对于不需要直接访问存储桶的使用案例，我们建议使用此选项。

**Example 将访问权限委托给多区域接入点的 S3 存储桶策略**  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DelegateAccessToMRAP",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket-us-east-1",
                "arn:aws:s3:::amzn-s3-demo-bucket-us-east-1/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:DataAccessPointArn": "arn:aws:s3::111122223333:accesspoint/Multi-Region-Access-Point-Alias.mrap"
                }
            }
        }
    ]
}
```

有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[多区域接入点策略示例](https://docs.amazonaws.cn/AmazonS3/latest/userguide/MultiRegionAccessPointPermissions.html#MultiRegionAccessPointPolicyExamples)。

**重要**  
您必须将此存储桶策略添加到与多区域接入点关联的每个 S3 存储桶中。如果任何存储桶缺少策略，则路由到该存储桶的 CloudFront 请求将遭拒绝。

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

如果底层 S3 存储桶中的对象是通过具有 Amazon KMS 的服务器端加密（SSE-KMS）进行加密的，您必须确保 CloudFront 分配具有使用 Amazon KMS 密钥的权限。由于 S3 多区域接入点可以将请求路由到多个区域中的存储桶，因此您必须在底层存储桶使用 SSE-KMS 的每个区域的 KMS 密钥策略中添加一条声明。有关如何修改密钥策略的信息，请参阅 *Amazon Key Management Service 开发人员指南* 中的[更改密钥策略](https://docs.amazonaws.cn/kms/latest/developerguide/key-policy-modifying.html)。

**Example KMS 密钥政策语句：**  
以下示例显示了一条 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"
        }
    }
}
```

**重要**  
在底层 S3 存储桶使用 SSE-KMS 加密的每个区域中，您都必须将此密钥策略声明添加到 KMS 密钥中。

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

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

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

**创建源访问控制**

1. 登录 Amazon Web Services 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.amazonaws.cn/cloudfront/v4/home](https://console.amazonaws.cn/cloudfront/v4/home)。

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

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

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

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

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

1. 从**源类型**下拉列表中选择 **S3 多区域接入点**。

1. 选择**创建**。

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

**向分配中的 S3 多区域接入点源添加源访问控制**

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

1. 选择具有要向其添加 OAC 的 S3 多区域接入点源的分配，然后选择**源**选项卡。

1. 选择要向其添加 OAC 的 S3 多区域接入点源，然后选择**编辑**。

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

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

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

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

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

使用 **create-origin-access-control** 命令：

```
aws cloudfront create-origin-access-control \
    --origin-access-control-config '{
        "Name": "my-s3-mrap-oac",
        "Description": "OAC for S3 Multi-Region Access Point",
        "SigningProtocol": "sigv4a",
        "SigningBehavior": "always",
        "OriginAccessControlOriginType": "s3mrap"
    }'
```

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

在 `OriginAccessControlConfig` 中指定以下值：
+ `SigningProtocol`: `sigv4a`
+ `SigningBehavior`：`always`、`never` 或 `no-override`
+ `OriginAccessControlOriginType`: `s3mrap`

**Example Amazon CloudFormation 模板**  

```
Type: AWS::CloudFront::OriginAccessControl
Properties:
  OriginAccessControlConfig:
    Description: An optional description for the origin access control
    Name: my-s3-mrap-oac
    OriginAccessControlOriginType: s3mrap
    SigningBehavior: always
    SigningProtocol: sigv4a
```

------

## 签名行为
<a name="oac-signing-behavior-s3-mrap"></a>

S3 多区域接入点源的签名行为选项与常规 Amazon S3 存储桶源的签名行为选项相同。有关更多信息，请参阅*限制对 Amazon S3 源的访问*中的[源访问控制的高级设置](private-content-restricting-access-to-s3.md#oac-advanced-settings-s3)。