設定現有的 DynamoDB 資料表以使用 DynamoDB 的 AWS Database Encryption SDK - AWS 資料庫加密 SDK

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

設定現有的 DynamoDB 資料表以使用 DynamoDB 的 AWS Database Encryption SDK

我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍會提供 DynamoDB Encryption Client 的相關資訊。

使用適用於 DynamoDB 的 Java 用戶端加密程式庫 3.x 版,您可以設定現有的 Amazon DynamoDB 資料表進行用戶端加密。本主題提供在現有已填入的 DynamoDB 資料表中新增 3.x 版時必須採取的三個步驟指引。

先決條件

DynamoDB 的 Java 用戶端加密程式庫 3.x 版需要 提供的 DynamoDB 增強型用戶端 AWS SDK for Java 2.x 。如果您仍然使用 DynamoDBMapper,您必須遷移至 AWS SDK for Java 2.x ,才能使用 DynamoDB 增強型用戶端。

請遵循從 1.x 版遷移至 2.x 版 AWS SDK for Java的指示。

然後,遵循使用 DynamoDB 增強型用戶端 API 開始使用的指示。

設定資料表以使用 DynamoDB 的 Java 用戶端加密程式庫之前,您需要TableSchema使用註釋的資料類別產生 ,建立增強型用戶端

步驟 1:準備讀取和寫入加密的項目

請完成下列步驟,以準備您的 AWS Database Encryption SDK 用戶端讀取和寫入加密的項目。部署下列變更之後,用戶端將繼續讀取和寫入純文字項目。它不會加密或簽署寫入資料表的任何新項目,但一旦加密項目出現,它就能夠立即解密。這些變更可讓用戶端開始加密新項目。您必須先將下列變更部署到每個讀取器,才能繼續下一個步驟。

1. 定義您的屬性動作

更新您的註釋資料類別,以包含屬性動作,這些動作定義哪些屬性值會加密和簽署,哪些值只會簽署,哪些則會忽略。

如需 DynamoDB 增強型用戶端註釋的詳細資訊,請參閱 GitHub 上 aws-database-encryption-sdk-dynamodb 儲存庫中的 SimpleClass.java

根據預設,主要金鑰屬性會經過簽署但未加密 (SIGN_ONLY),而所有其他屬性則會經過加密和簽署 (ENCRYPT_AND_SIGN)。若要指定例外狀況,請使用 DynamoDB 的 Java 用戶端加密程式庫中定義的加密註釋。例如,如果您希望特定屬性僅簽署 ,請使用 @DynamoDbEncryptionSignOnly註釋。如果您想要在加密內容中簽署並包含特定屬性,請使用 @DynamoDbEncryptionSignAndIncludeInEncryptionContext註釋。如果您希望特定屬性既不簽署也不加密 (DO_NOTHING),請使用 @DynamoDbEncryptionDoNothing註釋。

注意

如果您指定任何SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性,則分割區和排序屬性也必須是 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT。如需顯示用於定義 之註釋的範例SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,請參閱 SimpleClass4.java

如需註釋範例,請參閱 使用註釋的資料類別

2. 定義將從簽章中排除哪些屬性

下列範例假設所有DO_NOTHING屬性共用不同的字首 ":",並使用字首定義允許的未簽署屬性。用戶端會假設簽章中排除任何具有「:」字首的屬性名稱。如需詳細資訊,請參閱Allowed unsigned attributes

final String unsignedAttrPrefix = ":";
3. 建立 keyring

下列範例會建立 AWS KMS keyring。 AWS KMS Keyring 使用對稱加密或非對稱 RSA AWS KMS keys 來產生、加密和解密資料金鑰。

此範例使用 CreateMrkMultiKeyring建立具有對稱加密 KMS 金鑰的 AWS KMS keyring。此CreateAwsKmsMrkMultiKeyring方法可確保 keyring 可正確處理單一區域和多區域金鑰。

