

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

# DynamoDB 靜態加密
<a name="EncryptionAtRest"></a>

儲存在 Amazon DynamoDB 中的所有使用者資料都會完全靜態加密。DynamoDB 靜態加密使用存放在 [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) 的加密金鑰來加密所有靜態資料，藉此提供加強的安全性。此功能協助降低了保護敏感資料所涉及的操作負擔和複雜性。您可以透過靜態加密，建立符合嚴格加密合規和法規要求，而且對安全性要求甚高的應用程式。

每當資料存放到耐用的媒體時，DynamoDB 靜態加密就會透過保護加密資料表中的資料：包括其主索引鍵、本機及全域次要索引、串流、全域資料表、備份和 DynamoDB Accelerator (DAX) 叢集，來提供另一層資料保護。組織政策、行業或政府法規，以及合規要求可能會經常需要使用靜態加密來增加應用程式的資料安全性。如需有關資料庫應用程式加密的詳細資訊，請參閱 [AWS 資料庫加密 SDK](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/what-is-database-encryption-sdk.html)。

靜態加密與 整合 AWS KMS ，用於管理用來加密資料表的加密金鑰。如需金鑰類型與狀態的詳細資訊，請參閱AWS Key Management Service 開發人員指南**中的 [AWS Key Management Service 概念](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html#key-state-cmk-type)。

建立新資料表時，您可以選擇下列其中一種 AWS KMS key 類型來加密資料表。您可以隨時在這些金鑰類型之間切換。
+ **AWS 擁有的金鑰 –** 預設加密類型。此金鑰是由 DynamoDB 所擁有 (不需額外費用)。
+ **AWS 受管金鑰 –** 金鑰會存放在您的帳戶中，並由 管理 AWS KMS （需AWS KMS 付費）。
+ **客戶自管金鑰 –** 金鑰會存放在您的帳戶中，並且由您建立、擁有且管理。您可以完全控制 KMS 金鑰 （需支付AWS KMS 費用）。

如需金鑰類型的詳細資訊，請參閱[客戶金鑰和 AWS 金鑰](/kms/latest/developerguide/concepts.html#key-mgmt)。

**注意**  
建立啟用靜態加密的新 DAX 叢集時， AWS 受管金鑰 會用來加密叢集中的靜態資料。
如果您的資料表有排序索引鍵，則某些標示範圍界限的排序索引鍵將會以純文字的格式存放在資料表中繼資料中。

當您存取加密的資料表，DynamoDB 會以透明方式解密資料表資料。您不必變更任何代碼或應用程式來使用或管理加密的資料表。DynamoDB 會繼續提供您預期的個位數毫秒的相同延遲，且所有 DynamoDB 查詢會在加密資料上順暢地運作。

您可以使用 AWS 管理主控台、 AWS Command Line Interface (AWS CLI) 或 Amazon DynamoDB API，在建立新資料表或切換現有資料表上的加密金鑰時指定加密金鑰。若要了解作法，請參閱[在 DynamoDB 中管理加密資料表](encryption.tutorial.md)。

使用 AWS 擁有的金鑰 進行靜態加密是免費的。不過， AWS KMS AWS 受管金鑰 和 適用於客戶受管金鑰。如需定價的詳細資訊，請參閱 [AWS KMS 定價](https://aws.amazon.com/kms/pricing)。

DynamoDB 靜態加密適用於所有 AWS 區域，包括 AWS 中國 （北京） 和 AWS 中國 （寧夏） 區域和 AWS GovCloud （美國） 區域。如需詳細資訊，請參閱[DynamoDB 靜態加密運作原理](encryption.howitworks.md)及[DynamoDB 靜態加密使用須知](encryption.usagenotes.md)。

# DynamoDB 靜態加密運作原理
<a name="encryption.howitworks"></a>

Amazon DynamoDB 靜態加密功能會使用 256 位元的進階加密標準 (AES-256) 來加密您的資料，此項標準有助於防止對底層儲存未經授權的存取，進而保護您的資料。

靜態加密與 AWS Key Management Service (AWS KMS) 整合，用於管理用來加密資料表的加密金鑰。

**注意**  
在 2022 年 5 月， 的輪換排程 AWS 受管金鑰 從每三年 （約 1，095 天） AWS KMS 變更為每年 （約 365 天）。  
新的 AWS 受管金鑰 會在建立後自動輪換一年，之後大約每年輪換一次。  
現有的 AWS 受管金鑰 會在最近一次輪換後一年自動輪換，之後每年輪換一次。

## AWS 擁有的金鑰
<a name="ddb-owned"></a>

 AWS 擁有的金鑰 不會存放在您的帳戶中 AWS 。它們是 KMS 金鑰集合的一部分，其 AWS 擁有和管理用於多個 AWS 帳戶。 AWS 服務可以使用 AWS 擁有的金鑰 來保護您的資料。DynamoDB AWS 擁有的金鑰 使用的 會每年輪換 （約 365 天）。

您無法檢視、管理或使用 AWS 擁有的金鑰或稽核其使用方式。不過，您不需要執行任何工作或變更任何程式，即可保護加密您的資料的金鑰。

您不需要支付每月費用或使用費 AWS 擁有的金鑰，也不會計入您帳戶的 AWS KMS 配額。

## AWS 受管金鑰
<a name="managed-key-service-default-kms"></a>

AWS 受管金鑰 是您帳戶中的 KMS 金鑰，由與 整合的 AWS 服務代表您建立、管理和使用 AWS KMS。您可以檢視您的帳戶中的 AWS 受管金鑰 ，檢視其金鑰政策，以及在 AWS CloudTrail 日誌中稽核其使用方式。不過，您無法管理這些 KMS 金鑰或變更其許可。

靜態加密會自動與 整合 AWS KMS ，以管理用於加密資料表 AWS 受管金鑰 的 DynamoDB (`aws/dynamodb`) 專用 。如果在建立加密的 DynamoDB 資料表時 AWS 受管金鑰 不存在 ， AWS KMS 會自動為您建立新的金鑰。此金鑰會與未來建立的加密資料表搭配使用。 AWS KMS 結合安全、高可用性的硬體和軟體，以提供針對雲端擴展的金鑰管理系統。

如需管理 許可的詳細資訊 AWS 受管金鑰，請參閱[《 開發人員指南》中的授權使用 AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-authz) 。 *AWS Key Management Service *

## 客戶自管金鑰
<a name="managed-key-customer-managed"></a>

客戶受管金鑰是您帳戶中建立、擁有和管理 AWS 的 KMS 金鑰。您可以完全控制這些 KMS 金鑰，包括建立和維護其金鑰政策、IAM 政策和授與、啟用和停用它們、輪換其密碼編譯材料、新增標籤、建立參考別名，以及排程供刪除。如需管理客戶自管金鑰權限的詳細資訊，請參閱[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

當您指定一個客戶自管金鑰作為資料表層級加密金鑰時，DynamoDB 資料表、本機和全域次要索引及串流皆會以相同的客戶自管金鑰加密。隨需備份會以於備份建立時指定的資料表層級加密金鑰加密。更新資料表層級加密金鑰並不會變更與現有隨需備份相關的加密金鑰。

將客戶自管金鑰的狀態設為停用，或排定其刪除時間，可避免所有使用者和 DynamoDB 服務可在資料表上加密或解密資料，以及執行讀取或寫入操作。DynamoDB 必須能夠存取您的加密金鑰，才能確保您可以繼續存取資料表並避免資料遺失。

如果您停用客戶自管金鑰或排定其刪除的時間，您的資料表狀態就會成為 **Inaccessible** (無法存取)。為確保您可以持續使用資料表進行作業，您必須在七天內為指定的加密金鑰提供 DynamoDB 存取權限。只要服務偵測到您的加密金鑰無法存取，DynamoDB 就會寄送電子通知提醒您。

**注意**  
如果您的客戶自管金鑰仍然無法由 DynamoDB 服務存取且時間超過七天，資料表就會存檔並無法再存取。DynamoDB 會建立資料表的隨需備份，並會向您收取費用。您可以使用隨需備份還原您的資料至新的資料表。若要開始還原，最後一個在資料表中的客戶自管金鑰必須啟用，且 DynamoDB 必須可以存取該資料表。
如果用來加密全域資料表複本的客戶自管金鑰無法存取，DynamoDB 會從複寫群組中移除此複本。將不會刪除複本，且複寫將會在偵測到客戶自管金鑰為無法存取後 20 小時停止進出此區域。

如需更多詳細資訊，請參閱[啟用金鑰](/kms/latest/developerguide/enabling-keys.html)和[刪除金鑰。](/kms/latest/developerguide/deleting-keys.html)

## 使用 的注意事項 AWS 受管金鑰
<a name="managed-key-notes"></a>

除非 Amazon DynamoDB 可存取存放在您 AWS KMS 帳戶中的 KMS 金鑰，否則無法讀取您的資料表資料。DynamoDB 使用封套加密和金鑰階層來加密資料。您的 AWS KMS 加密金鑰用於加密此金鑰階層的根金鑰。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》中的[封套加密](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)。

 DynamoDB 不會 AWS KMS 呼叫每個 DynamoDB 操作。對於每個具活躍流量的用戶端連線，金鑰會每 5 分鐘重新整理一次。

請確定您已設定好 SDK，來重複使用連線。否則，您會遇到來自 DynamoDB 的延遲，必須為每個 DynamoDB 操作重新建立新的 AWS KMS 快取項目。此外，您可能必須面對更高的 AWS KMS 和 CloudTrail 成本。例如，若要使用 Node.js SDK 來執行這項動作，您可以在 `keepAlive` 開啟時，建立新的 HTTPS 代理。如需詳細資訊，請參閱《*適用於 JavaScript 的 AWS SDK 開發人員指南*》中的[在 Node.js 中設定 keepAlive](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-reusing-connections.html)。

# DynamoDB 靜態加密使用須知
<a name="encryption.usagenotes"></a>

在您使用 Amazon DynamoDB 中靜態加密時請考量以下項目。

## 所有資料表資料都會加密
<a name="encryption.usagenotes.tabledata"></a>

已對所有 DynamoDB 資料表資料啟用伺服器端靜態加密，且無法停用。您無法僅加密資料表中的項目子集。

只有持久性儲存媒體上的資料是靜態 (靜止) 時，靜態加密才會加密資料。如果對傳輸中資料或使用中資料有資料安全性的疑慮，您可能需要進行額外的措施：
+ 傳輸中的資料：DynamoDB 中的所有資料都是在傳輸中加密的。根據預設，與 DynamoDB 之間的通訊會使用 HTTPS 協定，其使用 Secure Sockets Layer (SSL)/Transport Layer Security (TLS) 加密保護網路流量。
+ 使用中資料：在將資料傳送至 DynamoDB 前使用用戶端加密來保護資料。如需詳細資訊，請參閱《Amazon DynamoDB Encryption Client 開發人員指南》中的[用戶端與伺服器端加密](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/client-server-side.html)。

您可以將串流與加密的資料表搭配著使用。DynamoDB Streams 一律會以資料表層級加密金鑰加密。如需詳細資訊，請參閱 [DynamoDB Streams 的變更資料擷取](Streams.md)。

DynamoDB 的備份會受到加密，且從備份恢復的資料表也已啟用加密。您可以使用 AWS 擁有的金鑰 AWS 受管金鑰或客戶受管金鑰來加密備份資料。如需詳細資訊，請參閱[DynamoDB 的備份與還原](Backup-and-Restore.md)。

本機次要索引和全域次要索引會使用與基礎資料表相同的金鑰加密。

## 加密類型
<a name="encryption.usagenotes.encryptiontypes"></a>

**注意**  
Global Table 版本 2017 不支援客戶自管金鑰。如果要在 DynamoDB Global Table 中使用客戶自管金鑰，則需要將資料表升級為 Global Table 版本 2019，然後將其啟用。

在 上 AWS 管理主控台，加密類型是當您使用 AWS 受管金鑰 或客戶受管金鑰來加密資料`KMS`時。使用 AWS 擁有的金鑰時，加密類型為 `DEFAULT`。在 Amazon DynamoDB API 中，加密類型是當您使用 AWS 受管金鑰 或客戶受管金鑰`KMS`時。在缺少加密類型的情況下，會使用 AWS 擁有的金鑰來加密資料。您可以隨時在 AWS 擁有的金鑰 AWS 受管金鑰和客戶受管金鑰之間切換。您可以使用 主控台、 AWS Command Line Interface (AWS CLI) 或 Amazon DynamoDB API 來切換加密金鑰。

請注意，使用客戶自管金鑰時有下列限制：
+ 您無法搭配 DynamoDB Accelerator (DAX) 叢集使用客戶自管金鑰。如需詳細資訊，請參閱 [DAX 靜態加密](DAXEncryptionAtRest.md)。
+ 您可以使用客戶自管金鑰來加密使用交易的資料表。不過，為了確保交易傳播的持久性，服務會暫時儲存交易請求的副本，並使用 AWS 擁有的金鑰進行加密。資料表和次要索引中已遞交的資料一律會使用客戶自管金鑰進行靜態加密。
+ 您可以使用客戶自管金鑰來加密使用 Contributor Insights 的資料表。不過，傳輸至 的資料 Amazon CloudWatch 會使用 加密 AWS 擁有的金鑰。
+ 當您轉換到新的客戶受管金鑰時，請務必保持啟用原始金鑰，直到程序完成為止。 AWS 仍然需要原始金鑰來解密資料，才能使用新的金鑰進行加密。當資料表的 SSE 描述狀態為「啟用」，且顯示新客戶自管金鑰的 KMSMasterKeyArn 時，程序就會完成。此時可以停用或排程刪除原始金鑰。
+ 顯示新的客戶自管金鑰後，資料表和任何新的隨需備份都會使用新的金鑰加密。
+ 任何現有的隨需備份都會使用建立備份時使用的客戶自管金鑰進行加密。您將需要相同的金鑰來還原這些備份。您可以使用 DescribeBackup API 來檢視該備份的 SSE 描述，識別建立每個備份的期間的金鑰。
+ 如果您停用客戶自管金鑰或排定其刪除的時間，所有在 DynamoDB Streams 中的資料仍有 24 小時的生命週期。任何未擷取的活動資料如果超過 24 小時，則符合裁剪的資格。
+ 如果您停用客戶自管金鑰或排定其刪除的時間，存留時間 (TTL) 刪除就會持續 30 分鐘。這些 TTL 刪除會持續發出至 DynamoDB Streams，並符合標準裁剪/保留間隔。

  如需更多詳細資訊，請參閱[啟用金鑰](/kms/latest/developerguide/enabling-keys.html)和[刪除金鑰。](/kms/latest/developerguide/deleting-keys.html)

## 使用 KMS 金鑰和資料金鑰
<a name="dynamodb-kms"></a>

DynamoDB 靜態加密功能使用 AWS KMS key 和資料金鑰階層來保護您的資料表資料。當 DynamoDB 串流、全域資料表和備份寫入到持久性媒體時，DynamoDB 會使用相同的金鑰階層來保護 DynamoDB 串流、全域資料表和備份。

我們建議您先規劃加密策略，再於 DynamoDB 中使用資料表。如果您將敏感或機密資料儲存在 DynamoDB，請考慮在計劃中加入用戶端加密。如此一來，您就能盡量靠近資料來源進行加密，並確保資料在整個生命週期受到保護。如需詳細資訊，請參閱 [DynamoDB 加密客戶端](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/what-is-ddb-encrypt.html)文件。

**AWS KMS key**  
靜態加密會保護 AWS KMS key下的 DynamoDB 資料表。根據預設，DynamoDB 會使用 [AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)，這是一種在 DynamoDB 服務帳戶中建立和管理的多租用戶加密金鑰。但是，您可以使用[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)或 AWS 帳戶中 DynamoDB (`aws/dynamodb`) 加密您的 DynamoDB 資料表。您可以為每個資料表選取不同的 KMS 金鑰。您為資料表選取的 KMS 金鑰也會用來加密其本機和全域次要索引、串流和備份。  
建立或更新資料表時，您可以選取資料表的 KMS 金鑰。您可以隨時在 DynamoDB 主控台或使用 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) 操作變更資料表的 KMS 金鑰。切換金鑰的程序是無縫的，且不需要停機時間或降低服務效能。  
DynamoDB 僅支援[對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)。您無法使用[非對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html#asymmetric-cmks)來加密您的 DynamoDB 資料表。
使用客戶自管金鑰來取得下列功能：  
+ 您可以建立和管理 KMS 金鑰，包括設定[金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)、[IAM 政策](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)和[授予](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)來控制對 KMS 金鑰的存取。您可以[啟用和停用](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html) KMS 金鑰、啟用和停用[自動金鑰輪換](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)，以及於不再使用時[刪除 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html)。
+ 您可以搭配[匯入的金鑰材料](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html)使用客戶自管金鑰，或是使用位於您所擁有及管理[自訂金鑰存放區](https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html)中的客戶自管金鑰。
+ 您可以在 [AWS CloudTrail 日誌](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail) AWS KMS 中檢查對 的 DynamoDB API 呼叫，以稽核 DynamoDB 資料表的加密和解密。
 AWS 受管金鑰 如果您需要以下任何功能，請使用 ：  
+ 您可以[檢視 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html)和[檢視其金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-viewing.html)。(您無法變更金鑰政策。)
+ 您可以在[AWS CloudTrail 日誌](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail) AWS KMS 中檢查對 的 DynamoDB API 呼叫，以稽核 DynamoDB 資料表的加密和解密。
不過， AWS 擁有的金鑰 是免費的，其使用不會計入[AWS KMS 資源或請求配額](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)。客戶受管金鑰和 會針對每個 API AWS KMS 呼叫 AWS 受管金鑰 [產生費用](https://aws.amazon.com/kms/pricing/)，而配額適用於這些 KMS 金鑰。

**資料表金鑰**  
DynamoDB 對資料表使用 KMS 金鑰來為資料表[產生](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)和加密唯一的[資料金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)，稱為*資料表金鑰*。資料表金鑰會在加密資料表的生命週期內持續存在。  
資料表金鑰用作金鑰加密金鑰。DynamoDB 使用此資料表金鑰來保護用於加密資料表資料的資料加密金鑰。DynamoDB 會為資料表中的每個基礎結構產生唯一的資料加密金鑰，但多個資料表項目可能受到相同的資料加密金鑰保護。  

![\[使用靜態加密來加密 DynamoDB 資料表\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/service-ddb-encrypt.png)

當您第一次存取加密的資料表時，DynamoDB 會傳送請求給 AWS KMS ，以使用 KMS 金鑰來解密資料表金鑰。然後，它使用純文字資料表金鑰來解密資料加密金鑰，並使用純文字資料加密金鑰來解密資料表資料。  
DynamoDB 會存放並使用 外部的資料表金鑰和資料加密金鑰 AWS KMS。它使用[進階加密標準](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) 加密和 256 位元加密金鑰來保護所有金鑰。然後，它會將加密金鑰與加密資料一起存放，以便這些資料可用來隨需解密資料表。  
如果您變更了資料表的 KMS 金鑰，DynamoDB 便會產生新的資料表金鑰。然後，使用新的資料表金鑰來重新加密資料加密金鑰。

**資料表金鑰快取**  
為了避免 AWS KMS 針對每個 DynamoDB 操作呼叫 ，DynamoDB 會快取記憶體中每個呼叫者的純文字資料表金鑰。如果 DynamoDB 在閒置五分鐘後收到快取資料表金鑰的請求，則會將新的請求傳送至 AWS KMS 以解密資料表金鑰。此呼叫將擷取自上次請求解密資料表金鑰以來，對 或 AWS Identity and Access Management (IAM) 中 AWS KMS KMS 金鑰存取政策所做的任何變更。

## 授權使用您的 KMS 金鑰
<a name="dynamodb-kms-authz"></a>

如果您使用[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)或帳戶中的 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 保護您的 DynamoDB 資料表，該 KMS 金鑰的政策必須允許 DynamoDB 代您使用該金鑰。 AWS 受管金鑰 適用於 DynamoDB 的 上的授權內容包含其金鑰政策和授予，以委派使用它的許可。

您可以完全控制客戶自管金鑰的政策和授予，因為 AWS 受管金鑰 在您的帳戶中，您可以檢視其政策和授予。但是，由於由 管理 AWS，您無法變更政策。

DynamoDB 不需要額外的授權，即可使用預設值[AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)來保護您 中的 DynamoDB 資料表 AWS 帳戶。

**Topics**
+ [的金鑰政策 AWS 受管金鑰](#dynamodb-policies)
+ [客戶自管金鑰的金鑰政策](#dynamodb-customer-cmk-policy)
+ [使用授予來授權 DynamoDB](#dynamodb-grants)

### 的金鑰政策 AWS 受管金鑰
<a name="dynamodb-policies"></a>

當 DynamoDB 在密碼編譯操作中使用適用於 DynamoDB (`aws/dynamodb`) 的 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 時，它是代表正在存取 [DynamoDB 資源](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-overview.html)的使用者進行這項操作。上的金鑰政策 AWS 受管金鑰 提供帳戶中所有使用者使用 AWS 受管金鑰 進行指定操作的許可。但是，只有在 DynamoDB 代表使用者提出請求時才會授予許可。除非請求源自 DynamoDB 服務， AWS 受管金鑰 否則金鑰政策中的 [ViaService 條件](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service)不允許任何使用者使用 。

此金鑰政策與所有政策一樣 AWS 受管金鑰，是由 建立 AWS。您不能改變它，但可以隨時檢視它。如需詳細資訊，請參閱[檢視金鑰政策](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-viewing.html)。

金鑰政策中的政策陳述式具有下列效果：
+ 當請求來自 DynamoDB 時，允許帳戶中的使用者在密碼編譯操作中使用 AWS 受管金鑰 適用於 DynamoDB 的 。此政策也允許使用者為 KMS 金鑰[建立授予](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-grants)。
+ 允許帳戶中授權的 IAM 身分檢視 DynamoDB AWS 受管金鑰 的屬性，並[撤銷允許 DynamoDB 使用 KMS 金鑰的授予](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)。DynamoDB 使用[授予](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-grants)進行持續的維護操作。
+ 允許 DynamoDB 執行唯讀操作，在您的帳戶中尋找 AWS 受管金鑰 適用於 DynamoDB 的 。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id" : "auto-dynamodb-1",
  "Statement" : [ {
    "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "*"
    },
    "Action" : [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey" ],
    "Resource" : "*",
    "Condition" : {
      "StringEquals" : {
        "kms:CallerAccount" : "111122223333",
        "kms:ViaService" : "dynamodb.us-west-2.amazonaws.com"
      }
    }
  }, {
    "Sid" : "Allow direct access to key metadata to the account",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::111122223333:root"
    },
    "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ],
    "Resource" : "*"
  }, {
    "Sid" : "Allow DynamoDB Service with service principal name dynamodb.amazonaws.com to describe the key directly",
    "Effect" : "Allow",
    "Principal" : {
      "Service" : "dynamodb.amazonaws.com"
    },
    "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*" ],
    "Resource" : "*"
  } ]
}
```

------

### 客戶自管金鑰的金鑰政策
<a name="dynamodb-customer-cmk-policy"></a>

當您選取[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)來保護 DynamoDB 資料表時，DynamoDB 會取得許可，代替進行選取的主體使用 KMS 金鑰。該主體 (使用者或角色) 必須在 KMS 金鑰上擁有 DynamoDB 需要的許可。您可以在[金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)、[IAM 政策](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)或[授予](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)中提供這些許可。

至少，DynamoDB 在客戶自管金鑰上需要具備下列許可：
+ [kms:Encrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)
+ [kms:ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html)\$1 (適用於 kms:ReEncryptFrom and kms:ReEncryptTo)
+ kms:GenerateDataKey\$1 (適用於 [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 和 [kms:GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html))
+ [kms:DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)
+ [kms:CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)

例如，以下範例金鑰政策只會提供必要許可。政策具有下列效果：
+ 允許 DynamoDB 在密碼編譯操作中使用 KMS 金鑰並建立授予，但只有在其代替具備使用 DynamoDB 許可帳戶中的主體時才能進行。如果政策陳述式中指定的主體沒有使用 DynamoDB 的許可，呼叫便會失敗，即使呼叫是來自 DynamoDB 服務也一樣。
+ [kms:ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service) 條件索引鍵只會在請求來自 DynamoDB，且其是代替政策陳述式中列出的主體時，才會允許許可。這些主體無法直接呼叫這些操作。請注意，`kms:ViaService` 值 (`dynamodb.*.amazonaws.com`) 在區域位置中有星號 (\$1)。DynamoDB 需要獨立於任何特定 的許可， AWS 區域 才能進行跨區域呼叫以支援 [DynamoDB 全域資料表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html)。
+ 給予 KMS 金鑰管理員 (可取得 `db-team` 角色的使用者) 對 KMS 金鑰的唯讀存取權以及撤銷授予的許可，包括 [DynamoDB 需要用來保護資料表的授予](#dynamodb-grants)。

使用範例金鑰政策之前，請將範例主體取代為來自您的實際主體 AWS 帳戶。

------
#### [ JSON ]

****  

```
{
  "Id": "key-policy-dynamodb",
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::111122223333:user/db-lead"},
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey",
        "kms:CreateGrant"
      ],
      "Resource": "*",      
      "Condition": { 
         "StringLike": {
           "kms:ViaService" : "dynamodb.*.amazonaws.com"
         }
      }
    },
    {
      "Sid":  "Allow administrators to view the KMS key and revoke grants",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/db-team"
       },
      "Action": [
        "kms:Describe*",
        "kms:Get*",
        "kms:List*",
        "kms:RevokeGrant"
      ],
      "Resource": "*"
    }
  ]
}
```

------

### 使用授予來授權 DynamoDB
<a name="dynamodb-grants"></a>

除了金鑰政策外，DynamoDB 會使用授予在客戶自管金鑰或 AWS 受管金鑰 for DynamoDB (`aws/dynamodb`) 上設定許可。若要檢視您帳戶中 KMS 金鑰的授予，請使用 [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) 操作。DynamoDB 不需要授予或任何其他許可，即可使用 [AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk) 來保護您的資料表。

DynamoDB 在執行背景系統維護和持續資料保護任務時使用授予許可。它還使用授與來產生[資料表金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-encrypt)。

每個授與都專屬於一個資料表。如果帳戶包含使用相同 KMS 金鑰加密的多個資料表，則每個資料表有每一種類型的授予。授予受到 [DynamoDB 加密內容](#dynamodb-encryption-context)的限制，其中包含資料表名稱和 AWS 帳戶 ID，並包含不再需要的淘[汰授予](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html)的許可。

如要建立授予，DynamoDB 必須擁有代替建立加密資料表使用者呼叫 `CreateGrant` 的許可。對於 AWS 受管金鑰，DynamoDB 會從[金鑰政策](#dynamodb-policies)取得`kms:CreateGrant`許可，這允許帳戶使用者只有在 DynamoDB 代表授權使用者提出請求時，才對 KMS 金鑰呼叫 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)。

金鑰政策也會允許帳戶[撤銷 KMS 金鑰上的授予](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)。不過，如果您撤銷作用中加密資料表的授予，DynamoDB 將無法保護和維護資料表。

## DynamoDB 加密內容
<a name="dynamodb-encryption-context"></a>

[加密內容](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)是一組金鑰/值對，其中包含任意非私密資料。當您在加密資料的請求中包含加密內容時， 會以 AWS KMS 加密方式將加密內容繫結至加密的資料。若要解密資料，您必須傳遞相同的加密內容。

DynamoDB 在所有 AWS KMS 密碼編譯操作中使用相同的加密內容。如果使用[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)或 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 來保護您的 DynamoDB 資料表，您可以使用加密內容來識別在稽核記錄和日誌中使用 KMS 金鑰的情況。它還會在日誌中以純文字顯示，例如 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 和 [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)。

加密內容也可以用作政策和授予中的授權條件。DynamoDB 使用加密內容來限制允許存取客戶受管金鑰或您 AWS 受管金鑰 帳戶和區域中的[授予](#dynamodb-grants)。

在其對 的請求中 AWS KMS，DynamoDB 使用具有兩個鍵/值對的加密內容。

```
"encryptionContextSubset": {
    "aws:dynamodb:tableName": "Books"
    "aws:dynamodb:subscriberId": "111122223333"
}
```
+ **資料表** – 第一個鍵值對會識別 DynamoDB 正在加密的資料表。金鑰為 `aws:dynamodb:tableName`。值是資料表的名稱。

  ```
  "aws:dynamodb:tableName": "<table-name>"
  ```

  例如：

  ```
  "aws:dynamodb:tableName": "Books"
  ```
+ **帳戶** – 第二個鍵值對會識別 AWS 帳戶。金鑰為 `aws:dynamodb:subscriberId`。值是帳戶 ID。

  ```
  "aws:dynamodb:subscriberId": "<account-id>"
  ```

  例如：

  ```
  "aws:dynamodb:subscriberId": "111122223333"
  ```

## 監控 DynamoDB 與 的互動 AWS KMS
<a name="dynamodb-cmk-trail"></a>

如果您使用[客戶受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)或 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)來保護 DynamoDB 資料表，您可以使用 AWS CloudTrail 日誌來追蹤 DynamoDB AWS KMS 代表您傳送到 的請求。

本節將討論 `GenerateDataKey`、`Decrypt` 和 `CreateGrant` 請求。此外，DynamoDB 會使用 [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) 操作來判斷您選取的 KMS 金鑰是否存在於帳戶和區域內。當您刪除資料表時，它也使用 [RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html) 操作來移除授與。

**GenerateDataKey**  
當您在資料表上啟用靜態加密時，DynamoDB 會建立唯一的資料表金鑰。它會將 *[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)* 請求傳送至 AWS KMS ，以指定資料表的 KMS 金鑰。  
記錄 `GenerateDataKey` 操作的事件類似於以下範例事件。使用者是 DynamoDB 服務帳戶。參數包括秘密 KMS 金鑰的 Amazon Resource Name (ARN)、需要 256 位元金鑰的金鑰規範，以及識別資料表和 AWS 帳戶的[加密內容](#dynamodb-encryption-context)。  

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AWSService", 
        "invokedBy": "dynamodb.amazonaws.com" 
    },
    "eventTime": "2018-02-14T00:15:17Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKey",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "dynamodb.amazonaws.com",
    "userAgent": "dynamodb.amazonaws.com",
    "requestParameters": {
        "encryptionContext": {
            "aws:dynamodb:tableName": "Services",
            "aws:dynamodb:subscriberId": "111122223333"
        }, 
        "keySpec": "AES_256", 
        "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
    }, 
    "responseElements": null,
    "requestID": "229386c1-111c-11e8-9e21-c11ed5a52190",
    "eventID": "e3c436e9-ebca-494e-9457-8123a1f5e979",
    "readOnly": true,
    "resources": [
        {
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333",
            "type": "AWS::KMS::Key" 
        } 
    ],
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333",
    "sharedEventID": "bf915fa6-6ceb-4659-8912-e36b69846aad"
}
```

**解密**  
當您存取加密的 DynamoDB 資料表時，DynamoDB 需要解密資料表金鑰以便解密階層下方的金鑰。然後解密資料表中的資料。解密資料表金鑰。DynamoDB 會將[解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)請求傳送至 AWS KMS ，以指定資料表的 KMS 金鑰。  
記錄 `Decrypt` 操作的事件類似於以下範例事件。使用者是您存取資料表的委託 AWS 帳戶 人。這些參數包括加密的資料表金鑰 （做為加密文字 Blob)，以及識別資料表和 的[加密內容](#dynamodb-encryption-context) AWS 帳戶。 會從加密文字 AWS KMS 衍生 KMS 金鑰的 ID。  

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAIGDTESTANDEXAMPLE:user01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01",
        "accountId": "111122223333",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false", 
                "creationDate": "2018-02-14T16:42:15Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAIGDT3HGFQZX4RY6RU",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin" 
            }
        },
        "invokedBy": "dynamodb.amazonaws.com"
    },
    "eventTime": "2018-02-14T16:42:39Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "dynamodb.amazonaws.com",
    "userAgent": "dynamodb.amazonaws.com",
    "requestParameters": 
    {
        "encryptionContext":
        {
            "aws:dynamodb:tableName": "Books",
            "aws:dynamodb:subscriberId": "111122223333" 
        }
    }, 
    "responseElements": null, 
    "requestID": "11cab293-11a6-11e8-8386-13160d3e5db5",
    "eventID": "b7d16574-e887-4b5b-a064-bf92f8ec9ad3", 
    "readOnly": true, 
    "resources": [ 
        {
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333", 
            "type": "AWS::KMS::Key" 
        }
    ],
    "eventType": "AwsApiCall", 
    "recipientAccountId": "111122223333"
}
```

**CreateGrant**  
當您使用[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)或 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 保護您的 DynamoDB 資料表時，DynamoDB 會使用[授權](#dynamodb-grants)，以允許服務執行持續資料保護和維護及耐用性任務。[AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk) 上不需要這些授予。  
DynamoDB 建立的授予專屬於特定資料表。[CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 請求中的主體是建立資料表的使用者。  
記錄 `CreateGrant` 操作的事件類似於以下範例事件。參數包括資料表的 KMS 金鑰的 Amazon Resource Name (ARN)、承授者主體和淘汰主體 (DynamoDB 服務)，以及授予涵蓋的操作。它還包含一個限制，要求所有加密操作使用指定的[加密內容](#dynamodb-encryption-context)。  

```
{ 
    "eventVersion": "1.05", 
    "userIdentity": 
    { 
        "type": "AssumedRole", 
        "principalId": "AROAIGDTESTANDEXAMPLE:user01", 
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", 
        "accountId": "111122223333", 
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE", 
        "sessionContext": { 
            "attributes": { 
                "mfaAuthenticated": "false", 
                "creationDate": "2018-02-14T00:12:02Z" 
            }, 
            "sessionIssuer": { 
                "type": "Role", 
                "principalId": "AROAIGDTESTANDEXAMPLE", 
                "arn": "arn:aws:iam::111122223333:role/Admin", 
                "accountId": "111122223333", 
                "userName": "Admin" 
            }
        }, 
        "invokedBy": "dynamodb.amazonaws.com" 
    }, 
    "eventTime": "2018-02-14T00:15:15Z", 
    "eventSource": "kms.amazonaws.com", 
    "eventName": "CreateGrant", 
    "awsRegion": "us-west-2", 
    "sourceIPAddress": "dynamodb.amazonaws.com", 
    "userAgent": "dynamodb.amazonaws.com", 
    "requestParameters": { 
        "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab", 
        "retiringPrincipal": "dynamodb.us-west-2.amazonaws.com", 
        "constraints": { 
            "encryptionContextSubset": {
                "aws:dynamodb:tableName": "Books",
                "aws:dynamodb:subscriberId": "111122223333" 
            } 
        }, 
        "granteePrincipal": "dynamodb.us-west-2.amazonaws.com", 
        "operations": [ 
            "DescribeKey", 
            "GenerateDataKey", 
            "Decrypt", 
            "Encrypt", 
            "ReEncryptFrom", 
            "ReEncryptTo", 
            "RetireGrant" 
        ] 
    }, 
    "responseElements": { 
        "grantId": "5c5cd4a3d68e65e77795f5ccc2516dff057308172b0cd107c85b5215c6e48bde" 
    }, 
    "requestID": "2192b82a-111c-11e8-a528-f398979205d8", 
    "eventID": "a03d65c3-9fee-4111-9816-8bf96b73df01", 
    "readOnly": false, 
    "resources": [ 
        { 
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333", 
            "type": "AWS::KMS::Key" 
        } 
    ], 
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333"
}
```

# 在 DynamoDB 中管理加密資料表
<a name="encryption.tutorial"></a>

您可以使用 AWS 管理主控台 或 AWS Command Line Interface (AWS CLI) 在新資料表上指定加密金鑰，並更新 Amazon DynamoDB 中現有資料表上的加密金鑰。

**Topics**
+ [指定新資料表的加密金鑰](#encryption.tutorial-creating)
+ [更新加密金鑰](#encryption.tutorial-update)

## 指定新資料表的加密金鑰
<a name="encryption.tutorial-creating"></a>

請依照這些步驟，使用 Amazon DynamoDB 主控台或 AWS CLI在新資料表上指定加密金鑰。

### 建立加密資料表 (主控台)
<a name="encryption.tutorial-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1.  在主控台左側的導覽窗格中，選擇 **Tables** (資料表)。

1. 選擇 **Create Table** (建立資料表)。針對**資料表名稱**，輸入 **Music**。針對主索引鍵，輸入 **Artist**，對於排序索引鍵，輸入 **SongTitle**，兩者都做為字串。

1. 在 **Settings** (設定) 中，確認選取 **Customize settings** (自訂設定)。
**注意**  
如果選取**使用預設設定**，則會使用 AWS 擁有的金鑰 靜態加密資料表，無需額外費用。

1. 在**靜態加密**下，選擇加密類型 - AWS 擁有的金鑰 AWS 受管金鑰、 或客戶受管金鑰。
   +  **由 Amazon DynamoDB ** AWS 擁有的金鑰，由 DynamoDB 特別擁有和管理。使用此金鑰不會向您收取額外費用。
   + **AWS 受管金鑰**。金鑰別名：`aws/dynamodb`。金鑰會存放在您的帳戶中，並由 AWS Key Management Service (AWS KMS) 管理。需支付 AWS KMS 費用。
   +  **儲存在您的帳戶中，且由您擁有和管理。**客戶自管金鑰。金鑰會存放在您的帳戶中，並由 AWS Key Management Service (AWS KMS) 管理。需支付 AWS KMS 費用。
**注意**  
如果您選擇擁有和管理自己的金鑰，請確保已正確設定 KMS 金鑰政策。如需詳細資訊及範例，請參閱[客戶自管金鑰的金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

1. 選擇 **Create table** (建立資料表) 以建立加密資料表。若要確認加密類型，選取 **Overview** (概觀) 標籤中的資料表詳細資訊並檢閱 **Additional details** (其他詳細資訊) 區段。

### 建立加密資料表 (AWS CLI)
<a name="encryption.tutorial-cli"></a>

使用 AWS CLI 為 Amazon DynamoDB 建立具有預設 AWS 擁有的金鑰、 AWS 受管金鑰或客戶受管金鑰的資料表。

**使用預設值建立加密的資料表 AWS 擁有的金鑰**
+ 建立加密的 `Music` 資料表，如下所示。

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5
  ```
