Código de ejemplo para el cliente de cifrado de DynamoDB para Python - AWS Cifrado de bases SDK

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Código de ejemplo para el cliente de cifrado de DynamoDB para Python

nota

Nuestra biblioteca de cifrado del cliente pasó a llamarse SDK de cifrado de bases de datos de AWS. En el siguiente tema, se presenta información sobre las versiones 1.x—2.x del cliente de cifrado de DynamoDB para Java y versiones 1.x—3.x del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte el SDK de cifrado de bases de datos de AWS para la compatibilidad de la versión de DynamoDB.

En los siguientes ejemplos, se muestra cómo utilizar el cliente de cifrado de DynamoDB para Python para proteger los datos de DynamoDB en su aplicación. Puede encontrar más ejemplos (y aportar los suyos propios) en el directorio de ejemplos del aws-dynamodb-encryption-pythonrepositorio de. GitHub

Usa la clase de ayuda al EncryptedTable cliente

El ejemplo siguiente le muestra cómo utilizar el proveedor de KMS directo con la EncryptedTable clase auxiliar cliente. Este ejemplo utiliza el mismo proveedor de materiales criptográficos que el ejemplo Utilice el encriptador de elementos siguiente. Sin embargo, utiliza la clase EncryptedTable en lugar de interactuar directamente con el encriptador de elementos de nivel inferior.

Comparando estos ejemplos, puede ver el trabajo que realiza la clase auxiliar cliente automáticamente. Esto incluye la creación del contexto de cifrado de DynamoDB y asegurarse de que los atributos de clave principal estén siempre firmados, pero nunca cifrados. Para crear el contexto de cifrado y descubrir la clave principal, las clases auxiliares del cliente llaman a la operación DynamoDB DescribeTable. Para ejecutar este código, debe tener permiso para llamar a esta operación.

Vea la muestra de código completa: aws_kms_encrypted_table.py

Paso 1: crear la tabla

Empiece creando una instancia de una tabla de DynamoDB estándar con el nombre de la tabla.

table_name='test-table' table = boto3.resource('dynamodb').Table(table_name)
Paso 2: crear un proveedor de materiales criptográficos

Cree una instancia del proveedor de materiales criptográficos (CMP) que ha seleccionado.

Este ejemplo utiliza el proveedor de KMS directo, pero puede utilizar cualquier CMP compatible. Para crear un proveedor de KMS directo, especifique un AWS KMS key. En este ejemplo se utiliza el nombre de recurso de Amazon (ARN) del AWS KMS key, pero se puede utilizar cualquier identificador clave válido.

kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
Paso 3: crear el objeto de acciones de atributo

Las acciones de atributo indican al encriptador de elementos qué acciones hay que realizar en cada atributo del elemento. El objeto AttributeActions de este ejemplo cifra y firma todos los elementos, excepto el atributo test, que se pasa por alto.

No especifique acciones de atributo para los atributos de clave principal cuando utilice una clase auxiliar cliente. La clase EncryptedTable firma, pero no cifra nunca, los atributos de clave principal.

actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} )
Paso 4: crear la tabla cifrada

Cree la tabla cifrada utilizando la tabla estándar, el proveedor de KMS directo y las acciones de atributo. Este paso completa la configuración.

encrypted_table = EncryptedTable( table=table, materials_provider=kms_cmp, attribute_actions=actions )
Paso 5: colocar el elemento de texto no cifrado en la tabla

Cuando se llama al método put_item en la encrypted_table, los elementos de la tabla se cifran de modo transparente, se firman y se agrega a su tabla de DynamoDB.

Primero, defina el elemento de tabla.

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

A continuación, colóquelo en la tabla.

encrypted_table.put_item(Item=plaintext_item)

Para obtener el elemento desde la tabla de DynamoDB en su forma cifrada, llame al método get_item en el objeto table. Para obtener el objeto descifrado, llame al método get_item en el objeto encrypted_table.

Utilice el encriptador de elementos

En este ejemplo, se muestra cómo interactuar directamente con el encriptador de elementos en la al cifrar elementos de tabla, en lugar de utilizar las clases auxiliares de cliente que interactúan con el encriptador de elementos.

Cuando se utiliza esta técnica, crea el contexto de cifrado de DynamoDB y el objeto de configuración (CryptoConfig) manualmente. Además, cifra los elementos en una llamada y los coloca en su tabla de DynamoDB en una llamada independiente. Esto le permite personalizar sus put_item llamadas y utilizar el cliente de cifrado de DynamoDB para cifrar y firmar datos estructurados que nunca se envían a DynamoDB.

Este ejemplo utiliza el proveedor de KMS directo, pero puede utilizar cualquier CMP compatible.

Vea la muestra de código completa: aws_kms_encrypted_item.py

Paso 1: crear la tabla

