

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 安全性部落格*上的 [AWS 共同的責任模型和 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。
+ 使用 設定 API 和使用者活動記錄 AWS CloudTrail。如需有關使用 CloudTrail 追蹤擷取 AWS 活動的資訊，請參閱*AWS CloudTrail 《 使用者指南*》中的[使用 CloudTrail 追蹤](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解決方案，以及其中的所有預設安全控制 AWS 服務。
+ 使用進階的受管安全服務 (例如 Amazon Macie)，協助探索和保護儲存在 Amazon S3 的敏感資料。
+ 如果您在 AWS 透過命令列界面或 API 存取 時需要 FIPS 140-3 驗證的密碼編譯模組，請使用 FIPS 端點。如需有關 FIPS 和 FIPS 端點的更多相關資訊，請參閱[聯邦資訊處理標準 (FIPS) 140-3](https://aws.amazon.com/compliance/fips/)。

我們強烈建議您絕對不要將客戶的電子郵件地址等機密或敏感資訊，放在標籤或自由格式的文字欄位中，例如**名稱**欄位。這包括當您使用 Amazon DocumentDB 或其他 AWS 服務 使用 主控台、API AWS CLI或 AWS SDKs時。您在標籤或自由格式文字欄位中輸入的任何資料都可能用於計費或診斷日誌。如果您提供外部伺服器的 URL，我們強烈建議請勿在驗證您對該伺服器請求的 URL 中包含憑證資訊。

**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 中查詢](#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 會存放用於加密資料金鑰 (DKs) 的客戶金鑰 (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 政策。此政策允許其連接的 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. 定義要write/read/delete的集合：

   ```
   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()
```

## 在用戶端 FLE 中查詢
<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 並使用稱為信封加密的方法來保護您的資料。當 Amazon DocumentDB 叢集使用 加密時 AWS KMS，Amazon DocumentDB AWS KMS 會要求 使用您的 KMS 金鑰來[產生加密文字資料金鑰](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)來加密儲存磁碟區。加密文字資料金鑰會使用您定義的 KMS 金鑰進行加密，並與加密的資料和儲存中繼資料一起儲存。當 Amazon DocumentDB 需要存取加密的資料時，它會請求使用 KMS 金鑰 AWS KMS 解密加密文字資料金鑰，並在記憶體中快取純文字資料金鑰，以有效率地加密和解密儲存磁碟區中的資料。

Amazon DocumentDB 中的儲存加密設施適用於所有支援的執行個體大小，以及可使用 Amazon DocumentDB 的所有 AWS 區域 執行個體。

## 啟用 Amazon DocumentDB 叢集的靜態加密
<a name="encryption-at-rest-enabling"></a>

您可以使用 或 AWS 管理主控台 AWS Command Line Interface () 佈建叢集時，在 Amazon DocumentDB 叢集上啟用或停用靜態加密AWS CLI。您使用主控台所建立的叢集，依預設會啟用靜態加密。您使用 建立的叢集預設 AWS CLI 會停用靜態加密。因此，您必須使用 `--storage-encrypted` 參數明確啟用靜態加密。在任何一種情況下，當叢集建立之後，您都無法變更靜態加密選項。

Amazon DocumentDB 使用 AWS KMS 來擷取和管理加密金鑰，並定義控制這些金鑰使用方式的政策。如果您未指定 AWS KMS 金鑰識別符，Amazon DocumentDB 會使用預設的 AWS 受管服務 KMS 金鑰。Amazon DocumentDB 會為 AWS 區域 中的每個 建立單獨的 KMS 金鑰 AWS 帳戶。如需詳細資訊，請參閱 [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 開發人員指南*》[中的 中的非對稱金鑰 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. 建立 Amazon DocumentDB 叢集，如[入門](https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-ec2.launch-cluster.html)一節所述。不過，在步驟 6 中，請勿選擇 **Create cluster (建立叢集)**。

1. 在 **Authentication (身分驗證)** 區段下，選擇 **Show advanced settings (顯示進階設定)**。

1. 向下捲動到 **Encryption-at-rest (靜態加密)** 區段。

1. 選擇您要靜態加密採用的選項。無論選擇哪個選項，叢集建立之後都無法變更。
   + 若要對此叢集中的資料啟用靜態加密，請選擇 **Enable encryption (啟用加密)**。
   + 如果您不要對此叢集中的資料啟用靜態加密，請選擇 **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 ]

若要使用 加密 Amazon DocumentDB 叢集 AWS CLI，請執行 [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`選項。根據預設，使用 建立的 Amazon DocumentDB 叢集 AWS CLI 不會啟用儲存加密。

下列範例會建立已啟用儲存加密的 Amazon DocumentDB 叢集。

在下列範例中，將每個*使用者輸入預留位置*取代為您叢集的資訊。

**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>

您可以使用 Transport Layer Security (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 叢集的傳輸中加密是透過[叢集參數群組中的 TLS 參數](https://docs.aws.amazon.com/documentdb/latest/developerguide/cluster_parameter_groups.html)進行管理。您可以使用 AWS 管理主控台 或 AWS Command Line Interface () 管理您的 Amazon DocumentDB 叢集 TLS 設定AWS CLI。請參閱下列章節，了解如何驗證和修改您目前的 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)：//www.。

   1. 在導覽窗格中，選擇**叢集**。
**提示**  
如果畫面左側沒有出現導覽窗格，請選擇頁面左上角的功能表圖示 (![\[Hamburger menu icon with three horizontal lines.\]](http://docs.aws.amazon.com/zh_tw/documentdb/latest/developerguide/images/docdb-menu-icon.png))。

   1. 請注意，在**叢集**導覽方塊中，資料欄**叢集識別符**會顯示叢集和執行個體。執行個體會列在叢集下方。請參閱以下螢幕擷取畫面以取得參考。  
![\[叢集導覽方塊的影像，顯示現有叢集連結及其對應執行個體連結的清單。\]](http://docs.aws.amazon.com/zh_tw/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)：//www.。

   1. 在導覽窗格中，選擇 **Parameter groups** (參數群組)。

   1. 從叢集參數群組的清單中，選擇您有興趣之叢集參數群組的名稱。

   1. 找出 **Cluster parameters (叢集參數)** 區段。在叢集參數清單中，找出 `tls` 叢集參數列。此時，必須留意下列四欄：
      + **叢集參數名稱** — 叢集參數的名稱。若為管理 TLS，您對 `tls` 叢集參數有興趣。
      + **值** — 每個叢集參數的目前值。
      + **允許的值** — 可套用至叢集參數的值清單。
      + **套用類型** — **靜態**或**動態**。靜態叢集參數的變更必須在執行個體重新啟動後才能套用。可以立即或在執行個體重新啟動後套用動態叢集參數的變更。

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_tw/documentdb/latest/developerguide/images/modify-tls.png)

   1. 選擇 **Modify cluster parameter (修改叢集參數)**。此變更必須等到每個叢集執行個體重新啟動後才會套用。

1. **重新啟動 Amazon DocumentDB 執行個體。**

   重新啟動叢集的每個執行個體，讓變更套用到叢集中的所有執行個體。

   1. 開啟 Amazon DocumentDB 主控台，網址為 https：//[https://console.aws.amazon.com/docdb](https://console.aws.amazon.com/docdb).。

   1. 在導覽窗格中，選擇**執行個體**。

   1. 若要指定要重新啟動的執行個體，請在執行個體清單中找到執行個體，並選擇其名稱左側的按鈕。

   1. 選擇 **Actions (動作)**，然後 **Reboot (重新啟動)**。選擇 **Reboot (重新啟動)**，確認您要重新啟動。

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

請依照下列步驟，使用 執行 TLS 加密的管理任務 AWS CLI，例如識別參數群組、驗證 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`

   在下列範例中，將每個*使用者輸入預留位置*取代為您叢集的資訊。

   ```
   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`

     將輸出限制為僅感興趣的欄位：`ParameterValue``AllowedValues`、 `ParameterName`和 `ApplyType`。

   在下列範例中，將每個*使用者輸入預留位置*取代為您叢集的資訊。

   ```
   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` — 變更只會在重新啟動後套用至執行個體。您必須個別地重新啟動每個叢集執行個體，此變更才能在所有叢集執行個體中發生。

   在下列範例中，將每個*使用者輸入預留位置*取代為您叢集的資訊。

   下列程式碼*會停用* `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"
   ```

   下列程式碼會使用 *啟用* TLS`fips-140-3`，並在重新啟動時將變更套用至每個執行個體。

   ```
   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`。

   在下列範例中，將每個*使用者輸入預留位置*取代為您叢集的資訊。  
**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"
       }
   }
   ```

   執行個體重新啟動需要幾分鐘的時間來完成。您只能使用狀態為*可用*的執行個體。您可以使用主控台或 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)