翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Database Encryption SDK for DynamoDB AWS を使用するように既存の DynamoDB テーブルを設定する
DynamoDB 用の .NET クライアント側の暗号化ライブラリのバージョン 3.x では、クライアント側の暗号化用に既存の Amazon DynamoDB テーブルを設定できます。このトピックでは、データが入力されている既存の DynamoDB テーブルにバージョン 3.x を追加するために必要な 3 つのステップについてのガイダンスを提供します。
ステップ 1: 暗号化された項目の読み取りと書き込みの準備をする
Database Encryption AWS SDKクライアントが暗号化された項目を読み書きできるように準備するには、次のステップを実行します。次の変更をデプロイした後も、クライアントは引き続きプレーンテキスト項目の読み取りと書き込みを行います。テーブルに書き込まれる新しい項目の暗号化や署名は行いませんが、暗号化された項目が表示されるとすぐに復号できます。これらの変更により、クライアントが新しい項目の暗号化を開始するための準備が整います。次のステップに進む前に、次の変更を各リーダーにデプロイする必要があります。
- 1. 属性アクションを定義する
-
オブジェクトモデルを作成して、暗号化および署名される属性値、署名のみされる属性値、および無視される属性値を定義します。
デフォルトでは、プライマリキー属性は署名されてはいるが、暗号化されておらず (
SIGN_ONLY
)、他のすべての属性は暗号化されて署名されています (ENCRYPT_AND_SIGN
)。属性を暗号化して署名するように
ENCRYPT_AND_SIGN
を指定します。属性に署名するが暗号化はしないようにSIGN_ONLY
を指定します。と 属性に署名SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT
するように指定し、暗号化コンテキストに含めます。属性に署名することなく、その属性を暗号化することはできません。属性を無視するようにDO_NOTHING
を指定します。詳細については、「Database Encryption SDK for AWS DynamoDB の属性アクション」を参照してください。注記
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. キーリングを作成します。
-
次の例では AWS KMS キーリングを作成します。 AWS KMS キーリングは、対称暗号化または非対称 RSA AWS KMS keys を使用して、データキーを生成、暗号化、復号します。
この例では、
CreateMrkMultiKeyring
を使用して対称暗号化 AWS KMS キーを持つ KMSキーリングを作成します。CreateAwsKmsMrkMultiKeyring
メソッドにより、キーリングは、単一リージョンのキーとマルチリージョンのキーの両方を確実に正しく処理します。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
を指定する必要があります。このポリシーは、プレーンテキスト項目の読み取りと書き込みを継続し、暗号化された項目を読み取り、クライアントが暗号化された項目を書き込むための準備を整えます。テーブル暗号化設定に含まれる値の詳細については、「」を参照してくださいDatabase Encryption SDK for AWS DynamoDB の暗号化設定。
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_head
および aws_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);