View a markdown version of this page

Migración de clientes de cifrado de Amazon S3 (de la versión 2 a la versión 3) - AWS SDK para Ruby

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 versión 2 a la versión 3)

nota

Si utilizas la V1 del cliente de cifrado S3, primero debes migrar a la V2 antes de migrar a la V3. Consulte Migración de clientes de cifrado de Amazon S3 (de la V1 a la V2) para obtener instrucciones sobre la migración 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 3 (V3) y cómo garantizar la disponibilidad de las aplicaciones durante todo el proceso de migración. La versión 3 presenta AES GCM con políticas clave de compromiso y compromiso para mejorar la seguridad y proteger contra la manipulación de las claves de datos.

Información general sobre la migración

La versión 3 del cliente de cifrado Amazon S3 presenta AES GCM con un compromiso clave para mejorar la seguridad. Este nuevo algoritmo de cifrado ofrece protección contra la manipulación de claves de datos y garantiza la integridad de los datos cifrados. La migración a la V3 requiere una planificación cuidadosa para mantener la disponibilidad de las aplicaciones y la accesibilidad de los datos durante todo el proceso.

Esta migración se produce en dos fases:

1. Actualice los clientes existentes para leer nuevos formatos. Primero, implementa una versión actualizada del AWS SDK para Ruby en tu aplicación. Esto permitirá a los clientes de cifrado de la versión 2 existentes descifrar los objetos escritos por los nuevos clientes de la versión 3. Si su aplicación usa varios AWS SDK, debe actualizar cada SDK por separado.

2. Migre los clientes de cifrado y descifrado a la V3. Una vez que todos sus clientes de cifrado V2 puedan leer los nuevos formatos, puede migrar los clientes de cifrado y descifrado existentes a sus respectivas versiones V3. Esto incluye configurar las políticas de compromiso y actualizar el código para usar las nuevas opciones de configuración del cliente.

Si aún no ha migrado de la V1 a la V2, primero debe completar esa migración. Consulte Migración de clientes de cifrado de Amazon S3 (de la V1 a la V2) para obtener instrucciones detalladas sobre la migración de la V1 a la V2.

Comprensión de las funciones de la V3

La versión 3 del cliente de cifrado Amazon S3 presenta dos funciones de seguridad clave: las políticas de compromiso y AES GCM con un compromiso clave. Comprender estas características es fundamental para planificar su estrategia de migración y garantizar la seguridad de sus datos cifrados.

Políticas de compromiso

Las políticas de compromiso controlan la forma en que el cliente de cifrado gestiona la confirmación de las claves durante las operaciones de cifrado y descifrado. El compromiso de claves garantiza que los datos cifrados solo se puedan descifrar con la clave exacta que se utilizó para cifrarlos, lo que protege contra ciertos tipos de ataques criptográficos.

El cliente de cifrado V3 admite tres opciones de política de compromiso:

FORBID_ENCRYPT_ALLOW_DECRYPT

Esta política cifra los objetos sin compromiso de clave y permite el descifrado de ambos objetos con y sin compromiso de clave.

  • Comportamiento de cifrado: los objetos se cifran sin comprometer la clave, utilizando el mismo conjunto de algoritmos que la V2.

  • Comportamiento de descifrado: puede descifrar objetos cifrados con o sin compromiso de clave.

  • Implicaciones de seguridad: esta política no impone el compromiso de las claves y puede permitir su manipulación. Los objetos cifrados con esta política no se benefician de las protecciones de seguridad mejoradas que ofrece el compromiso clave. Utilice esta política solo durante la migración cuando necesite mantener la compatibilidad con el comportamiento de cifrado de la versión 2.

  • Compatibilidad de versiones: todas las implementaciones V2 y V3 del cliente de cifrado S3 pueden leer los objetos cifrados con esta política.

REQUIRE_ENCRYPT_ALLOW_DECRYPT

Esta política cifra los objetos con un compromiso de clave y permite el descifrado de ambos objetos con y sin compromiso de clave.

  • Comportamiento de cifrado: los objetos se cifran con un compromiso de clave mediante AES GCM con un compromiso de clave.

  • Comportamiento de descifrado: puede descifrar objetos cifrados con o sin compromiso de clave, lo que proporciona compatibilidad con versiones anteriores.

  • Implicaciones de seguridad: los objetos nuevos se benefician de la protección de la confirmación de claves, mientras que los objetos existentes sin la confirmación de la clave aún pueden leerse. Esto proporciona un equilibrio entre la seguridad y la compatibilidad con versiones anteriores durante la migración.

  • Compatibilidad de versiones: los objetos cifrados con esta política solo pueden leerse en las implementaciones V3 y V2 más recientes del cliente de cifrado S3.

