Exemple de code pour le client de chiffrement DynamoDB pour Python - AWS SDK de chiffrement de base de données

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Exemple de code pour le client de chiffrement DynamoDB pour Python

Note

Notre bibliothèque de chiffrement côté client a été renommée AWS Database Encryption SDK. La rubrique suivante fournit des informations sur les versions 1. x -2. x du client de chiffrement DynamoDB pour Java et versions 1. x —3. x du client de chiffrement DynamoDB pour Python. Pour plus d'informations, voir AWSDatabase Encryption SDK pour connaître la prise en charge des versions de DynamoDB.

Les exemples suivants vous montrent comment utiliser le client de chiffrement DynamoDB pour Python afin de protéger les données DynamoDB dans votre application. Vous pouvez trouver d'autres exemples (et apporter les vôtres) dans le répertoire des exemples du aws-dynamodb-encryption-pythonréférentiel à l'adresseGitHub.

Utiliser la classe d'assistance au EncryptedTable client

L'exemple suivant montre comment utiliser le fournisseur KMS direct avec la EncryptedTable classe d'annotations cliente. Cet exemple utilise le même fournisseur CMP que l'exemple Utilisation du chiffreur d'élément qui suit. Cependant, il utilise la classe EncryptedTable au lieu d'interagir directement avec le chiffreur d'élément de bas niveau.

En comparant ces exemples, vous pouvez voir le travail que la classe d'annotations cliente effectue à votre place. Cela inclut la création du contexte de chiffrement DynamoDB et la garantie que les attributs de la clé primaire sont toujours signés, mais jamais chiffrés. Pour créer le contexte de chiffrement et découvrir la clé primaire, les classes d'assistance du client appellent l'opération DynamoDB DescribeTable. Pour exécuter ce code, vous devez avoir l'autorisation d'appeler cette opération.

Consultez l'exemple de code complet : aws_kms_encrypted_table.py

Étape 1 : Créer la table

Commencez par créer une instance d'une table DynamoDB standard avec le nom de la table.

table_name='test-table' table = boto3.resource('dynamodb').Table(table_name)
Étape 2 : Créer un fournisseur CMP

Créez une instance du fournisseur CMP que vous avez sélectionné.

Cet exemple utilise le fournisseur KMS direct, mais vous pouvez utiliser n'importe quel fournisseur CMP compatible. Pour créer un fournisseur Direct KMS, spécifiez un AWS KMS key. Cet exemple utilise l'Amazon Resource Name (ARN) duAWS KMS key, mais vous pouvez utiliser n'importe quel identifiant de clé valide.

kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
Étape 3 : Créer l'objet actions d'attribut

Les actions d'attribut informent le chiffreur d'élément des actions à exécuter sur chaque attribut de l'élément. L'objet AttributeActions de l'exemple chiffre et signe tous les éléments à l'exception de l'attribut test, qui est ignoré.

Ne spécifiez pas d'actions d'attribut pour les attributs de clé primaire quand vous utilisez une classe d'annotations cliente. La classe EncryptedTable signe, mais ne chiffre jamais, les attributs de clé primaire.

actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} )
Étape 4 : Créer la table chiffrée

Créez la table chiffrée à l'aide de la table standard, du fournisseur KMS direct et des actions d'attribut. Cette étape termine la configuration.

encrypted_table = EncryptedTable( table=table, materials_provider=kms_cmp, attribute_actions=actions )
Étape 5 : Placer l'élément en texte brut dans la table

Lorsque vous appelez la put_item méthode sur leencrypted_table, les éléments de votre tableau sont chiffrés, signés et ajoutés de manière transparente à votre tableau DynamoDB.

Tout d'abord, définissez l'élément de table.

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

Puis, insérez-le dans la table.

encrypted_table.put_item(Item=plaintext_item)

Pour obtenir l'élément de la table DynamoDB sous sa forme cryptée, appelez la get_item méthode associée à l'objet. table Pour obtenir l'élément chiffré, appelez la méthode get_item sur l'objet encrypted_table.

Utilisation du chiffreur d'élément

Cet exemple montre comment interagir directement avec le chiffreur d'éléments dans le client de chiffrement DynamoDB lors du chiffrement des éléments d'une table, au lieu d'utiliser les classes d'assistance du client qui interagissent avec le chiffreur d'éléments à votre place.

Lorsque vous utilisez cette technique, vous créez manuellement le contexte de chiffrement DynamoDB et l'objet de configuration (CryptoConfig). Vous pouvez également chiffrer les éléments lors d'un appel et les placer dans votre table DynamoDB lors d'un appel distinct. Cela vous permet de personnaliser vos put_item appels et d'utiliser le client de chiffrement DynamoDB pour chiffrer et signer des données structurées qui ne sont jamais envoyées à DynamoDB.

Cet exemple utilise le fournisseur KMS direct, mais vous pouvez utiliser n'importe quel fournisseur CMP compatible.

Voir l'exemple de code complet : aws_kms_encrypted_item.py