final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder() .generator(kmsKeyId) .build(); final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
4. 定義 DynamoDB 資料表加密組態

下列範例定義代表此 DynamoDB 資料表加密組態的tableConfigs映射。

此範例指定 DynamoDB 資料表名稱做為邏輯資料表名稱。當您第一次定義加密組態時,強烈建議指定您的 DynamoDB 資料表名稱做為邏輯資料表名稱。如需詳細資訊,請參閱DynamoDB AWS 資料庫加密 SDK 中的加密組態

您必須指定 FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT做為純文字覆寫。此政策會繼續讀取和寫入純文字項目、讀取加密的項目,以及準備用戶端寫入加密的項目。

final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>(); final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder() .logicalTableName(ddbTableName) .partitionKeyName("partition_key") .sortKeyName("sort_key") .schemaOnEncrypt(tableSchema) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) .plaintextOverride(PlaintextOverride.FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT) .build(); tableConfigs.put(ddbTableName, config);
5. 建立 DynamoDbEncryptionInterceptor

下列範例DynamoDbEncryptionInterceptor使用步驟 3 tableConfigs中的 建立 。

DynamoDbEncryptionInterceptor interceptor = DynamoDbEncryptionInterceptor.builder() .config(DynamoDbTablesEncryptionConfig.builder() .tableEncryptionConfigs(tableConfigs) .build()) .build();

步驟 2:寫入加密和簽章的項目

在您的DynamoDbEncryptionInterceptor組態中更新純文字政策,以允許用戶端寫入加密和簽署的項目。部署下列變更之後,用戶端會根據您在步驟 1 中設定的屬性動作來加密和簽署新項目。用戶端將能夠讀取純文字項目,以及加密和簽署的項目。

在繼續步驟 3 之前,您必須加密和簽署資料表中的所有現有純文字項目。您可以執行沒有單一指標或查詢,以快速加密現有的純文字項目。使用對您的系統最有意義的程序。例如,您可以使用慢速掃描資料表的非同步程序,並使用您定義的屬性動作和加密組態重寫項目。若要識別資料表中的純文字項目,建議您掃描所有不包含 AWS Database Encryption SDK 在加密和簽署項目時新增至項目的 aws_dbe_headaws_dbe_foot 屬性的項目。

下列範例會從步驟 1 更新資料表加密組態。您必須使用 更新純文字覆寫FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT。此政策會繼續讀取純文字項目,但也會讀取和寫入加密的項目。DynamoDbEncryptionInterceptor 使用更新的 建立新的 tableConfigs

final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>(); final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder() .logicalTableName(ddbTableName) .partitionKeyName("partition_key") .sortKeyName("sort_key") .schemaOnEncrypt(tableSchema) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) .plaintextOverride(PlaintextOverride.FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT) .build(); tableConfigs.put(ddbTableName, config);

步驟 3:僅讀取加密和簽章的項目

在您加密並簽署所有項目之後,請更新DynamoDbEncryptionInterceptor組態中的純文字覆寫,以僅允許用戶端讀取和寫入加密和簽署的項目。部署下列變更之後,用戶端會根據您在步驟 1 中設定的屬性動作來加密和簽署新項目。用戶端只能讀取加密和簽章的項目。

下列範例會從步驟 2 更新資料表加密組態。您可以使用 更新純文字覆寫,FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT或從組態中移除純文字政策。根據預設,用戶端只會讀取和寫入加密和簽署的項目。DynamoDbEncryptionInterceptor 使用更新的 建立新的 tableConfigs

final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>(); final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder() .logicalTableName(ddbTableName) .partitionKeyName("partition_key") .sortKeyName("sort_key") .schemaOnEncrypt(tableSchema) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) // Optional: you can also remove the plaintext policy from your configuration .plaintextOverride(PlaintextOverride.FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT) .build(); tableConfigs.put(ddbTableName, config);