REQUIRE_ENCRYPT_REQUIRE_DECRYPT

Esta política cifra los objetos con un compromiso de clave y solo permite el descifrado de objetos que se cifraron con un compromiso de clave.

  • Comportamiento de cifrado: los objetos se cifran con un compromiso de clave mediante AES GCM con un compromiso de clave.

  • Comportamiento de descifrado: solo se pueden descifrar objetos que se cifraron con un compromiso de clave. Los intentos de descifrar objetos sin la confirmación de la clave fallarán.

  • Implicaciones de seguridad: esta política proporciona el nivel más alto de seguridad al hacer cumplir el compromiso clave para todas las operaciones. Utilice esta política solo después de que todos los objetos se hayan vuelto a cifrar con un compromiso de clave y de que todos los clientes se hayan actualizado a la V3.

  • Compatibilidad de versiones: los objetos cifrados con esta política solo pueden leerlos la V3 y las implementaciones más recientes de la V2 del cliente de cifrado S3. Esta política también impide la lectura de objetos cifrados por los clientes V2 o V1.

nota

Al planificar la migración, comience por mantener la compatibilidad con versiones anteriores y, REQUIRE_ENCRYPT_ALLOW_DECRYPT al mismo tiempo, aprovechar las ventajas de seguridad que supone un compromiso clave con los objetos nuevos. Continúe hasta que REQUIRE_ENCRYPT_REQUIRE_DECRYPT todos los objetos se hayan vuelto a cifrar y todos los clientes se hayan actualizado a la V3.

AES GCM con un compromiso clave

El AES GCM con Key Commitment (ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY) es un nuevo algoritmo de cifrado introducido en la versión 3 que proporciona una mayor seguridad al proteger contra la manipulación de las claves de datos. Entender cómo funciona este algoritmo y cuándo se aplica es importante para planificar la migración.

¿En qué ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY se diferencia de los algoritmos anteriores

Las versiones anteriores del cliente de cifrado S3 utilizaban AES CBC o AES GCM sin compromiso de clave para cifrar la clave de datos de los archivos de instrucciones. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYañade un compromiso criptográfico al proceso de cifrado, que vincula los datos cifrados a una clave específica. Esto evita que un atacante altere la clave de datos cifrada del archivo de instrucciones y provoque que el cliente descifre los datos con una clave incorrecta.

Si no se compromete la clave, es posible que un atacante modifique la clave de datos cifrada de un archivo de instrucciones para descifrarla con una clave diferente, lo que podría permitir el acceso no autorizado o la corrupción de los datos. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYevita este ataque al garantizar que la clave de datos cifrada solo pueda descifrar la clave original que se utilizó durante el cifrado.

Compatibilidad de versiones

Los objetos cifrados solo ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY pueden descifrarse en las implementaciones V3 del cliente de cifrado S3 y en determinadas versiones de transición de la V2 que admiten la lectura de los formatos V3. Los clientes de la versión 2 que no admiten esta transición no pueden descifrar los archivos de instrucciones cifrados con. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY

aviso

Antes de habilitar el cifrado con ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY (mediante políticas de uso REQUIRE_ENCRYPT_ALLOW_DECRYPT o REQUIRE_ENCRYPT_REQUIRE_DECRYPT compromiso), asegúrese de que todos los clientes que necesitan leer los objetos cifrados se hayan actualizado a la V3 o a una versión de transición que admita los formatos V3. Si algún cliente de la versión 2 que no admite la transición intenta leer objetos cifrados con ellosALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY, el descifrado fallará.

Durante la migración, puede usar la FORBID_ENCRYPT_ALLOW_DECRYPT política de confirmación para seguir cifrando sin ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY dejar de permitir que sus clientes de la V3 lean los objetos cifrados con una confirmación de clave. Esto proporciona una ruta de migración segura en la que primero se actualizan todos los lectores y, a continuación, se pasa al cifrado con un compromiso de clave.

Actualizar los clientes existentes para leer nuevos formatos