Étape 1 : Créer la table

Commencez par créer une instance d'une ressource de table DynamoDB standard avec le nom de la table.

table_name='test-table' table = boto3.resource('dynamodb').Table(table_name)
Étape 2 : Créer un fournisseur CMP

Créez une instance du fournisseur CMP que vous avez sélectionné.

Cet exemple utilise le fournisseur KMS direct, mais vous pouvez utiliser n'importe quel fournisseur CMP compatible. Pour créer un fournisseur Direct KMS, spécifiez un AWS KMS key. Cet exemple utilise l'Amazon Resource Name (ARN) duAWS KMS key, mais vous pouvez utiliser n'importe quel identifiant de clé valide.

kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
Étape 3 : Utiliser la classe TableInfo d'assistance

Pour obtenir des informations sur la table à partir de DynamoDB, créez une instance de la classe d'TableInfoassistance. Lorsque vous travaillez directement avec le chiffreur d'élément, vous devez créer une instance TableInfo et appeler ses méthodes. Les classes d'annotation clientes le font pour vous.

La refresh_indexed_attributes méthode TableInfo utilise l'opération DescribeTableDynamoDB pour obtenir des informations précises en temps réel sur la table. Elles incluent la clé primaire et ses index secondaires locaux et globaux. L'appelant doit avoir l'autorisation d'appeler DescribeTable.

table_info = TableInfo(name=table_name) table_info.refresh_indexed_attributes(table.meta.client)
Étape 4 : Création du contexte de chiffrement DynamoDB

Le contexte de chiffrement DynamoDB contient des informations sur la structure de la table et sur la manière dont elle est cryptée et signée. Cet exemple crée un contexte de chiffrement DynamoDB de manière explicite, car il interagit avec le chiffreur d'éléments. Les classes d'assistance du client créent le contexte de chiffrement DynamoDB pour vous.

Pour obtenir la clé de partition et la clé de tri, vous pouvez utiliser les propriétés de la classe d'TableInfoassistance.

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) )
Étape 5 : Créer l'objet actions d'attribut

Les actions d'attribut informent le chiffreur d'élément des actions à exécuter sur chaque attribut de l'élément. L'objet AttributeActions de l'exemple chiffre et signe tous les éléments à l'exception des attributs de clé primaire, qui sont signés, mais pas chiffrés, et de l'attribut test, qui est ignoré.

Lorsque vous interagissez directement avec le chiffreur d'élément et que votre action par défaut est ENCRYPT_AND_SIGN, vous devez spécifier une autre action pour la clé primaire. Vous pouvez utiliser la méthode set_index_keys, qui utilise SIGN_ONLY pour la clé primaire, ou DO_NOTHING s'il s'agit de l'action par défaut.

Pour spécifier la clé primaire, cet exemple utilise les clés d'index de l'TableInfoobjet, qui sont renseignées par un appel à DynamoDB. Cette technique est plus sûre que le codage en dur des noms de clé primaire.

actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} ) actions.set_index_keys(*table_info.protected_index_keys())
Étape 6 : Créer la configuration pour l'élément

Pour configurer le client de chiffrement DynamoDB, utilisez les objets que vous venez de créer dans une CryptoConfigconfiguration pour l'élément de table. Les classes d'assistance client les créent CryptoConfig pour vous.

crypto_config = CryptoConfig( materials_provider=kms_cmp, encryption_context=encryption_context, attribute_actions=actions )
Étape 7 : Chiffrer l'élément

Cette étape chiffre et signe l'élément, mais ne le place pas dans la table DynamoDB.

Lorsque vous utilisez une classe d'assistance client, vos éléments sont chiffrés et signés de manière transparente, puis ajoutés à votre table DynamoDB lorsque vous appelez la put_item méthode de la classe d'assistance. Lorsque vous utilisez le chiffreur d'élément directement, les actions de chiffrage et de placement sont indépendantes.

Tout d'abord, créez un élément en texte brut.

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

Puis, chiffrez-le et signez-le. La méthode encrypt_python_item requiert l'objet de configuration CryptoConfig.

encrypted_item = encrypt_python_item(plaintext_item, crypto_config)
Étape 8 : Placer l'élément dans la table

Cette étape place l'élément chiffré et signé dans la table DynamoDB.

table.put_item(Item=encrypted_item)

Pour afficher l'élément chiffré, appelez la méthode get_item sur l'objet original table, et non sur l'objet encrypted_table. Elle obtient l'élément de la table DynamoDB sans le vérifier et le déchiffrer.

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

L'illustration suivante présente une partie d'un exemple d'élément de table chiffré et signé.

Les valeurs des attributs chiffrés sont des données binaires. Les noms et valeurs des attributs de clé primaire (partition_attribute et sort_attribute) et l'attribut test demeurent en texte brut. La sortie affiche aussi l'attribut qui contient la signature (*amzn-ddb-map-sig*) et l'attribut de description des matériaux (*amzn-ddb-map-desc*).


        Extrait d'un élément de table chiffré et signé