**注意**  
此資料表現在使用 AWS 擁有的金鑰 DynamoDB 服務帳戶中的預設值加密。

**使用 AWS 受管金鑰 適用於 DynamoDB 的 建立加密資料表**
+ 建立加密的 `Music` 資料表，如下所示。

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5 \
    --sse-specification Enabled=true,SSEType=KMS
  ```

   資料表描述的 `SSEDescription` 狀態會設為 `ENABLED`，而 `SSEType` 設為 `KMS`。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

**使用 DynamoDB 由客戶自管金鑰建立加密資料表**
+ 建立加密的 `Music` 資料表，如下所示。

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5 \
    --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=abcd1234-abcd-1234-a123-ab1234a1b234
  ```
**注意**  
對於 `KMSMasterKeyId`，您可以使用金鑰 ID、金鑰 ARN 或金鑰別名。如果您使用金鑰別名 （例如 `alias/my-key`)，DynamoDB 會解析別名，並將基礎 AWS KMS 金鑰與資料表建立關聯。在資料表描述中， `KMSMasterKeyArn`一律會顯示已解析金鑰的金鑰 ARN，而不是別名。如需金鑰識別符的詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[金鑰識別符 (KeyId)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id)。

   資料表描述的 `SSEDescription` 狀態會設為 `ENABLED`，而 `SSEType` 設為 `KMS`。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

