Configurar una tabla de DynamoDB existente para usar AWS el cifrado de bases de datos para DynamoDB SDK - 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.

Configurar una tabla de DynamoDB existente para usar AWS el cifrado de bases de datos para DynamoDB SDK

Nuestra biblioteca de cifrado del lado del cliente pasó a llamarse Cifrado de bases de datos. AWS SDK En esta guía para desarrolladores, se sigue proporcionando información sobre el cliente de cifrado de DynamoDB.

Con la versión 3.x de la biblioteca de cifrado del cliente de Java para DynamoDB, puede configurar las tablas de Amazon DynamoDB existentes para el cifrado del cliente. En este tema se proporcionan instrucciones sobre los tres pasos que debe seguir para añadir la versión 3.x a una tabla de DynamoDB existente y rellenada.

Requisitos previos

Versión 3.x de la biblioteca de cifrado del cliente de Java para DynamoDB requiere el cliente mejorado de DynamoDB incluido en AWS SDK for Java 2.x . Si aún usa la D ynamoDBMapper, debe migrar AWS SDK for Java 2.x para usar DynamoDB Enhanced Client.

Siga las instrucciones para migrar de la versión 1.x a la 2.x de AWS SDK for Java.

A continuación, siga las instrucciones para empezar a utilizar el cliente mejorado de DynamoDB. API

Antes de configurar la tabla para que utilice la biblioteca de cifrado del cliente de Java para DynamoDB, debe generar una TableSchemamediante una clase de datos anotada y crear un cliente mejorado.

Paso 1: prepararse para leer y escribir elementos cifrados

Complete los siguientes pasos para preparar su SDK cliente de cifrado AWS de bases de datos para leer y escribir elementos cifrados. Tras implementar los siguientes cambios, el cliente seguirá leyendo y escribiendo elementos de texto no cifrado. No cifrará ni firmará ningún elemento nuevo escrito en la tabla, pero podrá descifrar los elementos cifrados en cuanto aparezcan. Estos cambios preparan al cliente para empezar a cifrar nuevos elementos. Los siguientes cambios deben implementarse en cada lector antes de continuar con el siguiente paso.

1. Defina las acciones de sus atributos

Actualice la clase de datos anotada para incluir acciones de atributos que definan qué valores de atributo se cifrarán y firmarán, cuáles solo se firmarán y cuáles se ignorarán.

Consulte el SimpleClassarchivo.java en el repositorio aws-database-encryption-sdk -dynamodb GitHub para obtener más información sobre las anotaciones del cliente mejorado de DynamoDB.

De forma predeterminada, los atributos de la clave principal están firmados pero no cifrados (SIGN_ONLY) y todos los demás atributos están cifrados y firmados ENCRYPT_AND_SIGN(). Para especificar las excepciones, utiliza las anotaciones de cifrado que se definen en la biblioteca de cifrado del cliente de Java para DynamoDB. Por ejemplo, si desea que un atributo concreto sea de solo firmar, utilice únicamente la anotación @DynamoDbEncryptionSignOnly. Si desea firmar e incluir un atributo concreto en el contexto de cifrado, utilice la anotación. @DynamoDbEncryptionSignAndIncludeInEncryptionContext Si desea que un atributo concreto no esté firmado ni cifrado (DO_NOTHING), utilice la anotación @DynamoDbEncryptionDoNothing.

nota

Si especifica algún SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT atributo, los atributos de partición y ordenación también deben serloSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT. Para ver un ejemplo que muestre las anotaciones utilizadas para definirSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT, consulte SimpleClass4.java.

Para ver anotaciones de ejemplo, consulte Utilice una clase de datos anotada.

2. Defina qué atributos se excluirán de las firmas

En el ejemplo siguiente, se supone que todos los atributos DO_NOTHING comparten el prefijo distinto ":" y se utiliza el prefijo para definir los atributos no firmados permitidos. El cliente asumirá que cualquier nombre de atributo con el prefijo ":" está excluido de las firmas. Para obtener más información, consulte Allowed unsigned attributes.

final String unsignedAttrPrefix = ":";
3. Cree un conjunto de claves

El siguiente ejemplo crea un conjunto de claves de AWS KMS. El AWS KMS anillo de claves utiliza un cifrado simétrico o asimétrico RSA AWS KMS keys para generar, cifrar y descifrar las claves de datos.

Este ejemplo se utiliza CreateMrkMultiKeyring para crear un AWS KMS anillo de claves con una clave de cifrado simétrica. KMS El método CreateAwsKmsMrkMultiKeyring garantiza que el conjunto de claves maneje correctamente las claves de una sola región y de múltiples regiones.

