View a markdown version of this page

Migración de clientes de cifrado de Amazon S3 (de la V2 a la V4) - AWS SDK para .NET (VERSIÓN 3)

La AWS SDK para .NET versión 3 ha llegado al final del soporte.

Le recomendamos que migre a la V4. AWS SDK para .NET Para obtener más información y detalles sobre cómo migrar, consulte nuestro anuncio de fin de soporte.

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.

Migración de clientes de cifrado de Amazon S3 (de la V2 a la V4)

nota

Si usa la V1 y desea migrar a la V4, primero debe migrar a la V2. Consulte Migración de clientes de cifrado de Amazon S3 (de la V1 a la V2).

En este tema se muestra cómo migrar las aplicaciones de la versión 2 (V2) del cliente de cifrado Amazon Simple Storage Service (Amazon S3) a la versión 4 (V4) y cómo garantizar la disponibilidad de las aplicaciones durante todo el proceso de migración. La versión 4 utiliza AES-GCM un compromiso clave para el cifrado de contenido e introduce políticas de compromiso para mejorar la seguridad contra los ataques de sustitución de claves.

El cliente V4 está disponible en el Amazon.Extensions.S3.Encryption NuGet paquete.

importante

Cambios importantes: los clientes V4 configurados con una REQUIRE_ENCRYPT_REQUIRE_DECRYPT política no pueden descifrar objetos cifrados con clientes V1 o V2. Solo los clientes de la versión 2 más recientes pueden descifrar V4-encrypted objetos con un compromiso clave. Antes de pasar a la REQUIRE_ENCRYPT_REQUIRE_DECRYPT política, debe volver a cifrar todos los datos existentes con clientes de la versión 4 que tengan habilitada la asignación de claves.

Comprender los conceptos de la V4

La V4 utiliza el cifrado de contenido AES-GCM con un compromiso clave e introduce conceptos de seguridad clave que mejoran la protección de los datos cifrados:

Política de compromiso

La política de compromiso controla la forma en que el cliente de cifrado gestiona la confirmación de las claves durante las operaciones de cifrado y descifrado. La V4 admite tres políticas de compromiso:

FORBID_ENCRYPT_ALLOW_DECRYPT

Cifrado: sin compromiso

Descifrado: permite que los objetos no confirmen

Seguridad: no impone el compromiso y puede permitir la manipulación

Compatibilidad: todas las implementaciones de la versión 2 y la versión 4 pueden leer objetos cifrados con esta política

REQUIRE_ENCRYPT_ALLOW_DECRYPT

Cifrado: con un compromiso clave

Descifrado: permite tanto confirmar objetos como no confirmarlos

Seguridad: los objetos nuevos están protegidos contra los ataques de sustitución de claves y los objetos antiguos siguen siendo legibles

Compatibilidad: solo la versión 4 admite esta política

REQUIRE_ENCRYPT_REQUIRE_DECRYPT(Predeterminado para la V4)

Cifrado: con un compromiso clave

Descifrado: solo confirmar objetos

Seguridad: cumplimiento total del compromiso para garantizar la máxima seguridad

Compatibilidad: solo la versión 4 admite esta política

AES GCM con un compromiso clave

La V4 utiliza el cifrado de contenido AES-GCM con un compromiso clave, lo que proporciona una seguridad mejorada:

  • Protección contra manipulaciones: protege contra los ataques de sustitución de claves al vincular criptográficamente la clave a los datos cifrados.

  • Compatibilidad de versiones: los objetos cifrados con un compromiso de clave solo pueden descifrarlos los clientes V4 y las versiones más recientes.

aviso

Antes de habilitar el cifrado con compromiso de clave en producción, asegúrese de que todas las aplicaciones que necesitan descifrar los objetos se hayan actualizado a la versión 4 o una versión más reciente, ya que el cliente V2 está en desuso.

Actualice los clientes existentes para leer los formatos V4

