將現有的 DynamoDB 表格設定為針對 DynamoDB 使用資 AWS 料庫加密 SDK - AWS 資料庫加密 SDK

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

將現有的 DynamoDB 表格設定為針對 DynamoDB 使用資 AWS 料庫加密 SDK

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

使用版本 3。 您可以將現有的 Amazon DynamoDB 用戶端加密程式庫中的 x 個設定為用戶端加密資料表。本主題提供有關新增版本 3 所必須採取的三個步驟的指引。 x 至現有、已填入的 DynamoDB 表格。

必要條件

版本 3. DynamoDB 的 Java 用戶端加密程式庫的 x 個需要中提供的 DynamoDB 增強型用戶端。 AWS SDK for Java 2.x 如果仍然使用 D ynamoDBMapper,則必須移轉 AWS SDK for Java 2.x 至以使用 DynamoDB 增強型用戶端。

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

然後,依照指示操作,使用 DynamoDB 增強型用戶端開始使用。API

在將表格設定為使用 DynamoDB 的 Java 用戶端加密程式庫之前,您需要產生TableSchema使用已註解的資料類別建立增強型用戶端。

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

完成下列步驟,準備好資 AWS 料庫加密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. 建立鑰匙圈

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

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

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格之加密組態的 Map。

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

您必須指定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使用tableConfigs步驟 3 建立。

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

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

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

繼續執行步驟 3 之前,您必須先加密並簽署表格中所有現有的純文字項目。您無法執行任何單一量度或查詢來快速加密現有的純文字項目。使用對您的系統最有意義的過程。例如,您可以使用非同步處理程序來緩慢掃描表格,並使用您定義的屬性動作和加密配置重寫項目。若要識別表格中的純文字項目,建議您掃描所有不包含「 AWS 資料庫加密」在項目經過加密aws_dbe_head和簽署時SDK新增的和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);