Migración del cliente de cifrado Amazon S3 (V2 a V3) - AWS SDK para C++

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 del cliente de cifrado Amazon S3 (V2 a V3)

nota

Si utiliza la versión 1 del cliente de cifrado Amazon S3, primero debe migrar a la versión 2 antes de migrar a la versión 3. Consulte Migración del cliente de cifrado Amazon S3 (V1 a V2).

En este tema se muestra cómo migrar las aplicaciones de la versión 2 (V2) a la versión 3 (V3) del cliente de cifrado Amazon Simple Storage Service (Amazon S3) y cómo garantizar la disponibilidad de las aplicaciones durante todo el proceso de migración. La versión 3 presenta el ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY algoritmo y las políticas de compromiso para mejorar la seguridad mediante la protección contra la manipulación de las claves de datos en los archivos de instrucciones.

Información general sobre la migración

Esta migración se produce en dos fases:

1. Actualice los clientes existentes para leer nuevos formatos. En primer lugar, implemente una versión actualizada de AWS SDK para C++ en su aplicación. Esto permite a los clientes de cifrado V2 existentes descifrar los objetos escritos por los nuevos clientes V3. Si su aplicación usa varios AWS SDKs, debe actualizar cada SDK por separado.

2. Migre los clientes de cifrado y descifrado a la versión 3. Una vez que todos sus clientes de cifrado V2 puedan leer nuevos formatos, puede migrar los clientes de cifrado y descifrado existentes a sus respectivas versiones V3.

Comprensión de los conceptos de la V3

La versión 3 del cliente de cifrado Amazon S3 presenta nuevas características de seguridad que mejoran la protección contra la manipulación de claves de datos. Comprender estos conceptos es esencial para una migración exitosa.

Política de compromiso

Las políticas de compromiso controlan la forma en que el cliente de cifrado gestiona el compromiso de claves durante las operaciones de cifrado y descifrado. La versión 3 ofrece tres opciones de políticas para admitir diferentes escenarios de migración y requisitos de seguridad:

FORBID_ENCRYPT_ALLOW_DECRYPT

Comportamiento de cifrado: cifra los objetos sin compromiso de clave, utilizando los mismos algoritmos que la V2.

Comportamiento de descifrado: permite descifrar objetos cifrados con y sin compromiso de clave.

Implicaciones de seguridad: esta política no impone ningún compromiso con la clave y puede permitir la manipulación de la clave de datos cifrada de los archivos de instrucciones. Utilice esta política solo durante la fase de migración inicial cuando necesite que los clientes de la versión 2 lean los objetos recién cifrados.

Compatibilidad de versiones: los objetos cifrados con esta política se pueden leer en todas las implementaciones de las versiones 2 y 3.

REQUIRE_ENCRYPT_ALLOW_DECRYPT (predeterminado)

Comportamiento de cifrado: cifra los objetos con un compromiso de clave mediante el algoritmo. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY

Comportamiento de descifrado: permite descifrar tanto los objetos cifrados con compromiso de clave como los objetos cifrados sin compromiso de clave.

Implicaciones de seguridad: esta política proporciona una seguridad sólida para los objetos recién cifrados y, al mismo tiempo, mantiene la compatibilidad con versiones anteriores para leer objetos antiguos. Esta es la política recomendada para la mayoría de los escenarios de migración.

Compatibilidad de versiones: los objetos cifrados con esta política solo pueden leerse en la versión 3 y en las implementaciones más recientes de la versión 2. Los clientes de la versión 2 no pueden descifrar estos objetos. Sin embargo, los clientes V3 que utilizan esta política aún pueden descifrar los objetos cifrados por los clientes V2.

REQUIRE_ENCRYPT_REQUIRE_DECRYPT

Comportamiento de cifrado: cifra los objetos con un compromiso de clave mediante el algoritmo. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY

Comportamiento de descifrado: solo permite descifrar objetos cifrados con compromiso de clave. Rechaza los objetos cifrados sin compromiso de clave.

Implicaciones de seguridad: esta política proporciona el más alto nivel de seguridad al imponer un compromiso clave en todas las operaciones. Utilice esta política solo después de que todos los objetos se hayan vuelto a cifrar con la clave y ya no necesite leer los objetos cifrados V1 o V2 antiguos.