Empiece creando una instancia de un recurso de tabla de DynamoDB estándar con el nombre de la tabla.

table_name='test-table' table = boto3.resource('dynamodb').Table(table_name)
Paso 2: crear un proveedor de materiales criptográficos

Cree una instancia del proveedor de materiales criptográficos (CMP) que ha seleccionado.

Este ejemplo utiliza el proveedor de KMS directo, pero puede utilizar cualquier CMP compatible. Para crear un proveedor de KMS directo, especifique un AWS KMS key. En este ejemplo se utiliza el nombre de recurso de Amazon (ARN) del AWS KMS key, pero se puede utilizar cualquier identificador clave válido.

kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
Paso 3: Usa la clase TableInfo auxiliar

Para obtener información sobre la tabla de DynamoDB, cree una instancia de TableInfola clase auxiliar. Cuando trabaja directamente con el encriptador de elementos, tiene que crear una instancia TableInfo y llamar a sus métodos. Las clases auxiliares de cliente lo hacen automáticamente.

El refresh_indexed_attributes método TableInfo utiliza la operación DescribeTableDynamoDB para obtener información precisa y en tiempo real sobre la tabla. Incluye su clave principal y sus índices secundarios locales y globales. El intermediario tiene que tener permiso para llamar a DescribeTable.

table_info = TableInfo(name=table_name) table_info.refresh_indexed_attributes(table.meta.client)
Paso 4: crear el contexto de cifrado de DynamoDB

El contexto de cifrado de DynamoDB contiene información acerca de la estructura de la tabla y cómo se cifra y se firma. En este ejemplo, se crea un contexto de cifrado de DynamoDB explícitamente, porque interactúa con el encriptador de elementos. Las clases auxiliares de cliente crean el contexto de cifrado de DynamoDB para usted.

Para obtener la clave de partición y la clave de clasificación, puede usar las propiedades de la clase TableInfoauxiliar.

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) )
Paso 5: crear el objeto de acciones de atributo

Las acciones de atributo indican al encriptador de elementos qué acciones hay que realizar en cada atributo del elemento. El objeto AttributeActions en este ejemplo cifra y firma todos los elementos, excepto los atributos de clave principal, que se firman, pero no se cifran y el atributo test, que se pasa por alto.

Cuando se interactúa directamente con el encriptador de elementos y la acción predeterminada es ENCRYPT_AND_SIGN, debe especificar una acción alternativa para la clave principal. Puede utilizar el método set_index_keys, que usa SIGN_ONLY para la clave principal o utiliza DO_NOTHING si es la acción predeterminada.

Para especificar la clave principal, en este ejemplo se utilizan las claves de índice del TableInfoobjeto, que se rellenan con una llamada a DynamoDB. Esta técnica es más segura que los nombres de clave principal de codificación rígida.

actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} ) actions.set_index_keys(*table_info.protected_index_keys())
Paso 6: crear la configuración para el elemento

Para configurar el cliente de cifrado de DynamoDB, utilice los objetos que acaba de crear en CryptoConfiguna configuración para el elemento de la tabla. Las clases auxiliares del cliente las crean por usted. CryptoConfig

crypto_config = CryptoConfig( materials_provider=kms_cmp, encryption_context=encryption_context, attribute_actions=actions )
Paso 7: cifrar el elemento

En este paso, se cifra y firma el elemento, pero no lo coloca en la tabla de DynamoDB.

Cuando utiliza una clase auxiliar de cliente, sus elementos se cifran y se firman de modo transparente y, a continuación, se agregan a su tabla de DynamoDB cuando llama al put_item método de la clase auxiliar. Cuando utiliza el encriptador de elementos directamente, las acciones de cifrado y colocación son independientes.

En primer lugar, cree un elemento de texto no cifrado.

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

A continuación, cífrelo y fírmelo. El método encrypt_python_item requiere el objeto de configuración CryptoConfig.

encrypted_item = encrypt_python_item(plaintext_item, crypto_config)
Paso 8: colocar el elemento en la tabla

En este paso, se coloca el elemento cifrado y firmado en la tabla de DynamoDB.

table.put_item(Item=encrypted_item)

Para ver el elemento cifrado, llame al método get_item en el objeto table original, en lugar del objeto encrypted_table. Obtiene el elemento de la tabla DynamoDB sin verificarlo y descifrarlo.

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

En la imagen siguiente se muestra una parte de un elemento de tabla cifrado y firmado de ejemplo.

Los valores de atributo cifrados son datos binarios. Los nombres y los valores de los atributos de clave principal (partition_attribute y sort_attribute) y el atributo test permanecen en texto no cifrado. La salida muestra además el atributo que contiene la firma (*amzn-ddb-map-sig*) y el atributo de descripción de materiales (*amzn-ddb-map-desc*).

Un fragmento de un elemento cifrado y firmado