## 更新加密金鑰
<a name="encryption.tutorial-update"></a>

您也可以使用 DynamoDB 主控台或 AWS CLI ，隨時更新 AWS 擁有的金鑰 AWS 受管金鑰和客戶受管金鑰之間現有資料表的加密金鑰。

### 更新加密金鑰 (主控台)
<a name="encryption.tutorial-update-console"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1.  在主控台左側的導覽窗格中，選擇 **Tables** (資料表)。

1. 選擇您要更新的資料表。

1. 選取 **Actions** (動作) 下拉式清單，然後選取 **Update settings** (更新設定) 選項。

1. 轉至 **Additional settings** (其他設定) 索引標籤。

1. 在 **Encryption** (加密) 下，選擇 **Manage encryption** (管理加密)。

1. 選擇加密類型：
   +  **由 Amazon DynamoDB 擁有。** AWS KMS 金鑰由 DynamoDB 擁有和管理。使用此金鑰不會向您收取額外費用。
   + **AWS 受管金鑰**金鑰別名：`aws/dynamodb`。金鑰會存放在您的帳戶中，並由 管理 AWS Key Management Service。 (AWS KMS)。需支付 AWS KMS 費用。
   +  **儲存在您的帳戶中，且由您擁有和管理。**金鑰會存放在您的帳戶中，並由 管理 AWS Key Management Service。 (AWS KMS)。需支付 AWS KMS 費用。
