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

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

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

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

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

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

1. 定義您的屬性動作

建立物件模型,以定義哪些屬性值將加密和簽署,哪些將僅簽署,哪些將忽略。

根據預設,主要金鑰屬性會經過簽署但未加密 (SIGN_ONLY),而所有其他屬性則會經過加密和簽署 (ENCRYPT_AND_SIGN)。

指定 ENCRYPT_AND_SIGN來加密和簽署 屬性。指定 SIGN_ONLY 來簽署但不要加密 屬性。指定 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 來簽署和屬性,並將其包含在加密內容中。如果沒有同時簽署屬性,則無法加密該屬性。指定 DO_NOTHING 忽略 屬性。如需詳細資訊,請參閱DynamoDB AWS 資料庫加密 SDK 中的屬性動作

注意

如果您指定任何SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性,則分割區和排序屬性也必須是 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

var attributeActionsOnEncrypt = new Dictionary<string, CryptoAction> { ["partition_key"] = CryptoAction.SIGN_ONLY, // The partition attribute must be SIGN_ONLY ["sort_key"] = CryptoAction.SIGN_ONLY, // The sort attribute must be SIGN_ONLY ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN, ["attribute2"] = CryptoAction.SIGN_ONLY, [":attribute3"] = CryptoAction.DO_NOTHING };
2. 定義將從簽章中排除哪些屬性

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

const String unsignAttrPrefix = ":";
3. 建立 keyring

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

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

var matProv = new MaterialProviders(new MaterialProvidersConfig()); var keyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyId }; var kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
4. 定義 DynamoDB 資料表加密組態

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

此範例指定 DynamoDB 資料表名稱做為邏輯資料表名稱。當您第一次定義加密組態時,強烈建議指定您的 DynamoDB 資料表名稱做為邏輯資料表名稱。

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

如需資料表加密組態中包含之值的詳細資訊,請參閱DynamoDB AWS 資料庫加密 SDK 中的加密組態

Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs = new Dictionary<String, DynamoDbTableEncryptionConfig>(); DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig { LogicalTableName = ddbTableName, PartitionKeyName = "partition_key", SortKeyName = "sort_key", AttributeActionsOnEncrypt = attributeActionsOnEncrypt, Keyring = kmsKeyring, AllowedUnsignedAttributePrefix = unsignAttrPrefix, PlaintextOverride = FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT }; tableConfigs.Add(ddbTableName, config);
5. 建立新的 AWS SDK DynamoDB 用戶端

他遵循範例,使用步驟 4 TableEncryptionConfigs中的 建立新的 AWS SDK DynamoDB 用戶端。

var ddb = new Client.DynamoDbClient( new DynamoDbTablesEncryptionConfig { TableEncryptionConfigs = tableConfigs });

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

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

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

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

Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs = new Dictionary<String, DynamoDbTableEncryptionConfig>(); DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig { LogicalTableName = ddbTableName, PartitionKeyName = "partition_key", SortKeyName = "sort_key", AttributeActionsOnEncrypt = attributeActionsOnEncrypt, Keyring = kmsKeyring, AllowedUnsignedAttributePrefix = unsignAttrPrefix, PlaintextOverride = FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT }; tableConfigs.Add(ddbTableName, config);

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

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

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

Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs = new Dictionary<String, DynamoDbTableEncryptionConfig>(); DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig { LogicalTableName = ddbTableName, PartitionKeyName = "partition_key", SortKeyName = "sort_key", AttributeActionsOnEncrypt = attributeActionsOnEncrypt, Keyring = kmsKeyring, AllowedUnsignedAttributePrefix = unsignAttrPrefix, // Optional: you can also remove the plaintext policy from your configuration PlaintextOverride = FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT }; tableConfigs.Add(ddbTableName, config);