

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon DocumentDB 中的数据保护
<a name="security.data-protection"></a>

AWS [责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)适用于 Amazon DocumentDB（兼容 MongoDB）中的数据保护。如该模式中所述，AWS 负责保护运行所有 AWS 云 的全球基础结构。您负责维护对托管在此基础结构上的内容的控制。您还负责您所使用的 AWS 服务 的安全配置和管理任务。有关数据隐私的更多信息，请参阅[数据隐私常见问题](https://aws.amazon.com/compliance/data-privacy-faq/)。有关欧洲数据保护的信息，请参阅 *AWS Security Blog* 上的 [AWS Shared Responsibility Model and GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 博客文章。

出于数据保护目的，建议您保护 AWS 账户 凭证并使用 AWS IAM Identity Center 或 AWS Identity and Access Management（IAM）设置单个用户。这样，每个用户只获得履行其工作职责所需的权限。还建议您通过以下方式保护数据：
+ 对每个账户使用多重身份验证（MFA）。
+ 使用 SSL/TLS 与 AWS 资源进行通信。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 使用 AWS CloudTrail 设置 API 和用户活动日记账记录。有关使用 CloudTrail 跟踪来捕获 AWS 活动的信息，请参阅《AWS CloudTrail 用户指南》**中的[使用 CloudTrail 跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解决方案以及 AWS 服务中的所有默认安全控制。
+ 使用高级托管安全服务（例如 Amazon Macie），它有助于发现和保护存储在 Amazon S3 中的敏感数据。
+ 如果在通过命令行界面或 API 访问 AWS 时需要经过 FIPS 140-3 验证的加密模块，请使用 FIPS 端点。有关可用的 FIPS 端点的更多信息，请参阅[《美国联邦信息处理标准（FIPS）第 140-3 版》](https://aws.amazon.com/compliance/fips/)。

强烈建议您切勿将机密信息或敏感信息（如您客户的电子邮件地址）放入标签或自由格式文本字段（如**名称**字段）。这包括当您通过控制台、API、AWS CLI 或 AWS SDK 使用 Amazon DocumentDB 或其他 AWS 服务时。在用于名称的标签或自由格式文本字段中输入的任何数据都可能会用于计费或诊断日志。如果您向外部服务器提供网址，强烈建议您不要在网址中包含凭证信息来验证对该服务器的请求。

**Topics**
+ [客户端字段级加密](field-level-encryption.md)
+ [加密静态数据](encryption-at-rest.md)
+ [加密传输中数据](security.encryption.ssl.md)
+ [密钥管理](security.encryption.ssl.public-key.md)

# 客户端字段级加密
<a name="field-level-encryption"></a>

Amazon DocumentDB 客户端字段级加密 (FLE) 允许您在客户端应用程序中的敏感数据传输到 Amazon DocumentDB 集群之前对其进行加密。敏感数据在集群中存储和处理时保持加密状态，检索时在客户端应用程序中解密。

**Topics**
+ [入门](#fle-getting-started)
+ [在客户端文件中查询](#fle-querying)
+ [限制](#fle-limitationa)

## 入门
<a name="fle-getting-started"></a>

Amazon DocumentDB 中客户端 FLE 的初始配置分为四个步骤，包括创建加密密钥、将角色与应用程序关联、配置应用程序以及使用加密选项定义 CRUD 操作。

**Topics**
+ [步骤 1：创建加密密钥](#fle-step-create-key)
+ [步骤 2：将角色与应用程序关联](#fle-step-associate-role)
+ [步骤 3：配置应用程序](#fle-step-config-app)
+ [步骤 4：定义 CRUD 操作](#fle-step-crud-ops)
+ [示例：客户端字段级加密配置文件](#fle-config-example)

### 步骤 1：创建加密密钥
<a name="fle-step-create-key"></a>

使用 AWS Key Management Service，创建用于加密和解密敏感数据字段的对称密钥，并为其提供必要的 IAM 使用权限。AWS KMS 存储用于加密数据密钥 (DK) 的客户密钥 (CK)。我们建议将客户密钥存储在 KMS 中，以加强安全防护。数据密钥是存储在 Amazon DocumentDB 集合中的辅助密钥，在将文档存储到 Amazon DocumentDB 之前，需要使用数据密钥对敏感字段进行加密。客户密钥对数据密钥进行加密，而数据密钥反过来会加密和解密您的数据。如果使用的是全局集群，则可以创建一个多区域密钥，供不同区域的不同服务角色使用。

有关 AWS Key Management Service（包括如何创建密钥）的更多信息，请参阅 [AWS 密钥管理服务开发人员指南](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)。

### 步骤 2：将角色与应用程序关联
<a name="fle-step-associate-role"></a>

使用适当的 AWS KMS 权限创建 IAM policy。此策略允许附加到其上的 IAM 身份获取加密和解密资源字段中指定的 KMS 密钥。您的应用程序假定使用此 IAM 角色与 AWS KMS 进行身份验证。

策略应如下所示：

```
{ "Effect": "Allow",
"Action": ["kms:Decrypt", "kms:Encrypt"],
"Resource": "Customer Key ARN"
}
```

### 步骤 3：配置应用程序
<a name="fle-step-config-app"></a>

现在，您在 AWS KMS 中定义了客户密钥并创建了一个 IAM 角色，并为其提供了访问客户密钥的正确 IAM 权限。导入必需的程序包。

```
import boto3
import json
import base64
from pymongo import MongoClient
from pymongo.encryption import (Algorithm,
                                ClientEncryption)
```

```
# create a session object: 
my_session = boto3.session.Session()

# get access_key and secret_key programmatically using get_frozen_credentials() method:
 current_credentials = my_session.get_credentials().get_frozen_credentials()
```

1. 指定“aws”作为 KMS 提供商类型，然后输入在上一步中检索到的账户证书。

   ```
   provider = "aws"
   kms_providers = {
       provider: {
           "accessKeyId": current_credentials.access_key,
           "secretAccessKey": current_credentials.secret_key
       }
   }
   ```

1. 指定用于加密数据密钥的客户密钥：

   ```
   customer_key = {
   “region”: “AWS region of the customer_key”,
       “key”: “customer_key ARN”
   }
   
   key_vault_namespace = "encryption.dataKeys"
   
   key_alt_name = 'TEST_DATA_KEY'
   ```

1. 配置 MongoClient 对象：

   ```
   client = MongoClient(connection_string)
   
   coll = client.test.coll
   coll.drop()
   
   client_encryption = ClientEncryption(
       kms_providers, # pass in the kms_providers variable from the previous step
       key_vault_namespace = key_vault_namespace,
       client,
       coll.codec_options
   )
   ```

1. 生成您的数据密钥：

   ```
   data_key_id = client_encryption.create_data_key(provider,
       customer_key,
       key_alt_name = [key_alt_name])
   ```

1. 检索现有的数据密钥：

   ```
   data_key = DataKey("aws",
       master_key = customer_key)
   key_id = data_key["_id"]
   data_key_id = client[key_vault_namespace].find_one({"_id": key_id})
   ```

### 步骤 4：定义 CRUD 操作
<a name="fle-step-crud-ops"></a>

使用加密选项定义 CRUD 操作。

1. 定义集合以写入/读取/删除单个文档：

   ```
   coll = client.gameinfo.users
   ```

1. 显式加密 - 加密字段并插入：
**注意**  
必须只提供“key\$1id”或“key\$1alt\$1name”中的一个。

   ```
   encrypted_first_name = client_encryption.encrypt(
       "Jane",
       Algorithm.AEAD_AES_256_CBC_HMAC_SHA_512_Deterministic,
       key_alt_name=data_key_id
   )
   encrypted_last_name = client_encryption.encrypt(
       "Doe",
       Algorithm.AEAD_AES_256_CBC_HMAC_SHA_512_Deterministic,
       key_alt_name=data_key_id
   )
   encrypted_dob = client_encryption.encrypt(
       "1990-01-01",
       Algorithm.AEAD_AES_256_CBC_HMAC_SHA_512_Random,
       key_alt_name=data_key_id
   )
   
   coll.insert_one(
       {"gamerTag": "jane_doe90",
       "firstName": encrypted_first_name,
       "lastName": encrypted_last_name,
       "dateOfBirth":encrypted_dob,
       "Favorite_games":["Halo","Age of Empires 2","Medal of Honor"]
   })
   ```

### 示例：客户端字段级加密配置文件
<a name="fle-config-example"></a>

在以下示例中，将每个*用户输入占位符*替换为您自己的信息。

```
# import python packages:
import boto3
import json
import base64
from pymongo import MongoClient
from pymongo.encryption import (Algorithm,
                                ClientEncryption)

def main():
    
    # create a session object:
    my_session = boto3.session.Session()
    
    # get aws_region from session object:
    aws_region = my_session.region_name
    
    # get access_key and secret_key programmatically using get_frozen_credentials() method:
    current_credentials = my_session.get_credentials().get_frozen_credentials()
    provider = "aws"
    
    # define the kms_providers which is later used to create the Data Key:
    kms_providers = {
        provider: {
            "accessKeyId": current_credentials.access_key,
            "secretAccessKey": current_credentials.secret_key
        }
    }
    
    # enter the kms key ARN. Replace the example ARN value.
    kms_arn = "arn:aws:kms:us-east-1:123456789:key/abcd-efgh-ijkl-mnop"
    customer_key = {
        "region": aws_region,
        "key":kms_arn
    }

    # secrets manager is used to strore and retrieve user credentials for connecting to an Amazon DocumentDB cluster. 
    # retrieve the secret using the secret name. Replace the example secret key.
    secret_name = "/dev/secretKey"
    docdb_credentials = json.loads(my_session.client(service_name = 'secretsmanager', region_name = "us-east-1").get_secret_value(SecretId = secret_name)['SecretString'])

    connection_params = '/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false'
    conn_str = 'mongodb://' + docdb_credentials["username"] + ':' + docdb_credentials["password"] + '@' + docdb_credentials["host"] + ':' + str(docdb_credentials["port"]) + connection_params
    client = MongoClient(conn_str) 

    coll = client.test.coll
    coll.drop()
    
    # store the encryption data keys in a key vault collection (having naming convention as db.collection):
    key_vault_namespace = "encryption.dataKeys"
    key_vault_db_name, key_vault_coll_name = key_vault_namespace.split(".", 1)

    # set up the key vault (key_vault_namespace) for this example:
    key_vault = client[key_vault_db_name][key_vault_coll_name]
    key_vault.drop()
    key_vault.create_index("keyAltNames", unique=True)

    client_encryption = ClientEncryption(
        kms_providers,
        key_vault_namespace,
        client,
        coll.codec_options)
    
    # create a new data key for the encrypted field:
    data_key_id = client_encryption.create_data_key(provider, master_key=customer_key, key_alt_names=["some_key_alt_name"], key_material = None)
    
    # explicitly encrypt a field:
    encrypted_first_name = client_encryption.encrypt(
    "Jane",
    Algorithm.AEAD_AES_256_CBC_HMAC_SHA_512_Deterministic,
    key_id=data_key_id
    )
    coll.insert_one(
    {"gamerTag": "jane_doe90",
    "firstName": encrypted_first_name
    })
    doc = coll.find_one()
    print('Encrypted document: %s' % (doc,))
    
    # explicitly decrypt the field:
    doc["encryptedField"] = client_encryption.decrypt(doc["encryptedField"])
    print('Decrypted document: %s' % (doc,))
    
    # cleanup resources:
    client_encryption.close()
    client.close()
    
    if __name__ == "__main__":
        main()
```

## 在客户端文件中查询
<a name="fle-querying"></a>

Amazon DocumentDB 支持使用客户端 FLE 进行点相等查询。不相等和比较查询可能会返回不准确的结果。与对解密后的值发出相同的操作相比，读取和写入操作可能会出现意外或不正确的行为。

例如，要查询玩家分数大于 500 的文档筛选条件，请执行以下操作：

```
db.users.find( {
    "gamerscore" : { $gt : 500 }
})
```

客户端使用显式加密方法对查询值进行加密：

```
encrypted_gamerscore_filter = client_encryption.encrypt(
    500,
        Algorithm.AEAD_AES_256_CBC_HMAC_SHA_512_Deterministic,
        key_alt_name=data_key_id
        )

db.users.find( {
    "gamerscore" : { $gt : encrypted_gamerscore_filter }
} )
```

在查找操作中，Amazon DocumentDB 使用大于不相等校验将加密值 500 与存储在每个文档中的加密字段值进行比较。使用解密后的数据和值执行查找操作中的不相等校验可能会返回不同的结果，即使该操作成功生成了结果。

## 限制
<a name="fle-limitationa"></a>

以下限制适用于 Amazon DocumentDB 客户端字段级加密：
+ Amazon DocumentDB 仅支持点相等查询。不相等和比较查询可能会返回不准确的结果。与对解密后的值发出相同的操作相比，读取和写入操作可能会出现意外或不正确的行为。查询玩家分数大于 500 的文档过滤器。

  ```
  db.users.find( {
      "gamerscore" : { $gt : 500 }
      })
  ```

  客户端使用显式加密方法对查询值进行加密。

  ```
  encrypted_gamerscore_filter = client_encryption.encrypt(
      500,
      Algorithm.AEAD_AES_256_CBC_HMAC_SHA_512_Deterministic,
      key_alt_name=data_key_id
  )
  
  db.users.find({
      "gamerscore" : { $gt : encrypted_gamerscore_filter }
  })
  ```

  在查找操作中，Amazon DocumentDB 使用大于不相等校验将加密值 500 与存储在每个文档中的加密字段值进行比较。使用解密后的数据和值执行查找操作中的不相等校验可能会返回不同的结果，即使该操作成功生成了结果。
+ Amazon DocumentDB 不支持来自 Mongo Shell 的显式客户端 FLE。但是，该功能适用于我们支持的任何驱动程序。

# Amazon DocumentDB 静态数据加密
<a name="encryption-at-rest"></a>

**注意**  
AWS KMS 正将术语*客户托管密钥 (CMK)* 替换为 *AWS KMS key* 和 *KMS 密钥*。这一概念并未改变。为防止破坏性更改，AWS KMS 保留了此术语的一些变体。

您可以通过在创建集群时指定存储加密选项来在 Amazon DocumentDB 集群中加密静态数据。存储加密在整个集群范围内启用，应用于所有实例，包括主实例和任何副本。它还应用于集群的存储卷、数据、索引、日志、自动备份和快照。

Amazon DocumentDB 使用 256 位高级加密标准 (AES-256) 通过 AWS Key Management Service （AWS KMS）中存储的加密密钥来对您的数据加密。使用静态加密启用的 Amazon DocumentDB 集群时，您无需修改应用程序逻辑或客户端连接。Amazon DocumentDB 以透明方式处理数据的加密和解密，这对性能产生的影响最小。

Amazon DocumentDB 与 AWS KMS 集成并使用称为信封加密的方法来保护您的数据。当使用 AWS KMS对 Amazon DocumentDB 集群 进行加密时，Amazon DocumentDB 请求 AWS KMS 使用 KMS 密钥 [ 生成加密文字数据密钥](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)以加密存储卷。加密文字数据密钥使用您定义的 KMS 密钥进行加密，并与加密的数据和存储元数据一起存储。当 Amazon DocumentDB 需要访问加密数据时，它会请求 AWS KMS 使用 KMS 解密加密文字数据密钥，并将明文数据密钥缓存到内存中，以高效地加密和解密存储卷中的数据。

 Amazon DocumentDB 中的存储加密功能可用于所有支持的实例大小和 Amazon DocumentDB 可用的所有 AWS 区域。

## 为 Amazon DocumentDB 集群启用静态加密
<a name="encryption-at-rest-enabling"></a>

使用 AWS 管理控制台 或 AWS Command Line Interface （AWS CLI）设置集群时，可以在 Amazon DocumentDB 集群上启用或禁用静态加密。默认情况下，您使用控制台创建的集群启用了静态加密功能。默认情况下，您使用 AWS CLI 创建的集群禁用了静态加密功能。因此，您必须使用 `--storage-encrypted` 参数显式启用静态加密。无论哪种情况，在创建集群后，都无法更改静态加密选项。

Amazon DocumentDB 使用 AWS KMS 检索和管理加密密钥，并定义控制这些密钥的使用方式的策略。如果您不指定 AWS KMS 密钥标识符，Amazon DocumentDB 使用默认的 AWS 托管服务 KMS 密钥。Amazon DocumentDB 为您的 AWS 账户 中每个 AWS 区域 创建一个单独 KMS 密钥。有关更多信息，请参阅 [AWS Key Management Service 概念](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html)。

要开始创建自己的 KMS 密钥，请参阅*AWS Key Management Service开发人员指南*中的[入门](https://docs.aws.amazon.com/kms/latest/developerguide/getting-started.html)。

**重要**  
您必须使用对称加密 KMS 密钥加密您的集群，因为 Amazon DocumentDB 仅支持对称加密 KMS 密钥。请勿使用非对称 KMS 密钥尝试对 Amazon DocumentDB 集群中的数据进行加密。有关更多信息，请参阅AWS Key Management Service开发人员指南**中的[非对称 KMS 密钥AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html)。

如果 Amazon DocumentDB 不再能够有权访问集群的加密密钥 — 例如，在撤销密钥访问权限时 — 加密的集群将进入终末状态。在此情况下，您只能从备份还原集群。对于 Amazon DocumentDB，备份始终启用 1 天。

此外，如果您禁用已加密 Amazon DocumentDB 集群的密钥，您最终将失去对该集群的读写访问权限。如果 Amazon DocumentDB 遇到用它无法访问的密钥加密的集群，则它会使该集群进入最终状态。在此状态下，集群不再可用，并且数据库的当前状态无法恢复。若要还原集群，您必须重新启用对 Amazon DocumentDB 的加密密钥的访问，然后从备份还原集群。

**重要**  
在已创建加密集群的 KMS 密钥后，您无法更改它。请确保先确定您的加密密钥要求，然后再创建加密的集群。

------
#### [ Using the AWS 管理控制台 ]

您可在创建集群时，指定静态加密选项。默认情况下，当您使用 AWS 管理控制台创建集群时，静态加密处于启用状态。集群创建之后无法修改该选项。

**在创建集群时指定静态加密选项**

1. 如[入门](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-ec2.launch-cluster.html)部分所述创建 Amazon DocumentDB 集群。但在步骤 6 中，不要选择**创建集群**。

1. 在 **Authentication (身份验证)** 部分下，选择 **Show advanced settings (显示高级设置)**。

1. 向下滚动至 **Encryption-at-rest (静态加密)** 部分。

1. 选择要进行静态加密的选项。无论您选择哪个选项，都无法在创建集群后更改它。
   + 要对此集群中的静态数据进行加密，请选择**启用加密**。
   + 如果您不想对此集群中的静态数据进行加密，请选择**Disable encryption (禁用加密)**。

1. 选择您想要的主密钥。Amazon DocumentDB 使用 AWS Key Management Service （AWS KMS）检索和管理加密密钥，并定义控制这些密钥的使用方式的策略。如果您不指定 AWS KMS 密钥标识符，Amazon DocumentDB 使用默认的 AWS 托管服务 KMS 密钥。有关更多信息，请参阅 [AWS Key Management Service 概念](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html)。
**注意**  
创建加密的集群后，您无法更改该集群的 KMS 密钥。请确保先确定您的加密密钥要求，然后再创建加密的集群。

1. 根据需要完成其他部分，然后创建您的集群。

------
#### [ Using the AWS CLI ]

要使用 AWS CLI 加密 Amazon DocumentDB 集群，请运行 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/docdb/describe-db-clusters.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/docdb/describe-db-clusters.html) 命令并指定 `--storage-encrypted` 选项。使用 AWS CLI 所创建的 Amazon DocumentDB 集群默认不启用存储加密。

以下示例创建启用了存储加密的 Amazon DocumentDB 集群。

在以下示例中，将每个 *user input placeholder* 替换为您的集群信息。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws docdb create-db-cluster \
  --db-cluster-identifier mydocdbcluster \
  --port 27017 \
  --engine docdb \
  --master-username SampleUser1 \
  --master-user-password primaryPassword \
  --storage-encrypted
```
对于 Windows：  

```
aws docdb create-db-cluster ^
  --db-cluster-identifier SampleUser1 ^
  --port 27017 ^
  --engine docdb ^
  --master-username SampleUser1 ^
  --master-user-password primaryPassword ^
  --storage-encrypted
```

在创建加密的Amazon DocumentDB 集群时，您可以指定 AWS KMS 密钥标识符，如以下示例所示。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws docdb create-db-cluster \
  --db-cluster-identifier SampleUser1 \
  --port 27017 \
  --engine docdb \
  --master-username primaryUsername \
  --master-user-password yourPrimaryPassword \
  --storage-encrypted \
  --kms-key-id key-arn-or-alias
```
对于 Windows：  

```
aws docdb create-db-cluster ^
  --db-cluster-identifier SampleUser1 ^
  --port 27017 ^
  --engine docdb ^
  --master-username SampleUser1 ^
  --master-user-password primaryPassword ^
  --storage-encrypted ^
  --kms-key-id key-arn-or-alias
```

**注意**  
创建加密的集群后，您无法更改该集群的 KMS 密钥。请确保先确定您的加密密钥要求，然后再创建加密的集群。

------

## Amazon DocumentDB 加密集群的限制
<a name="encryption-at-rest-limits"></a>

Amazon DocumentDB 加密的集群存在以下限制。
+ 您只能在创建 Amazon DocumentDB 集群时而不能在创建它之后启用或禁用静态加密。但是，您可以通过创建未加密群集的快照，然后将未加密的快照还原为新集群，同时指定静态加密选项。

  有关更多信息，请参阅以下主题：
  + [创建手动集群快照](backup_restore-create_manual_cluster_snapshot.md)
  + [从集群快照还原](backup_restore-restore_from_snapshot.md)
  + [复制 Amazon DocumentDB 集群快照](backup_restore-copy_cluster_snapshot.md)
+ 不能通过对已启用存储加密的 Amazon DocumentDB 集群进行修改来禁用加密。
+ Amazon DocumentDB 集群中的所有实例、自动备份、快照和索引都使用相同的 KMS 密钥进行加密。

# 加密传输中数据
<a name="security.encryption.ssl"></a>

您可以使用传输层安全性协议（TLS）加密应用程序与 Amazon DocumentDB 集群之间的连接。默认情况下，为新创建的 Amazon DocumentDB 集群启用传输中加密。可以选择在创建集群时或稍后禁用它。启用传输中加密后，需要使用 TLS 进行安全连接才能连接到集群。有关使用 TLS 连接到 Amazon DocumentDB 的更多信息，请参阅 [以编程方式连接到 Amazon DocumentDB](connect_programmatically.md)。

## 管理 Amazon DocumentDB 集群 TLS 设置
<a name="security.encryption.ssl.managing"></a>

Amazon DocumentDB 集群的传输中加密通过[集群参数组](https://docs.aws.amazon.com/documentdb/latest/developerguide/cluster_parameter_groups.html)中的 TLS 参数进行管理。您可以使用 AWS 管理控制台 或 AWS Command Line Interface（AWS CLI）管理 Amazon DocumentDB 集群 TLS 设置。有关如何验证和修改当前 TLS 设置的信息，请参阅以下部分。

------
#### [ Using the AWS 管理控制台 ]

请遵照以下步骤，使用控制台执行 TLS 加密的管理任务，例如识别参数组、验证 TLS 值以及进行必要的修改。

**注意**  
除非您在创建集群时以其他方式指定，否则将使用默认集群参数组创建集群。无法修改 `default` 集群参数组中的参数（例如，`tls` 启用/禁用）。因此，如果您的集群使用的是 `default` 集群参数组，则需要修改集群以使用非默认集群参数组。首先，您可能需要创建自定义集群参数组。有关更多信息，请参阅 [创建 Amazon DocumentDB 集群参数组](cluster_parameter_groups-create.md)。

1. **确定集群使用的集群参数组。**

   1. 通过以下网址打开 Amazon DocumentDB 控制台：[https://console.aws.amazon.com/docdb](https://console.aws.amazon.com/docdb)

   1. 在导航窗格中，选择**集群**。
**提示**  
如果您在屏幕左侧没有看到导航窗格，请在页面左上角选择菜单图标 (![\[Hamburger menu icon with three horizontal lines.\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/images/docdb-menu-icon.png))。

   1. 请注意，在**集群**导航框中，**集群标识符**列既显示集群又显示实例。实例列在集群下方。请参阅下方屏幕截图以供参考。  
![\[集群导航框中显示一列现有集群链接及其对应实例链接的图片。\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/images/clusters.png)

   1. 选择您感兴趣的集群。

   1. 选择**配置**选项卡，向下滚动到**集群详细信息**底部，然后找到**集群参数组**。请注意集群参数组的名称。

      如果集群参数组的名称是 `default`（例如， `default.docdb3.6`），则您必须创建一个自定义集群参数组，并将其设置为集群的参数组，然后才能继续。有关更多信息，请参阅下列内容：

      1. [创建 Amazon DocumentDB 集群参数组](cluster_parameter_groups-create.md) — 如果没有可以使用的自定义集群参数组，请创建一个。

      1. [修改 Amazon DocumentDB 集群](db-cluster-modify.md) — 修改您的集群以使用自定义集群参数组。

1. **确定 `tls` 集群参数的当前值。**

   1. 通过以下网址打开 Amazon DocumentDB 控制台：[https://console.aws.amazon.com/docdb](https://console.aws.amazon.com/docdb)

   1. 在导航窗格中，选择**参数组**。

   1. 在集群参数组列表中，选择您感兴趣的集群参数组的名称。

   1. 找到**群集参数**部分。在集群参数列表中，找到 `tls` 集群参数行。此时，以下四列很重要：
      + **Cluster parameter name (集群参数名称)** — 集群参数的名称。对于管理 TLS，需要关注的是 `tls` 集群参数。
      + **Values (值)** — 每个集群参数的当前值。
      + **Allowed values (允许的值)** — 可应用到集群参数的值的列表。
      + **Apply type (应用类型)** — **static (静态)**或 **dynamic (动态)**。对静态集群参数的更改只能在重启实例时应用。对动态集群参数的更改可以立即应用，也可以在重启实例时应用。

1. **修改 `tls` 集群参数的值。**

   如果 `tls` 的值不是所需的，请为此集群参数组修改其值。要更改 `tls` 集群参数的值，请按照以下步骤从前一部分继续执行。

   1. 选择集群参数名称 (`tls`) 左侧的按钮。

   1. 选择**编辑**。

   1. 要更改 `tls` 的值，请在 **Modify（修改）`tls`** 对话框中，从下拉列表中为此集群参数选择所需的值。

      有效值为：
      + **已禁用** — 禁用 TLS
      + **已启用** – 启用 TLS 版本 1.0 到 1.3。
      + **fips-140-3** — 使用 FIPS 启用 TLS。集群仅接受符合联邦信息处理标准 (FIPS) 出版物 140-3 要求的安全连接。在以下区域，这是唯一受支持的 Amazon DocumentDB 5.0（引擎版本 3.0.3727）集群启用：ca-central-1、us-west-2、us-east-1、us-east-2、us-gov-east-1、us-gov-west-1。
      + **tls1.2\$1** – 启用 TLS 版本 1.2 及更高版本。从 Amazon DocumentDB 4.0（引擎版本 2.0.10980）和 Amazon DocumentDB（引擎版本 3.0.11051）开始才支持此功能。
      + **tls1.3\$1** – 启用 TLS 版本 1.3 及更高版本。从 Amazon DocumentDB 4.0（引擎版本 2.0.10980）和 Amazon DocumentDB（引擎版本 3.0.11051）开始才支持此功能。  
![\[特定集群的“修改 TLS” 对话框的图片。\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/images/modify-tls.png)

   1. 选择 **Modify cluster parameter (修改集群参数)**。更改在重启时应用到​每个集群实例。

1. **重启 Amazon DocumentDB 实例**

   重启集群的每个实例，以便将更改应用到集群中的所有实例。

   1. 通过以下网址打开 Amazon DocumentDB 控制台：[https://console.aws.amazon.com/docdb](https://console.aws.amazon.com/docdb)

   1. 在导航窗格中，选择 **Instances (实例)**。

   1. 要指定待重启的实例，请在实例列表中找到实例，并选择该实例名称左侧的按钮。

   1. 选择 **Actions**（操作），然后选择 **Reboot**（重启）。通过选择**重启**来确认您要重启。

------
#### [ Using the AWS CLI ]

请遵照以下步骤，使用 AWS CLI 执行 TLS 加密的管理任务，例如识别参数组、验证 TLS 值以及进行必要的修改。

**注意**  
除非您在创建集群时以其他方式指定，否则将使用默认集群参数组创建集群。无法修改 `default` 集群参数组中的参数（例如，`tls` 启用/禁用）。因此，如果您的集群使用的是 `default` 集群参数组，则需要修改集群以使用非默认集群参数组。您可能需要先创建自定义集群参数组。有关更多信息，请参阅 [创建 Amazon DocumentDB 集群参数组](cluster_parameter_groups-create.md)。

1. **确定集群使用的集群参数组**

   运行具有以下选项的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/docdb/describe-db-clusters.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/docdb/describe-db-clusters.html) 命令：
   + `--db-cluster-identifier`
   + `--query`

   在以下示例中，将每个 *user input placeholder* 替换为您的集群信息。

   ```
   aws docdb describe-db-clusters \
     --db-cluster-identifier mydocdbcluster \
     --query 'DBClusters[*].[DBClusterIdentifier,DBClusterParameterGroup]'
   ```

   此操作的输出将类似如下（JSON 格式）：

   ```
   [
       [
           "mydocdbcluster",
           "myparametergroup"
       ]
   ]
   ```

   如果集群参数组的名称是 `default`（例如， `default.docdb3.6`），则您必须有一个自定义集群参数组，并将其设置为集群的参数组，然后才能继续。有关更多信息，请参阅以下主题：

   1. [创建 Amazon DocumentDB 集群参数组](cluster_parameter_groups-create.md) — 如果没有可以使用的自定义集群参数组，请创建一个。

   1. [修改 Amazon DocumentDB 集群](db-cluster-modify.md) — 修改您的集群以使用自定义集群参数组。

1. **确定 `tls` 集群参数的当前值。**

   要获取有关此集群参数组的更多信息，请运行具有以下选项的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/docdb/describe-db-cluster-parameters.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/docdb/describe-db-cluster-parameters.html) 命令：
   + `--db-cluster-parameter-group-name`
   + `--query`

     将输出限制为仅包含感兴趣的字段：`ParameterName`、`ParameterValue`、`AllowedValues` 和 `ApplyType`。

   在以下示例中，将每个 *user input placeholder* 替换为您的集群信息。

   ```
   aws docdb describe-db-cluster-parameters \
     --db-cluster-parameter-group-name myparametergroup \
     --query 'Parameters[*].[ParameterName,ParameterValue,AllowedValues,ApplyType]'
   ```

   此操作的输出将类似如下（JSON 格式）：

   ```
   [
       [
           "audit_logs",
           "disabled",
           "enabled,disabled",
           "dynamic"
       ],
       [
           "tls",
           "disabled",
           "disabled,enabled,fips-140-3,tls1.2+,tls1.3+",
           "static"
       ],
       [
           "ttl_monitor",
           "enabled",
           "disabled,enabled",
           "dynamic"
       ]
   ]
   ```

1. **修改 `tls` 集群参数的值。**

   如果 `tls` 的值不是所需的，则为此集群参数组修改其值。要更改 `tls` 集群参数的值，请运行具有以下选项的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/docdb/modify-db-cluster-parameter-group.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/docdb/modify-db-cluster-parameter-group.html) 命令：
   + `--db-cluster-parameter-group-name` – 必需。要修改的集群参数组的名称。不能是 `default.*` 集群参数组。
   + `--parameters` – 必需。要修改的集群参数组的参数列表。
     + `ParameterName` – 必需。要修改的集群参数的名称。
     + `ParameterValue` – 必需。此集群参数的新值。必须是集群参数的 `AllowedValues` 之一。
       + `enabled`– 集群接受使用 TLS 版本 1.0 到 1.3 的安全连接。
       + `disabled` — 此集群不接受使用 TLS 的安全连接。
       + `fips-140-3` — 集群仅接受符合联邦信息处理标准 (FIPS) 出版物 140-3 要求的安全连接。仅在以下区域支持 Amazon DocumentDB 5.0（引擎版本 3.0.3727）集群启用：ca-central-1、us-west-2、us-east-1、us-east-2、us-gov-east-1、us-gov-west-1。
       + `tls1.2+` – 集群接受使用 TLS 版本 1.2 及更高版本的安全连接。从 Amazon DocumentDB 4.0（引擎版本 2.0.10980）和 Amazon DocumentDB 5.0（引擎版本 3.0.11051）开始才支持此功能。
       + `tls1.3+` – 集群接受使用 TLS 版本 1.3 及更高版本的安全连接。从 Amazon DocumentDB 4.0（引擎版本 2.0.10980）和 Amazon DocumentDB 5.0（引擎版本 3.0.11051）开始才支持此功能。
     + `ApplyMethod` — 何时应用此修改。对于静态集群参数（如 `tle`），此值必须为 `pending-reboot`。
       + `pending-reboot` — 仅在重启后才将更改应用到实例。您必须分别重启每个集群实例，以便此更改在所有集群实例上生效。

   在以下示例中，将每个 *user input placeholder* 替换为您的集群信息。

   以下代码*禁用* `tls`，在重启时将更改应用到每个实例。

   ```
   aws docdb modify-db-cluster-parameter-group \
     --db-cluster-parameter-group-name myparametergroup \
     --parameters "ParameterName=tls,ParameterValue=disabled,ApplyMethod=pending-reboot"
   ```

   以下代码*启用* `tls`（版本 1.0 到 1.3），在重启时将更改应用到每个实例。

   ```
   aws docdb modify-db-cluster-parameter-group \
     --db-cluster-parameter-group-name myparametergroup \
     --parameters "ParameterName=tls,ParameterValue=enabled,ApplyMethod=pending-reboot"
   ```

   以下代码*启用*带 `fips-140-3` 的 TLS，在重启时将更改应用到每个实例。

   ```
   aws docdb modify-db-cluster-parameter-group \
     ‐‐db-cluster-parameter-group-name myparametergroup2 \
     ‐‐parameters "ParameterName=tls,ParameterValue=fips-140-3,ApplyMethod=pending-reboot"
   ```

   此操作的输出将类似如下（JSON 格式）：

   ```
   {
       "DBClusterParameterGroupName": "myparametergroup"
   }
   ```

1. **重启 Amazon DocumentDB 实例**

   重启集群的每个实例，以便将更改应用到集群中的所有实例。要重启 Amazon DocumentDB 实例，请运行具有以下选项的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/docdb/reboot-db-instance.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/docdb/reboot-db-instance.html) 命令：
   + `--db-instance-identifier`

   以下代码将重启实例 `mydocdbinstance`。

   在以下示例中，将每个 *user input placeholder* 替换为您的集群信息。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws docdb reboot-db-instance \
     --db-instance-identifier mydocdbinstance
   ```

   对于 Windows：

   ```
   aws docdb reboot-db-instance ^
     --db-instance-identifier mydocdbinstance
   ```

   此操作的输出将类似如下（JSON 格式）：

   ```
   {
       "DBInstance": {
           "AutoMinorVersionUpgrade": true,
           "PubliclyAccessible": false,
           "PreferredMaintenanceWindow": "fri:09:32-fri:10:02",
           "PendingModifiedValues": {},
           "DBInstanceStatus": "rebooting",
           "DBSubnetGroup": {
               "Subnets": [
                   {
                       "SubnetStatus": "Active",
                       "SubnetAvailabilityZone": {
                           "Name": "us-east-1a"
                       },
                       "SubnetIdentifier": "subnet-4e26d263"
                   },
                   {
                       "SubnetStatus": "Active",
                       "SubnetAvailabilityZone": {
                           "Name": "us-east-1c"
                       },
                       "SubnetIdentifier": "subnet-afc329f4"
                   },
                   {
                       "SubnetStatus": "Active",
                       "SubnetAvailabilityZone": {
                           "Name": "us-east-1e"
                       },
                       "SubnetIdentifier": "subnet-b3806e8f"
                   },
                   {
                       "SubnetStatus": "Active",
                       "SubnetAvailabilityZone": {
                           "Name": "us-east-1d"
                       },
                       "SubnetIdentifier": "subnet-53ab3636"
                   },
                   {
                       "SubnetStatus": "Active",
                       "SubnetAvailabilityZone": {
                           "Name": "us-east-1b"
                       },
                       "SubnetIdentifier": "subnet-991cb8d0"
                   },
                   {
                       "SubnetStatus": "Active",
                       "SubnetAvailabilityZone": {
                           "Name": "us-east-1f"
                       },
                       "SubnetIdentifier": "subnet-29ab1025"
                   }
               ],
               "SubnetGroupStatus": "Complete",
               "DBSubnetGroupDescription": "default",
               "VpcId": "vpc-91280df6",
               "DBSubnetGroupName": "default"
           },
           "PromotionTier": 2,
           "DBInstanceClass": "db.r5.4xlarge",
           "InstanceCreateTime": "2018-11-05T23:10:49.905Z",
           "PreferredBackupWindow": "00:00-00:30",
           "KmsKeyId": "arn:aws:kms:us-east-1:012345678901:key/0961325d-a50b-44d4-b6a0-a177d5ff730b",
           "StorageEncrypted": true,
           "VpcSecurityGroups": [
               {
                   "Status": "active",
                   "VpcSecurityGroupId": "sg-77186e0d"
               }
           ],
           "EngineVersion": "3.6.0",
           "DbiResourceId": "db-SAMPLERESOURCEID",
           "DBInstanceIdentifier": "mydocdbinstance",
           "Engine": "docdb",
           "AvailabilityZone": "us-east-1a",
           "DBInstanceArn": "arn:aws:rds:us-east-1:012345678901:db:sample-cluster-instance-00",
           "BackupRetentionPeriod": 1,
           "Endpoint": {
               "Address": "mydocdbinstance.corcjozrlsfc.us-east-1.docdb.amazonaws.com",
               "Port": 27017,
               "HostedZoneId": "Z2R2ITUGPM61AM"
           },
           "DBClusterIdentifier": "mydocdbcluster"
       }
   }
   ```

   实例重启需要几分钟时间。只有在实例状态为 *available (可用)* 时，才能使用实例。您可以使用控制台或 AWS CLI 监控实例状态。有关更多信息，请参阅 [监控 Amazon DocumentDB 实例的状态](monitoring_docdb-instance_status.md)。

------

# 密钥管理
<a name="security.encryption.ssl.public-key"></a>

Amazon DocumentDB 使用 AWS Key Management Service (AWS KMS) 来检索和管理加密密钥。AWS KMS 将安全、高度可用的硬件和软件结合起来，以提供可针对云扩展的密钥管理系统。利用 AWS KMS，您可创建加密密钥并定义控制这些密钥的使用方式的策略。AWS KMS 支持 AWS CloudTrail，因此，您可审核密钥使用情况以验证密钥是否使用得当。

AWS KMS 密钥可以与 Amazon DocumentDB 以及支持的 AWS 服务一起使用，例如 Amazon Simple Storage Service (Amazon S3)、Amazon Relational Database Service (Amazon RDS)、Amazon Elastic Block Store (Amazon EBS) 和 Amazon Redshift。有关支持 AWS KMS 的服务的列表，请参阅 *AWS Key Management Service 开发人员指南*中的 [AWS 服务如何使用 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/service-integration.html)。有关 AWS KMS 的信息，请参阅[什么是 AWS Key Management Service？](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)