El cliente de cifrado V3 utiliza algoritmos de cifrado y funciones de confirmación de claves que los clientes de la V2 no admiten de forma predeterminada. El primer paso de la migración consiste en actualizar los clientes de descifrado de la versión 2 a una versión del AWS SDK para Ruby que pueda leer los objetos cifrados de la versión 3. Tras completar este paso, los clientes de la versión 2 de la aplicación podrán descifrar los objetos cifrados por los clientes de cifrado de la versión 3.

Para leer los objetos cifrados por los clientes de la versión 3 (aquellos que utilizan REQUIRE_ENCRYPT_ALLOW_DECRYPT políticas de REQUIRE_ENCRYPT_REQUIRE_DECRYPT compromiso), debes usar la versión 1.93.0 o una posterior de la gema. aws-sdk-s3 Esta versión admite el descifrado de objetos cifrados con AES GCM con Key Commitment.

Instalación desde la línea de comandos

En los proyectos que instalan la aws-sdk-s3 gema desde la línea de comandos, utilice la opción de versión para comprobar que está instalada la versión mínima 1.208.0.

gem install aws-sdk-s3 -v '>= 1.208.0'

Uso de archivos Gemfile

Para los proyectos que usan un Gemfile para administrar las dependencias, establece la versión mínima de la gema en 1.208.0. aws-sdk-s3 Por ejemplo:

gem 'aws-sdk-s3', '>= 1.208.0'
  1. Modifica tu Gemfile para especificar la versión mínima.

  2. Ejecuta bundle update aws-sdk-s3 para actualizar la gema.

  3. Para comprobar su versión, ejecute bundle info aws-sdk-s3.

nota

Tras actualizar a la versión más reciente, sus clientes de cifrado V2 existentes podrán descifrar los objetos cifrados por los clientes de la V3. Sin embargo, seguirán cifrando objetos nuevos mediante algoritmos V2 hasta que los migres a la V3, tal como se describe en la siguiente sección.

Migre los clientes de cifrado y descifrado a la V3

Tras actualizar sus clientes para que lean los nuevos formatos de cifrado, puede actualizar sus aplicaciones a los clientes de cifrado y descifrado de la versión 3. Los pasos siguientes muestran cómo migrar correctamente el código de la V2 a la V3.

Antes de actualizar el código para usar el cliente de cifrado V3, asegúrese de haber seguido los pasos anteriores y de utilizar la versión 1.93.0 o posterior de la aws-sdk-s3 gema.

nota

Al descifrar con AES-GCM, lea todo el objeto hasta el final antes de empezar a utilizar los datos descifrados. Esto se hace para verificar que el objeto no se ha modificado desde que se cifró.

Configuración de clientes V3

El cliente de cifrado V3 presenta nuevas opciones de configuración que controlan el comportamiento de asignación de claves y la compatibilidad con versiones anteriores. Comprender estas opciones es esencial para una migración exitosa.

commitment_policy

El commitment_policy parámetro controla la forma en que el cliente de cifrado gestiona la confirmación de las claves durante las operaciones de cifrado y descifrado. Esta es la opción de configuración más importante para los clientes de la versión 3.

  • :require_encrypt_allow_decrypt- Cifra objetos nuevos con un compromiso de clave y permite descifrar objetos con o sin compromiso de clave. Esta es la configuración recomendada para la migración, ya que proporciona una seguridad mejorada para los objetos nuevos y, al mismo tiempo, mantiene la compatibilidad con versiones anteriores de los objetos de la V2 existentes.

  • :forbid_encrypt_allow_decrypt- Cifra objetos nuevos sin compromiso de clave (mediante algoritmos V2) y permite descifrar objetos con o sin compromiso de clave. Utilice esta configuración solo si necesita mantener el comportamiento de cifrado de la versión 2 durante la migración, por ejemplo, cuando algunos clientes aún no pueden leer los objetos cifrados de la versión 3.

  • :require_encrypt_require_decrypt- Cifra los objetos nuevos con un compromiso de clave y solo permite el descifrado de objetos que se cifraron con un compromiso de clave. Utilice esta configuración solo después de que todos los objetos se hayan vuelto a cifrar con un compromiso de clave y de que todos los clientes se hayan actualizado a la V3.

security_profile