El cliente de cifrado V4 utiliza algoritmos de cifrado que las versiones anteriores del cliente no admiten. El primer paso de la migración es actualizar los clientes de la versión 2 para que puedan leer el nuevo formato de la versión 4.

Actualice las dependencias de los NuGet paquetes

Actualice sus aplicaciones para que usen la versión más reciente del Amazon.Extensions.S3.Encryption NuGet paquete que incluye compatibilidad con la versión 4. Realice los siguientes pasos en cada una de sus aplicaciones:

  1. Actualice al Amazon.Extensions.S3.Encryption paquete más reciente. Si tu proyecto depende directamente de los AWSSDK.KeyManagementService paquetes AWSSDK.S3 o, debes actualizar esas dependencias o eliminarlas para que sus versiones actualizadas se incluyan en este nuevo paquete.

  2. Asegúrese de que sus using declaraciones hagan referencia al espacio de nombres correcto:

    using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives;
  3. Recompile y vuelva a implementar la aplicación.

Sus clientes de la versión 2 actuales seguirán funcionando con el paquete actualizado y podrán descifrar los objetos cifrados por los clientes de la versión 4 (según la política de compromiso utilizada).

Cree e implemente aplicaciones

Después de actualizar las dependencias de sus NuGet paquetes:

  1. Cree su aplicación para asegurarse de que todas las dependencias se resuelvan correctamente.

  2. Pruebe su aplicación en un entorno de desarrollo para comprobar que la funcionalidad existente sigue funcionando.

  3. Implemente la aplicación actualizada en su entorno de producción.

Esta actualización permite a sus clientes de la versión 2 actuales descifrar los objetos que van a cifrar los clientes de la versión 4, lo que garantiza la compatibilidad durante el proceso de migración.

Migre a clientes V4

Tras actualizar los clientes existentes para que lean el nuevo formato de cifrado, puede proceder a actualizar sus aplicaciones de forma segura para que utilicen los clientes de cifrado y descifrado de la versión 4. El cliente V4 proporciona una seguridad mejorada mediante el compromiso de claves y, al mismo tiempo, mantiene la compatibilidad con los objetos cifrados existentes.

Proceso de migración en 4 pasos

La migración de la V2 a la V4 sigue un proceso estructurado de 4 pasos para garantizar la compatibilidad y la seguridad. Cada paso representa una configuración específica que debe implementarse en todas las aplicaciones antes de continuar con el siguiente paso.

  1. Paso 0: Cliente V2 (punto de partida): su implementación de V2 existente

  2. Paso 1: Compatibilidad entre la V4 y la V2: migre al cliente V4 manteniendo el comportamiento de V2-compatible cifrado

  3. Paso 2: V4 con escritura de confirmación de clave: comience a cifrar con la confirmación de clave y, al mismo tiempo, permita descifrar los objetos antiguos

  4. Paso 3: V4 con cumplimiento total: se requiere un compromiso clave tanto para el cifrado como para el descifrado

Paso 0: Cliente V2 (punto de partida)

Esto representa la configuración de su cliente V2 existente. Este paso muestra el estado inicial antes de la migración.

using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 0: V2 Client - Starting configuration var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV2(kmsKeyId, KmsType.KmsContext, encryptionContext); #pragma warning disable 0618 var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2); #pragma warning enable 0618 var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });

Paso 1: Compatibilidad entre la V4 y la V2

Migre al cliente V4 manteniendo un comportamiento idéntico al de la V2. En este paso, se utilizan FORBID_ENCRYPT_ALLOW_DECRYPT políticas para cifrar sin compromiso y permitir el descifrado de todos los objetos.

using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 1: V4 Client with V2 compatibility var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext); var configuration = new AmazonS3CryptoConfigurationV4( SecurityProfile.V4, CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT, ContentEncryptionAlgorithm.AesGcm); var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });

Comportamiento: cifra sin compromiso y puede descifrar objetos confirmados y no confirmados. Idéntico al comportamiento de la V2.

Paso 2: V4 con escrituras de compromiso clave