Compatibilidad de versiones: los objetos cifrados con esta política solo pueden leerse en la versión 3 y en las implementaciones más recientes de la versión 2. Además, los clientes que utilizan esta política no pueden descifrar los objetos cifrados por los clientes V1 o V2.

Consideraciones sobre la migración: durante la migración, comience por FORBID_ENCRYPT_ALLOW_DECRYPT si necesita que los clientes de la versión 2 lean los objetos nuevos y, a continuación, continúe con esa opción REQUIRE_ENCRYPT_ALLOW_DECRYPT una vez que todos los clientes se hayan actualizado a la versión 3. Por último, considérelo REQUIRE_ENCRYPT_REQUIRE_DECRYPT solo después de volver a cifrar todos los objetos antiguos.

Algoritmo ALG_AES_256_GCM_HKDF_ _COMMIT_KEY SHA512

El ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY algoritmo es un nuevo algoritmo de cifrado introducido en la versión 3 que proporciona una seguridad mejorada para las claves de datos cifradas almacenadas en los archivos de instrucciones.

Impacto en los archivos de instrucciones: el ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY algoritmo solo afecta a los archivos de instrucciones, que son objetos S3 independientes que almacenan metadatos de cifrado, incluida la clave de datos cifrados. Este cambio de algoritmo no afecta a los objetos que almacenan metadatos de cifrado en metadatos de objetos (el método de almacenamiento predeterminado).

Protección contra la manipulación: el ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY algoritmo protege contra la manipulación de las claves de datos al vincular criptográficamente la clave de datos cifrada al contexto de cifrado. Esto evita que los atacantes sustituyan una clave de datos cifrados diferente en el archivo de instrucciones, lo que podría provocar el descifrado por una clave no deseada.

Compatibilidad de versiones: los objetos cifrados con el ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY algoritmo solo se pueden descifrar mediante las implementaciones de la versión 3 y las versiones de transición más recientes del SDK, que incluyen soporte para el descifrado de la versión 3.

aviso

Importante: Antes de habilitar el cifrado con el ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY algoritmo (mediante políticas REQUIRE_ENCRYPT_ALLOW_DECRYPT o políticas de REQUIRE_ENCRYPT_REQUIRE_DECRYPT compromiso), debe asegurarse de que todos los clientes que lean estos objetos se hayan actualizado a la V3 o a la última versión de transición a la V2 que admita el descifrado de la V3. Si no se actualizan primero todos los lectores, se producirán errores al descifrar los objetos recién cifrados.

Actualizar los clientes existentes para leer nuevos formatos

Primero debe actualizar los clientes existentes a la versión más reciente del SDK. Tras completar este paso, los clientes V2 de su aplicación podrán descifrar los objetos cifrados por los clientes de cifrado V3 sin actualizar la base de código de la aplicación.

Cree e instale la última versión de AWS SDK para C++

Aplicaciones que utilizan el SDK desde el código fuente

Si compilas e instalas la fuente AWS SDK para C++ desde la fuente, descarga o clona la fuente del SDK desde aws/aws-sdk-cppuna GitHub. Luego, repita los pasos de compilación e instalación normales.

Si vas AWS SDK para C++ a actualizar desde una versión anterior a la 1.11.x, consulta este REGISTRO DE CAMBIOS para ver los cambios más importantes introducidos en cada versión principal. Para obtener más información sobre cómo compilar e instalar, consulte. AWS SDK para C++ Obtención del AWS SDK para C++ desde el código fuente

Aplicaciones que utilizan el SDK desde Vcpkg

Si su aplicación utiliza Vcpkg para realizar un seguimiento de las actualizaciones del SDK, simplemente use su método de actualización de Vcpkg existente para actualizar el SDK a la versión más reciente. Tenga en cuenta que hay un retraso entre el momento en que se publica una versión y el momento en que está disponible a través de un administrador de paquetes. La versión más reciente siempre está disponible en la instalación desde el código fuente.

Ejecute el siguiente comando para actualizar el paquete aws-sdk-cpp:

vcpkg upgrade aws-sdk-cpp

Y compruebe la versión del paquete aws-sdk-cpp:

vcpkg list aws-sdk-cpp

La versión debe ser al menos la 1.11.x para poder descifrar objetos cifrados en la versión 3.

Para obtener más información sobre el uso de Vcpkg con, consulte. AWS SDK para C++ Obtención del AWS SDK para C++ de un administrador de paquetes

Creación, instalación e implementación de sus aplicaciones

Si su aplicación se enlaza de forma estática con el AWS SDK para C++, no es necesario realizar cambios en el código de la aplicación, pero debe volver a compilarla para utilizar los cambios más recientes del SDK. Este paso no es necesario en el caso de la vinculación dinámica.

Tras actualizar la versión dependiente de la aplicación y comprobar su funcionalidad, proceda a implementar la aplicación en su flota. Una vez completada la implementación de la aplicación, puede continuar con la siguiente fase de migración de la aplicación para utilizar los clientes de cifrado y descifrado V3.

Migre los clientes de cifrado y descifrado a la V3

Los siguientes pasos le muestran cómo migrar correctamente el código de la V2 a la V3 del cliente de cifrado Amazon S3. Dado que es necesario realizar cambios en el código, tendrá que volver a crear la aplicación, independientemente de si se vincula estática o dinámicamente con ella. AWS SDK para C++

Uso de clientes de cifrado V3

La V3 introduce la S3EncryptionClientV3 clase y reemplaza CryptoConfigurationV3 a los equivalentes de la V2. Las principales diferencias en la V3 son:

  • La V3 usa KMSWithContextEncryptionMaterials (igual que la V2) pero requiere una configuración explícita en. CryptoConfigurationV3

  • Todas PutObject las operaciones requieren un mapa de contexto de cifrado (puede estar vacío).

  • La versión 3 introduce políticas de compromiso para controlar el comportamiento de cifrado y descifrado.

  • De forma predeterminada, la V3 cifra con clave de compromiso mediante el algoritmo. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY

  • La API de configuración de descifrado del algoritmo antiguo cambia de a. config.SetSecurityProfile(SecurityProfile::V2_AND_LEGACY); config.AllowLegacy();

Ejemplo: migración de la V2 a la V3 con cifrado KMS

Antes de la migración (V2)

// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV2", CUSTOMER_MASTER_KEY_ID); // Create V2 crypto configuration CryptoConfigurationV2 cryptoConfig(materials); // Create V2 encryption client S3EncryptionClientV2 encryptionClient(cryptoConfig); // Put object with encryption context Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); encryptionContext.emplace("version", "1.11.0"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // Get object with encryption context GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(OBJECT_KEY); auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);

Durante la migración (versión 3 con compatibilidad con versiones anteriores)

// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration with materials CryptoConfigurationV3 cryptoConfig(materials); // Set commitment policy to maintain compatibility with V2 encrypted objects // This allows V3 clients to decrypt objects encrypted by the V2 client cryptoConfig.SetCommitmentPolicy(CommitmentPolicy::REQUIRE_ENCRYPT_ALLOW_DECRYPT); // Create V3 encryption client S3EncryptionClientV3 encryptionClient(cryptoConfig); // Put object with encryption context Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); encryptionContext.emplace("version", "1.11.0"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // Get object with encryption context GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(OBJECT_KEY); auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);

Después de la migración (versión 3 con un compromiso clave)

// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration with materials CryptoConfigurationV3 cryptoConfig(materials); // Use the default commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) // This encrypts with key commitment and does not decrypt V2 objects // cryptoConfig.SetCommitmentPolicy(CommitmentPolicy::REQUIRE_ENCRYPT_ALLOW_DECRYPT); // Create V3 encryption client S3EncryptionClientV3 encryptionClient(cryptoConfig); // Put object with encryption context Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); encryptionContext.emplace("version", "1.11.0"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // Get object with encryption context GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(OBJECT_KEY); auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);

Ejemplos adicionales

En esta sección se proporcionan ejemplos adicionales para configurar las opciones del cliente de cifrado de la V3 para que sean compatibles con diversos escenarios y requisitos de migración.

