Python の DynamoDB 暗号化クライアントのサンプルコード - Amazon DynamoDB Encryption Client

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Python の DynamoDB 暗号化クライアントのサンプルコード

次の例では、DynamoDB 暗号化クライアント for Python を使用して、アプリケーション内の DynamoDB データを保護する方法について説明します。でより多くの例を見つける(および独自の貢献をする)のディレクトリaws-dynamodb-encryption-PythonGitHub のリポジトリ。

EncryptedTable クライアントヘルパークラスを使用する

次の例は、Direct KMS プロバイダーEncryptedTable クライアントのヘルパークラス。この例では同じものを使用しています。暗号化マテリアルプロバイダとして項目エンクリプタを使用する以下に例を示します。ただし、EncryptedTable低レベルと直接やり取りするのではなく、クラス項目エントクリプタ

これらの例を比較することで、クライアントのヘルパークラスが行う作業を確認できます。これには、DynamoDB 暗号化コンテキストプライマリキー属性が常に署名されているが暗号化されていないことを確認します。暗号化コンテキストを作成し、プライマリキーを検出するには、クライアントのヘルパークラスでの DynamoDB を呼び出します。DescribeTableオペレーション. このコードを実行するには、このオペレーションを呼び出すアクセス許可が必要です。

完全なコードサンプルの参照: aws_kms_encrypted_table.py

ステップ 1: テーブルの作成

開始するには、テーブル名を指定して、標準 DynamoDB テーブルのインスタンスを作成します。

table_name='test-table' table = boto3.resource('dynamodb').Table(table_name)
ステップ 2: 暗号化マテリアルプロバイダーを作成する

選択した暗号化マテリアルプロバイダー (CMP) のインスタンスを作成します。

この例では、Direct KMS プロバイダーを使用していますが、互換性のある CMP を使用することもできます。Direct KMS プロバイダーを作成するには、AWS KMS key。この例では、の Amazon リソースネーム (ARN) を使用します。AWS KMS keyただし、任意の有効なキー識別子を使用できます。

kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
ステップ 3: 属性アクションオブジェクトを作成する

属性アクションは、項目の各属性に対して実行するアクションを項目エンクリプタに指示します。この例の AttributeActions オブジェクトは、無視される test 属性を除くすべての項目を暗号化し、署名します。

クライアントのヘルパークラスを使用する場合は、プライマリキー属性の属性アクションを指定しないでください。EncryptedTable クラスでは、プライマリキー属性に署名しますが、暗号化しません。

actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} )
ステップ 4: 暗号化されたテーブルを作成する

標準テーブル、Direct KMS プロバイダー、属性アクションを使用して、暗号化されたテーブルを作成します。このステップで設定を完了します。

encrypted_table = EncryptedTable( table=table, materials_provider=kms_cmp, attribute_actions=actions )
ステップ 5: テーブル内でプレーンテキスト項目を入力する

あなたが電話したときput_itemでのメソッドencrypted_tableでは、テーブル項目は透過的に暗号化されて署名され、DynamoDB テーブルに追加されます。

まず、テーブル項目を定義します。

plaintext_item = { 'partition_attribute': 'value1', 'sort_attribute': 55 'example': 'data', 'numbers': 99, 'binary': Binary(b'\x00\x01\x02'), 'test': 'test-value' }

次に、テーブルにデータを入力します。

encrypted_table.put_item(Item=plaintext_item)

暗号化された形式で DynamoDB テーブルから項目を取得するには、get_itemでのメソッドtableオブジェクト。復号された項目を取得するには、get_item オブジェクトの encrypted_table メソッドを呼び出します。

項目エンクリプタを使用する

この例では、で直接やり取りする方法について説明します。項目エントクリプタDynamoDB 暗号化クライアントで、テーブルアイテムを暗号化する場合は、クライアントのヘルパークラス項目暗号化とやり取りします。

この方法を使用する場合、DynamoDB 暗号化コンテキストおよび設定オブジェクトを作成します。CryptoConfig) の手動作成。また、1 つの呼び出しで項目を暗号化し、別の呼び出しで DynamoDB テーブルに配置します。これにより、put_itemDynamoDB 暗号化クライアントを呼び出して、を使用して、構造化データの暗号化および署名を行うことができます。DynamoDB に送信されることはありません。

この例では、Direct KMS プロバイダーを使用していますが、互換性のある CMP を使用することもできます。

完全なコードサンプルの参照: aws_kms_encrypted_item.py

ステップ 1: テーブルの作成

開始するには、テーブル名を指定して、標準 DynamoDB テーブルリソースのインスタンスを作成します。

table_name='test-table' table = boto3.resource('dynamodb').Table(table_name)
ステップ 2: 暗号化マテリアルプロバイダーを作成する

選択した暗号化マテリアルプロバイダー (CMP) のインスタンスを作成します。