El security_profile parámetro determina la compatibilidad con la lectura de objetos escritos en versiones anteriores de clientes de cifrado. Este parámetro es esencial para mantener la compatibilidad con versiones anteriores durante la migración.

  • :v3_and_legacy- Permite al cliente V3 descifrar objetos cifrados por los clientes de cifrado V1 y V2. Utilice esta configuración durante la migración para asegurarse de que sus clientes de V3 puedan leer todos los objetos cifrados existentes.

  • :v3- Permite que el cliente V3 descifre objetos cifrados únicamente por clientes de cifrado V2. Utilice esta configuración si ya ha migrado todos los objetos V1 al formato V2.

  • Si no se especifica, el cliente solo descifrará los objetos cifrados por los clientes de la V3. Úselo solo para el desarrollo de aplicaciones nuevas en las que no existan objetos antiguos.

envelope_location

El envelope_location parámetro determina dónde se almacenan los metadatos de cifrado (incluida la clave de datos cifrada). Este parámetro afecta a los objetos que AES GCM protege con Key Commitment.

  • :metadata(Predeterminado): almacena los metadatos de cifrado en los encabezados de metadatos del objeto S3. Este es el comportamiento predeterminado y se recomienda para la mayoría de los casos de uso. Cuando se utiliza el almacenamiento de metadatos, no se aplica el GCM de AES con un compromiso clave.

  • :instruction_file- Almacena los metadatos de cifrado en un objeto S3 independiente (archivo de instrucciones) con un sufijo configurable. Cuando se utilizan archivos de instrucciones, el GCM de AES con un compromiso clave protege la clave de datos cifrada de la manipulación. Utilice esta configuración si necesita la seguridad adicional que proporciona el compromiso de clave para la propia clave de datos.

Al usarla:instruction_file, si lo desea, puede especificar el instruction_file_suffix parámetro para personalizar el sufijo utilizado para los objetos del archivo de instrucciones. El sufijo predeterminado es. .instruction

Cuándo usar cada opción de configuración

Durante la migración, siga esta estrategia de configuración recomendada:

  1. Migración inicial: configurar commitment_policy: :require_encrypt_allow_decrypt ysecurity_profile: :v3_and_legacy. Esto permite a sus clientes de V3 cifrar objetos nuevos con un compromiso clave y, al mismo tiempo, poder descifrar todos los objetos V1 y V2 existentes.

  2. Después de actualizar todos los clientes: continúe usando commitment_policy: :require_encrypt_allow_decrypt y security_profile: :v3_and_legacy hasta que haya vuelto a cifrar todos los objetos que necesitan protección por compromiso de claves.

  3. Aplicación completa de la V3: solo cuando todos los objetos se hayan vuelto a cifrar con la confirmación de clave y ya no necesite leer V1/V2 los objetos, puede cambiar de forma opcional al security_profile parámetro commitment_policy: :require_encrypt_require_decrypt y eliminarlo (o configurarlo :v2 si aún existen objetos de la versión 2).

O bienenvelope_location, sigue usando tu método de almacenamiento actual (:metadatao:instruction_file) a menos que tengas un motivo específico para cambiarlo. Si actualmente utiliza el almacenamiento de metadatos y desea contar con la seguridad adicional de AES GCM con un compromiso clave para la clave de datos, puede cambiarlo:instruction_file, pero tenga en cuenta que para ello será necesario actualizar todos los clientes que lean estos objetos.

Migre los clientes de cifrado y descifrado a la V3

Tras actualizar sus clientes para que lean los nuevos formatos de cifrado, puede actualizar sus aplicaciones a los clientes de cifrado y descifrado de la versión 3. Los siguientes ejemplos muestran cómo migrar correctamente el código de la V2 a la V3.

Uso de clientes de cifrado V3

Pre-migration (V2)

require 'aws-sdk-s3' # Create V2 encryption client with KMS client = Aws::S3::EncryptionV2::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v2_and_legacy, commitment_policy: :forbid_encrypt_allow_decrypt ) # Encrypt and upload object client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # Download and decrypt object resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read

Durante la migración (V3 con compatibilidad con versiones anteriores)

require 'aws-sdk-s3' # Create V3 encryption client with KMS client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3_and_legacy, commitment_policy: :require_encrypt_allow_decrypt ) # Encrypt and upload object client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # Download and decrypt object resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read

Post-migration (V3)

require 'aws-sdk-s3' # Create V3 encryption client with KMS client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3, # Use the commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) # This encrypts with key commitment and does not decrypt V2 objects commitment_policy: :require_encrypt_require_decrypt ) # Encrypt and upload object client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # Download and decrypt object resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read