Comience a cifrar con un compromiso de clave y, al mismo tiempo, mantenga la compatibilidad con versiones anteriores para el descifrado. En este paso se utiliza REQUIRE_ENCRYPT_ALLOW_DECRYPT una política.

aviso

Antes de implementar el paso 2, asegúrese de que todos los lectores se hayan actualizado al paso 1 o a una versión posterior para gestionar el cifrado de la confirmación de claves.

using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 2: V4 Client with key commitment writes var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext); var configuration = new AmazonS3CryptoConfigurationV4( SecurityProfile.V4, CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT, ContentEncryptionAlgorithm.AesGcmWithCommitment); var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });

Comportamiento: se cifra con confirmación y puede descifrar tanto los objetos confirmados como los que no. Los objetos nuevos están protegidos contra los ataques de sustitución de claves.

Paso 3: V4 con plena aplicación

Exija un compromiso clave tanto para el cifrado como para el descifrado. En este paso se utilizan REQUIRE_ENCRYPT_REQUIRE_DECRYPT políticas para garantizar la máxima seguridad.

aviso

Antes de implementar el paso 3, asegúrese de que todos los objetos del sistema se hayan vuelto a cifrar con un compromiso clave (paso 2). Este paso no permitirá descifrar los objetos cifrados sin compromiso.

using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 3: V4 Client with full key commitment enforcement var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext); var configuration = new AmazonS3CryptoConfigurationV4( SecurityProfile.V4, CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT, ContentEncryptionAlgorithm.AesGcmWithCommitment); var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });

Comportamiento: cifra con confirmación, solo descifra objetos cifrados con confirmación. Máxima seguridad contra los ataques de sustitución de claves.

Ejemplos de configuración adicionales

En esta sección se proporcionan ejemplos adicionales para configurar clientes de la versión 4 con diferentes opciones durante la migración.

Habilitar el soporte heredado

Para permitir que los clientes de la versión 4 lean los objetos cifrados por los clientes de la versión 1 y la 2, configure el cliente con una política de compromiso que permita el descifrado de los sistemas antiguos:

using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; // Configure V4 client to read V1/V2 objects var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT) { StorageMode = CryptoStorageMode.ObjectMetadata }; // This configuration allows: // - Encryption: With commitment (secure) // - Decryption: Both V2 (non-committing) and V4 (committing) objects

Utilice esta configuración durante la migración cuando necesite descifrar objetos cifrados por clientes antiguos y, al mismo tiempo, asegurarse de que los objetos nuevos estén cifrados con mayor seguridad.

Configuración del método de almacenamiento

La V4 admite dos métodos de almacenamiento para los metadatos de cifrado. Elija el método que mejor se adapte a su caso de uso:

Metadatos de objetos (predeterminado)

var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT) { StorageMode = CryptoStorageMode.ObjectMetadata }; // Encryption metadata is stored in S3 object metadata

Archivo de instrucciones

var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT) { StorageMode = CryptoStorageMode.InstructionFile }; // Encryption metadata is stored in a separate S3 object (instruction file)

InstructionFileUtilícelo cuando necesite conservar los metadatos de los objetos para otros fines o cuando trabaje con objetos que tengan limitaciones en el tamaño de los metadatos.

Configuración de la política de compromiso

Elija la política de compromiso adecuada en función de sus requisitos de seguridad y de la fase de migración:

Fase de migración (compatibilidad con la versión 2)

// For migration: encrypt without commitment, allow all decryption var migrationConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT);

Fase de transición (recomendada)

// For transition: encrypt with commitment, allow legacy decryption var transitionConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT);

Fase de seguridad total

// For maximum security: require commitment for both encryption and decryption var secureConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT);

Comience con FORBID_ENCRYPT_ALLOW_DECRYPT la migración inicial, pase a la fase de transición y, REQUIRE_ENCRYPT_ALLOW_DECRYPT por último, utilícela REQUIRE_ENCRYPT_REQUIRE_DECRYPT cuando todos los clientes se hayan actualizado y todos los objetos se hayan vuelto a cifrar con compromiso.