**注意**  
如果您選擇擁有和管理自己的金鑰，請確保已正確設定 KMS 金鑰政策。如需詳細資訊，請參閱[客戶自管金鑰的金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

   然後，選擇 **Save (儲存)** 以更新加密資料表。若要確認加密類型，檢查 **Overview (概觀)** 索引標籤下的資料表詳細資訊。

### 更新加密金鑰 (AWS CLI)
<a name="encryption.tutorial-update-cli"></a>

下列範例顯示如何使用 AWS CLI更新加密資料表。

**使用預設值更新加密的資料表 AWS 擁有的金鑰**
+ 更新加密的 `Music` 資料表，如下列範例所示。

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=false
  ```
**注意**  
此資料表現在使用 AWS 擁有的金鑰 DynamoDB 服務帳戶中的預設值加密。

**使用 AWS 受管金鑰 適用於 DynamoDB 的 更新加密的資料表**
+ 更新加密的 `Music` 資料表，如下列範例所示。

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=true
  ```

   資料表描述的 `SSEDescription` 狀態會設為 `ENABLED`，而 `SSEType` 設為 `KMS`。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

**使用 DynamoDB 由客戶自管金鑰更新加密資料表**
+ 更新加密的 `Music` 資料表，如下列範例所示。

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=abcd1234-abcd-1234-a123-ab1234a1b234
  ```
**注意**  
對於 `KMSMasterKeyId`，您可以使用金鑰 ID、金鑰 ARN 或金鑰別名。如果您使用金鑰別名 （例如 `alias/my-key`)，DynamoDB 會解析別名，並將基礎 AWS KMS 金鑰與資料表建立關聯。在資料表描述中， `KMSMasterKeyArn`一律會顯示已解析金鑰的金鑰 ARN，而不是別名。

   資料表描述的 `SSEDescription` 狀態會設為 `ENABLED`，而 `SSEType` 設為 `KMS`。

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```