Habilitación de Legacy Support

Los clientes de la versión 3 pueden descifrar los objetos cifrados por los clientes de la versión 2 solo si utilizan las políticas REQUIRE_ENCRYPT_ALLOW_DECRYPT o las políticas de FORBID_ENCRYPT_ALLOW_DECRYPT compromiso. Sin embargo, si necesita descifrar los objetos cifrados por los clientes de la versión 1, debe habilitar explícitamente la compatibilidad con versiones antiguas mediante este método. AllowLegacy()

Cuándo utilizar el soporte antiguo:

  • Tiene objetos en S3 que se cifraron con la versión 1 del cliente de cifrado de S3.

  • Debe leer estos objetos cifrados en la versión 1 con el cliente de la versión 3 durante el proceso de migración.

  • Está utilizando la política de compromiso REQUIRE_ENCRYPT_ALLOW_DECRYPT o. FORBID_ENCRYPT_ALLOW_DECRYPT

aviso

El soporte antiguo solo debe habilitarse temporalmente durante la migración. Una vez que todos los objetos de la V1 se hayan vuelto a cifrar con la V2 o la V3, deshabilite la compatibilidad con la versión anterior para garantizar la máxima seguridad.

Ejemplo: activación de Legacy Support

// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration CryptoConfigurationV3 cryptoConfig(materials); // Enable legacy support to read V1 encrypted objects cryptoConfig.AllowLegacy(); // Set commitment policy (default is REQUIRE_ENCRYPT_REQUIRE_DECRYPT but we need to allow decryption) cryptoConfig.SetCommitmentPolicy(CommitmentPolicy::REQUIRE_ENCRYPT_ALLOW_DECRYPT); // Create V3 encryption client with legacy support enabled S3EncryptionClientV3 encryptionClient(cryptoConfig); // Now you can decrypt objects encrypted by V1, V2, and V3 clients GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(LEGACY_OBJECT_KEY); Aws::Map<Aws::String, Aws::String> encryptionContext; auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);

Configuración del método de almacenamiento

El cliente de cifrado de S3 puede almacenar los metadatos de cifrado de dos maneras: como metadatos de objetos (opción predeterminada) o en un archivo de instrucciones independiente. Puede configurar el método de almacenamiento mediante el SetStorageMethod() método activadoCryptoConfigurationV3.

Opciones de método de almacenamiento:

METADATA (predeterminado)

Los metadatos de cifrado se almacenan en los encabezados de metadatos del objeto. Este es el método más común y práctico, ya que toda la información de cifrado se almacena con el propio objeto.

Cuándo usarlo: utilice este método en la mayoría de los escenarios. Simplifica la administración de objetos, ya que los metadatos de cifrado viajan con el objeto.

INSTRUCTION_FILE

Los metadatos de cifrado se almacenan en un objeto S3 independiente (el archivo de instrucciones) con el sufijo.instruction.

Cuándo usarlo: utilice este método cuando el tamaño de los metadatos del objeto sea un problema o cuando necesite separar los metadatos de cifrado del objeto cifrado. Tenga en cuenta que el uso de archivos de instrucciones requiere administrar dos objetos de S3 (el objeto cifrado y su archivo de instrucciones) en lugar de uno.

Ejemplo: configuración del método de almacenamiento

// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration CryptoConfigurationV3 cryptoConfig(materials); // Option 1: Use metadata storage (default, can be omitted) cryptoConfig.SetStorageMethod(StorageMethod::METADATA); // Option 2: Use instruction file storage cryptoConfig.SetStorageMethod(StorageMethod::INSTRUCTION_FILE); // Create V3 encryption client with the configured storage method S3EncryptionClientV3 encryptionClient(cryptoConfig); // Put object - encryption metadata will be stored according to the configured method Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // If using INSTRUCTION_FILE, a separate object with key "OBJECT_KEY.instruction" will be created
nota

Cuando utilice el método INSTRUCTION_FILE de almacenamiento, recuerde que al eliminar el objeto cifrado no se elimina automáticamente el archivo de instrucciones. Debe gestionar ambos objetos por separado.