

# 将存储桶配置为将 S3 存储桶密钥与 SSE-KMS 结合使用于新对象
<a name="configuring-bucket-key"></a>

当您配置具有 Amazon Key Management Service（Amazon KMS）密钥的服务器端加密（SSE-KMS）时，您可以将存储桶配置为使用 S3 存储桶密钥对新对象进行 SSE-KMS 加密。S3 存储桶密钥可减少从 Amazon S3 到 Amazon KMS 的请求流量，从而降低 SSE-KMS 的成本。有关更多信息，请参阅 [使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本](bucket-key.md)。

您可以使用 Amazon S3 控制台、REST API、Amazon SDK、Amazon Command Line Interface（Amazon CLI）或 Amazon CloudFormation 将存储桶配置为使用 S3 存储桶密钥对新对象进行 SSE-KMS 加密。如果要为现有对象启用或禁用 S3 存储桶密钥，则可以使用 `CopyObject` 操作。有关更多信息，请参阅[在对象级别配置 S3 存储桶密钥](configuring-bucket-key-object.md)和[使用批量操作为 SSE-KMS 启用 S3 存储桶密钥](batch-ops-copy-example-bucket-key.md)。

当为源存储桶或目标存储桶启用 S3 存储桶密钥时，加密上下文将是存储桶 Amazon Resource Name（ARN），而不是对象 ARN，例如 `arn:aws:s3:::{{bucket_ARN}}`。您需要更新 IAM 策略才能将存储桶 ARN 用于加密上下文。有关更多信息，请参阅 [S3 存储桶密钥和复制](replication-config-for-kms-objects.md#bk-replication)。

以下示例说明了 S3 存储桶密钥如何与复制结合使用。有关更多信息，请参阅 [复制加密对象（SSE-S3、SSE-KMS、DSSE-KMS、SSE-C）](replication-config-for-kms-objects.md)。 

**先决条件**  
在将存储桶配置为使用 S3 存储桶密钥之前，请查看 [启用 S3 存储桶密钥之前需要注意的更改](bucket-key.md#bucket-key-changes)。

**Topics**

## 使用 S3 控制台
<a name="enable-bucket-key"></a>

在 S3 控制台中，您可以为新存储桶或现有存储桶启用或禁用 S3 存储桶密钥。S3 控制台中的对象从存储桶配置中继承其 S3 存储桶密钥设置。当您为存储桶启用 S3 存储桶密钥时，您上传到存储桶的新对象将利用 S3 存储桶密钥进行 SSE-KMS 加密。

**在启用了 S3 存储桶密钥的存储桶中上传，复制或修改对象**  
如果您在启用了 S3 存储桶密钥的存储桶中上传、修改或复制对象，则该对象的 S3 存储桶密钥设置可能会更新以与存储桶配置保持一致。

如果对象已启用 S3 存储桶密钥，则在复制或修改对象时，该对象的 S3 存储桶密钥设置不会更改。但是，如果您修改或复制未启用 S3 存储桶密钥的对象，并且目标存储桶具有 S3 存储桶密钥配置，则该对象将继承目标存储桶的 S3 存储桶密钥设置。例如，如果源对象尚未启用 S3 存储桶密钥，但目标存储桶已启用 S3 存储桶密钥，则为该对象启用 S3 存储桶密钥。

**在创建新存储桶时启用 S3 存储桶密钥**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 请选择 **Create bucket（创建存储桶）**。

1. 输入存储桶名称，然后选择您的 Amazon Web Services 区域。

1. 在**默认加密**下，对于**加密密钥类型**，选择 **Amazon Key Management Service 密钥（SSE-KMS）**。

1. 在 **Amazon KMS 密钥**下，执行以下操作以选择您的 KMS 密钥：
   + 要从可用的 KMS 密钥列表中进行选择，请选择**从您的 Amazon KMS keys 中进行选择**，然后从可用密钥的列表中选择您的 **KMS 密钥**。

     Amazon 托管式密钥（`aws/s3`）和您的客户自主管理型密钥都显示在此列表中。有关客户自主管理型密钥的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[客户密钥和 Amazon 密钥](https://docs.amazonaws.cn//kms/latest/developerguide/concepts.html#key-mgmt)。
   + 要输入 KMS 密钥 ARN，请选择**输入 Amazon KMS key ARN**，然后在显示的字段中输入您的 KMS 密钥 ARN。
   + 要在 Amazon KMS 控制台中创建新的客户自主管理型密钥，请选择**创建 KMS 密钥**。

     有关创建 Amazon KMS key 的更多信息，请参阅 *Amazon Key Management Service 开发人员指南*中的[创建密钥](https://docs.amazonaws.cn//kms/latest/developerguide/create-keys.html)。

1. 在 **Bucket Key（存储桶密钥）**下，请选择 **Enable（启用）**。

1. 请选择 **Create bucket（创建存储桶）**。

   Amazon S3 创建启用了 S3 存储桶密钥的存储桶。您上传到存储桶的新对象将使用 S3 存储桶密钥。 

   要禁用 S3 存储桶密钥，请按照前面的步骤操作，然后选择 **Disable（禁用）**。

**为现有存储桶启用 S3 存储桶密钥**

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 在 **Buckets（存储桶）**列表中，请选择要为其启用 S3 存储桶密钥的存储桶。

1. 选择**属性**选项卡。

1. 在**默认加密**下，选择**编辑**。

1. 在**默认加密**下，对于**加密密钥类型**，选择 **Amazon Key Management Service 密钥（SSE-KMS）**。

1. 在 **Amazon KMS 密钥**下，执行以下操作以选择您的 KMS 密钥：
   + 要从可用的 KMS 密钥列表中进行选择，请选择**从您的 Amazon KMS keys 中进行选择**，然后从可用密钥的列表中选择您的 **KMS 密钥**。

     Amazon 托管式密钥（`aws/s3`）和您的客户自主管理型密钥都显示在此列表中。有关客户自主管理型密钥的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[客户密钥和 Amazon 密钥](https://docs.amazonaws.cn//kms/latest/developerguide/concepts.html#key-mgmt)。
   + 要输入 KMS 密钥 ARN，请选择**输入 Amazon KMS key ARN**，然后在显示的字段中输入您的 KMS 密钥 ARN。
   + 要在 Amazon KMS 控制台中创建新的客户自主管理型密钥，请选择**创建 KMS 密钥**。

     有关创建 Amazon KMS key 的更多信息，请参阅 *Amazon Key Management Service 开发人员指南*中的[创建密钥](https://docs.amazonaws.cn//kms/latest/developerguide/create-keys.html)。

1. 在 **Bucket Key（存储桶密钥）**下，请选择 **Enable（启用）**。

1. 选择 **Save Changes**（保存更改）。

   Amazon S3 为添加到存储桶中的新对象启用 S3 存储桶密钥。现有对象未使用 S3 存储桶密钥。要为现有对象配置 S3 存储桶密钥，可以使用 `CopyObject` 操作。有关更多信息，请参阅 [在对象级别配置 S3 存储桶密钥](configuring-bucket-key-object.md)。

   要禁用 S3 存储桶密钥，请按照前面的步骤操作，然后选择 **Disable（禁用）**。

## 使用 REST API
<a name="enable-bucket-key-rest"></a>

您可以使用 [PutBucketEncryption](https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutBucketEncryption.html) 为存储桶启用或禁用 S3 存储桶密钥。要使用 `PutBucketEncryption` 配置 S3 存储桶密钥，请使用 [ServerSideEncryptionRule](https://docs.amazonaws.cn/AmazonS3/latest/API/API_ServerSideEncryptionRule.html) 数据类型，其中包括使用 SSE-KMS 进行的默认加密。您还可以通过客户托管密钥的 KMS 密钥 ID 来选择使用客户托管密钥。  

有关更多信息和示例语法，请参阅 [ putbucKetenCryption ](https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutBucketEncryption.html)。

## 使用适用于 Java 的 Amazon 软件开发工具包
<a name="enable-bucket-key-sdk"></a>

以下示例使用 适用于 Java 的 Amazon SDK，通过 SSE-KMS 和 S3 存储桶密钥启用默认存储桶加密。

------
#### [ Java ]

```
AmazonS3 s3client = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.DEFAULT_REGION)
    .build();
    
ServerSideEncryptionByDefault serverSideEncryptionByDefault = new ServerSideEncryptionByDefault()
    .withSSEAlgorithm(SSEAlgorithm.KMS);
ServerSideEncryptionRule rule = new ServerSideEncryptionRule()
    .withApplyServerSideEncryptionByDefault(serverSideEncryptionByDefault)
    .withBucketKeyEnabled(true);
ServerSideEncryptionConfiguration serverSideEncryptionConfiguration =
    new ServerSideEncryptionConfiguration().withRules(Collections.singleton(rule));

SetBucketEncryptionRequest setBucketEncryptionRequest = new SetBucketEncryptionRequest()
    .withServerSideEncryptionConfiguration(serverSideEncryptionConfiguration)
    .withBucketName(bucketName);
            
s3client.setBucketEncryption(setBucketEncryptionRequest);
```

------

## 使用 Amazon CLI
<a name="enable-bucket-key-cli"></a>

以下示例使用 Amazon CLI，通过 SSE-KMS 和 S3 存储桶密钥启用默认存储桶加密。将 `{{user input placeholders}}` 替换为您自己的信息。

```
aws s3api put-bucket-encryption --bucket {{amzn-s3-demo-bucket}} --server-side-encryption-configuration '{
        "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "aws:kms",
                    "KMSMasterKeyID": "{{KMS-Key-ARN}}"
                },
                "BucketKeyEnabled": true
            }
        ]
    }'
```

## 使用 Amazon CloudFormation
<a name="enable-bucket-key-cloudformation"></a>

有关使用 Amazon CloudFormation 配置 S3 存储桶密钥的更多信息，请参阅《Amazon CloudFormation 用户指南》**中的 [AWS::S3::Bucket ServerSideEncryptionRule](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html)。