final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder() .generator(kmsKeyId) .build(); final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
4. Definir la configuración de cifrado de la tabla de DynamoDB

El siguiente ejemplo define un mapa tableConfigs que representa la configuración de cifrado de esta tabla de DynamoDB.

En este ejemplo, se especifica el nombre de la tabla de DynamoDB como nombre de la tabla lógica. Se recomienda encarecidamente especificar el nombre de la tabla de DynamoDB como nombre de la tabla lógica cuando defina por primera vez la configuración de cifrado. Para obtener más información, consulte Configuración de cifrado en el cifrado de AWS bases de datos SDK para DynamoDB.

Debe especificarlo FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT como modificación de texto no cifrado. Esta política sigue leyendo y escribiendo elementos de texto no cifrado, lee los elementos cifrados y prepara al cliente para escribir elementos cifrados.

final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>(); final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder() .logicalTableName(ddbTableName) .partitionKeyName("partition_key") .sortKeyName("sort_key") .schemaOnEncrypt(tableSchema) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) .plaintextOverride(PlaintextOverride.FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT) .build(); tableConfigs.put(ddbTableName, config);
5. Crear el DynamoDbEncryptionInterceptor

En el siguiente ejemplo, se crea el DynamoDbEncryptionInterceptor con la misma tableConfigs del Paso 3.

DynamoDbEncryptionInterceptor interceptor = DynamoDbEncryptionInterceptor.builder() .config(DynamoDbTablesEncryptionConfig.builder() .tableEncryptionConfigs(tableConfigs) .build()) .build();

Paso 2: escribir elementos cifrados y firmados

Actualice la política de texto no cifrado de su DynamoDbEncryptionInterceptor configuración para permitir que el cliente escriba elementos cifrados y firmados. Tras implementar el siguiente cambio, el cliente cifrará y firmará los nuevos elementos en función de las acciones de atributos que configuró en el paso 1. El cliente podrá leer los elementos en texto no cifrado y los elementos cifrados y firmados.

Antes de continuar con el Paso 3, debe cifrar y firmar todos los elementos de texto no cifrado existentes en la tabla. No existe una métrica o consulta única que pueda ejecutar para cifrar rápidamente los elementos de texto no cifrado existentes. Utilice el proceso que mejor se adapte a su sistema. Por ejemplo, puede utilizar un proceso asíncrono que escanee lentamente la tabla y reescriba los elementos mediante las acciones de los atributos y la configuración de cifrado que haya definido. Para identificar los elementos de texto sin formato de la tabla, se recomienda buscar todos los elementos que no contengan los aws_dbe_foot atributos aws_dbe_head y que el cifrado de AWS bases de datos SDK añade a los elementos cuando están cifrados y firmados.

En el siguiente ejemplo, se actualiza la configuración de cifrado de la tabla desde el paso 1. Debe actualizar la anulación de texto no cifrado con FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT. Esta política sigue leyendo los elementos de texto no cifrado, pero también lee y escribe los elementos cifrados. Cree una nueva DynamoDbEncryptionInterceptor con la actualizacióntableConfigs.

final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>(); final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder() .logicalTableName(ddbTableName) .partitionKeyName("partition_key") .sortKeyName("sort_key") .schemaOnEncrypt(tableSchema) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) .plaintextOverride(PlaintextOverride.FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT) .build(); tableConfigs.put(ddbTableName, config);

Paso 3: Lee solo los elementos cifrados y firmados

Una vez cifrados y firmados todos los elementos, actualice la modificación del texto no cifrado de la DynamoDbEncryptionInterceptor configuración para que el cliente solo pueda leer y escribir los elementos cifrados y firmados. Tras implementar el siguiente cambio, el cliente cifrará y firmará los nuevos elementos en función de las acciones de atributos que configuró en el paso 1. El cliente solo podrá leer los elementos cifrados y firmados.

El siguiente ejemplo actualiza la configuración de cifrado de la tabla desde el paso 2. Puede actualizar la anulación de texto no cifrado con FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT o eliminar la política de texto no cifrado de su configuración. De forma predeterminada, el cliente solo lee y escribe los elementos cifrados y firmados. Cree una nueva DynamoDbEncryptionInterceptor con la actualizacióntableConfigs.

final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>(); final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder() .logicalTableName(ddbTableName) .partitionKeyName("partition_key") .sortKeyName("sort_key") .schemaOnEncrypt(tableSchema) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) // Optional: you can also remove the plaintext policy from your configuration .plaintextOverride(PlaintextOverride.FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT) .build(); tableConfigs.put(ddbTableName, config);