この例では、Direct KMS プロバイダーを使用していますが、互換性のある CMP を使用することもできます。Direct KMS プロバイダーを作成するには、AWS KMS key。この例では、の Amazon リソースネーム (ARN) を使用します。AWS KMS keyただし、任意の有効なキー識別子を使用できます。

kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
ステップ 3: TableInfo ヘルパークラスを使用する

DynamoDB からテーブルに関する情報を取得するには、TableInfoヘルパークラス。項目エンクリプタで直接操作する場合は、TableInfo インスタンスを作成してそのメソッドを呼び出す必要があります。クライアントのヘルパークラスを使用してこの操作を行うことができます。

-refresh_indexed_attributesの方法TableInfoを使用します。DescribeTableDynamoDB オペレーションを使用して、テーブルに関するリアルタイムで正確な情報を取得します。この情報には、プライマリキーと、ローカルおよびグローバルセカンダリインデックスが含まれます。DescribeTable を呼び出すアクセス許可が発信者に必要です。

table_info = TableInfo(name=table_name) table_info.refresh_indexed_attributes(table.meta.client)
ステップ 4: DynamoDB 暗号化コンテキストの作成

-DynamoDB 暗号化コンテキストテーブル構造に関する情報と、暗号化および署名方法を示します。この例では、項目暗号化とやり取りするため、DynamoDB 暗号化コンテキストを明示的に作成します。-クライアントのヘルパークラスDynamoDB 暗号化コンテキストを作成します。

パーティションキーおよびソートキーを取得するには、TableInfo ヘルパークラスのプロパティを使用できます。

index_key = { 'partition_attribute': 'value1', 'sort_attribute': 55 } encryption_context = EncryptionContext( table_name=table_name, partition_key_name=table_info.primary_index.partition, sort_key_name=table_info.primary_index.sort, attributes=dict_to_ddb(index_key) )
ステップ 5: 属性アクションオブジェクトを作成する

属性アクションは、項目の各属性に対して実行するアクションを項目エンクリプタに指示します。この例の AttributeActions オブジェクトは、署名されているが暗号されていないプライマリキー属性と、無視される test 属性を除き、すべての項目を暗号化し、署名します。

項目エンクリプタを使用して直接やり取りし、デフォルトアクションが ENCRYPT_AND_SIGN の場合、プライマリキーの代替アクションを指定する必要があります。set_index_keys メソッドを使用できます。このメソッドでは、プライマリキーに SIGN_ONLY、デフォルトアクションの場合には DO_NOTHING が使用されます。

プライマリキーを指定するために、この例では、TableInfoオブジェクト。DynamoDB の呼び出しによって設定されます。この技術は、ハードコーディングのプライマリキー名より安全です。

actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} ) actions.set_index_keys(*table_info.protected_index_keys())
ステップ 6: 項目の設定を作成します。

DynamoDB 暗号化クライアントを設定するには、で先ほど作成したオブジェクトを使用します。CryptoConfigテーブル項目の設定。クライアントのヘルパークラスでは、CryptoConfig が作成されます。

crypto_config = CryptoConfig( materials_provider=kms_cmp, encryption_context=encryption_context, attribute_actions=actions )
ステップ 7: 項目を暗号化する

このステップでは、項目を暗号化および署名しますが、DynamoDB テーブルには入力されません。

クライアントのヘルパークラスを使用するときに、項目は透過的に暗号化されて署名され、その後、を呼び出すときに DynamoDB テーブルに追加されます。put_itemヘルパークラスのメソッド。項目エンクリプタを直接使用する場合、暗号化および入力アクションは独立しています。

まず、プレーンテキスト項目を作成します。

plaintext_item = { 'partition_attribute': 'value1', 'sort_key': 55, 'example': 'data', 'numbers': 99, 'binary': Binary(b'\x00\x01\x02'), 'test': 'test-value' }

次に、その項目を暗号化して署名します。encrypt_python_item メソッドでは、CryptoConfig 設定オブジェクトが必要です。

encrypted_item = encrypt_python_item(plaintext_item, crypto_config)
ステップ 8: テーブル内で項目を入力する

このステップでは、暗号化された署名済みの項目を DynamoDB テーブルに配置します。

table.put_item(Item=encrypted_item)

暗号化された項目を表示するには、元の get_item オブジェクトの table メソッドを呼び出します。encrypted_table オブジェクトではありません。これにより、検証および復号せずに、DynamoDB テーブルより項目を取得することができます。

encrypted_item = table.get_item(Key=partition_key)['Item']

次の画像は、暗号化された署名済みのテーブル項目の例の一部を示します。

暗号化された属性値は、バイナリデータです。プライマリキー属性の名前および値 (partition_attribute および sort_attribute) と、test 属性は、プレーンテキスト形式のままです。また、この出力は、署名を含む属性 (*amzn-ddb-map-sig*) とマテリアル説明属性 (*amzn-ddb-map-desc*) を示します。


        暗号化されて署名された項目の抜粋