La diferencia clave en la V3 es la adición del commitment_policy parámetro. Al configurarlo, se :require_encrypt_require_decrypt garantiza que los objetos nuevos se cifran con un compromiso de clave y que el cliente solo descifra los objetos cifrados con un compromiso de clave, lo que proporciona una mayor seguridad contra la manipulación de las claves de datos.

La put_object llamada en sí misma permanece inalterada. Todas las mejoras de seguridad se configuran a nivel de cliente.

Ejemplos adicionales

En esta sección se proporcionan ejemplos adicionales de escenarios de migración y opciones de configuración específicos que pueden resultar útiles durante la migración de la versión 2 a la versión 3.

Archivo de instrucciones frente a almacenamiento de metadatos

El cliente de cifrado S3 puede almacenar los metadatos de cifrado (incluida la clave de datos cifrada) en dos ubicaciones diferentes: en los encabezados de metadatos del objeto S3 o en un archivo de instrucciones independiente. La elección del método de almacenamiento afecta a los objetos que se benefician del AES GCM con la protección Key Commitment.

Almacenamiento de metadatos (predeterminado)

De forma predeterminada, el cliente de cifrado almacena los metadatos de cifrado en los encabezados de metadatos del objeto S3. Este es el enfoque recomendado para la mayoría de los casos de uso, ya que mantiene los metadatos de cifrado en el objeto y no requiere administrar objetos del archivo de instrucciones por separado.

require 'aws-sdk-s3' # Create V3 encryption client with metadata storage (default) client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3_and_legacy, commitment_policy: :require_encrypt_allow_decrypt, envelope_location: :metadata # Explicitly set to metadata (this is the default) ) # Encrypt and upload object # Encryption metadata is stored in the object's metadata headers client.put_object(bucket: 'my-bucket', key: 'my-object',body: 'secret data')

Cuando se utiliza el almacenamiento de metadatos, el GCM de AES con un compromiso de clave no se aplica a la clave de datos cifrada. Sin embargo, el cifrado del contenido sigue beneficiándose del compromiso clave cuando se utiliza commitment_policy: :require_encrypt_allow_decrypt o:require_encrypt_require_decrypt.

Almacenamiento de archivos de instrucciones

Como alternativa, puede configurar el cliente de cifrado para almacenar los metadatos de cifrado en un objeto S3 independiente denominado archivo de instrucciones. Cuando se utilizan archivos de instrucciones con la versión 3, la clave de datos cifrada está protegida por AES GCM con un compromiso de clave, lo que proporciona una seguridad adicional contra la manipulación de la clave de datos.

require 'aws-sdk-s3' # Create V3 encryption client with instruction file storage client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3_and_legacy, commitment_policy: :require_encrypt_allow_decrypt, envelope_location: :instruction_file, # Store metadata in separate instruction file instruction_file_suffix: '.instruction' # Optional: customize the suffix (default is '.instruction') ) # Encrypt and upload object # Encryption metadata is stored in a separate object: 'my-object.instruction' client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # When retrieving the object, the client automatically reads the instruction file resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read

Cuando se usaenvelope_location: :instruction_file, el cliente de cifrado crea dos objetos S3:

  1. El objeto de datos cifrados (p. ej.,my-object)

  2. El archivo de instrucciones que contiene los metadatos de cifrado (p. ej.,my-object.instruction)

El instruction_file_suffix parámetro permite personalizar el sufijo utilizado para los archivos de instrucciones. El valor predeterminado es .instruction.

Cuándo usar cada método de almacenamiento

  • Utilice el almacenamiento de metadatos en la mayoría de los escenarios. Simplifica la administración de objetos, ya que los metadatos de cifrado viajan con el objeto.

  • Utilice el almacenamiento de archivos de instrucciones 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 los archivos de instrucciones requiere administrar dos objetos de S3 (el objeto cifrado y su archivo de instrucciones) en lugar de uno.

aviso

Si cambias del almacenamiento de metadatos al almacenamiento de archivos de instrucciones (o viceversa), los clientes configurados con el nuevo método de almacenamiento no podrán leer los objetos existentes cifrados con el método de almacenamiento anterior. Planifique su método de almacenamiento con cuidado y mantenga la coherencia en toda la aplicación.