本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定現有的 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
使用步驟 3tableConfigs
中的 建立 。DynamoDbEncryptionInterceptor interceptor = DynamoDbEncryptionInterceptor.builder() .config(DynamoDbTablesEncryptionConfig.builder() .tableEncryptionConfigs(tableConfigs) .build()) .build();
步驟 2:寫入加密和簽章的項目
在您的DynamoDbEncryptionInterceptor
組態中更新純文字政策,以允許用戶端寫入加密和簽署的項目。部署下列變更之後,用戶端會根據您在步驟 1 中設定的屬性動作來加密和簽署新項目。用戶端將能夠讀取純文字項目,以及加密和簽署的項目。
在繼續步驟 3 之前,您必須加密和簽署資料表中的所有現有純文字項目。您可以執行沒有單一指標或查詢,以快速加密現有的純文字項目。使用對您的系統最有意義的程序。例如,您可以使用慢速掃描資料表的非同步程序,並使用您定義的屬性動作和加密組態重寫項目。若要識別資料表中的純文字項目,建議您掃描所有不包含 AWS Database Encryption SDK 在加密和簽署項目時新增至項目的 aws_dbe_head
和 aws_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);