Uso del cifrado en el nivel de campo para ayudar a proteger la información confidencial - Amazon CloudFront

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.

Uso del cifrado en el nivel de campo para ayudar a proteger la información confidencial

Con Amazon CloudFront, puede aplicar conexiones integrales seguras a los servidores de origen mediante HTTPS. El cifrado en el nivel de campo añade una capa de seguridad adicional que le permite proteger datos específicos durante su procesamiento en el sistema de forma que solo determinadas aplicaciones puedan verlos.

El cifrado en el nivel de campo le permite facilitar a sus usuarios que carguen de manera segura información sensible a los servidores web. La información confidencial proporcionada por los usuarios se cifra en el borde, cerca del usuario y permanece cifrada en toda la pila de la aplicación. Este cifrado garantiza que solo las aplicaciones que necesitan los datos y que tienen las credenciales para descifrarlos puedan hacerlo.

Para utilizar cifrado en el nivel de campo, cuando configure la distribución de CloudFront, especifique el conjunto de campos de las solicitudes POST que desea cifrar y la clave pública que se va a usar para cifrarlos. Puede cifrar hasta 10 campos de datos en cada solicitud. (No puede cifrar todos los datos de una solicitud mediante el cifrado en el nivel de campo, debe especificar campos individuales).

Cuando la solicitud HTTPS con el cifrado en el nivel de campo se reenvía al origen y se transfiere por toda la aplicación o subsistema de origen, la información confidencial sigue estando cifrada, lo que reduce el riesgo de una infracción de los datos o una pérdida accidental de la información confidencial. Los componentes que necesitan obtener acceso a la información confidencial por motivos empresariales, como un sistema de procesamiento de pagos que necesita tener acceso a un número de tarjeta de crédito, pueden utilizar la clave privada apropiada para descifrar los datos y obtener acceso a ellos.

nota

Para utilizar el cifrado en el nivel de campo, el origen debe admitir la codificación fragmentada.


				Cifrado en nivel de campo en CloudFront

El cifrado en el nivel de campo de CloudFront utiliza cifrado asimétrico, también denominado cifrado de clave pública. Se proporciona una clave pública a CloudFront y toda la información confidencial especificada se cifra automáticamente. La clave proporcionada a CloudFront no se puede utilizar para descifrar los valores cifrados; esto solo puede hacerlo la clave privada.


				Cifrar únicamente la información confidencial

Información general del cifrado en el nivel de campo

Los siguientes pasos proporcionan información general sobre la configuración del cifrado en el nivel de campo. Para conocer los pasos específicos, consulte Configuración del cifrado en el nivel de campo.

  1. Obtener un par clave pública-clave privada. Debe obtener y agregar la clave pública antes de empezar a configurar el cifrado en el nivel de campo en CloudFront.

  2. Crear un perfil de cifrado en el nivel de campo. Los perfiles de cifrado en el nivel de campo que se crean en CloudFront, definen los campos que se deben cifrar.

  3. Crear una configuración de cifrado en el nivel de campo. Una configuración especifica los perfiles que se van a utilizar en función del tipo de contenido de la solicitud o de un argumento de consulta para cifrar campos de datos específicos. También puede elegir las opciones de comportamiento del reenvío de solicitudes que desea para diferentes situaciones. Por ejemplo, puede establecer el comportamiento cuando el nombre del perfil especificado por el argumento de consulta de la URL de una solicitud no exista en CloudFront.

  4. Enlazar a un comportamiento de la caché. Enlace la configuración a un comportamiento de la caché de una distribución para especificar cuándo CloudFront debería cifrar los datos.

Configuración del cifrado en el nivel de campo

Siga estos pasos para empezar a utilizar el cifrado en el nivel de campo. Para obtener información sobre las cuotas (antes denominadas límites) en el cifrado en el nivel de campo, consulte Cuotas.

Paso 1: crear un par de claves RSA

Para comenzar, debe crear un par de claves RSA que incluya una clave pública y una clave privada. La clave pública permite a CloudFront cifrar datos y la clave privada permite que los componentes del origen descifren los campos que se han cifrado. Puede utilizar OpenSSL u otra herramienta para crear un par de claves. El tamaño de la clave debe ser de 2 048 bits.

Por ejemplo, si utiliza OpenSSL, puede ejecutar el siguiente comando para generar un par de claves con una longitud de 2048 bits y guardarlo en el archivo private_key.pem:

openssl genrsa -out private_key.pem 2048

El archivo resultante contiene tanto la clave pública como la privada. Para extraer la clave pública de dicho archivo, ejecute el siguiente comando:

openssl rsa -pubout -in private_key.pem -out public_key.pem

El archivo de clave pública (public_key.pem) contiene el valor de clave cifrada que se pega en el paso siguiente.

Paso 2: Añadir la clave pública a CloudFront

Después de obtener el par de claves RSA, agregue la clave pública a CloudFront.

Para agregar la clave pública a CloudFront (consola)

  1. Inicie sesión en la consola de administración de AWS y abra la consola de CloudFront en https://console.aws.amazon.com/cloudfront/.

  2. En el panel de navegación, elija Public key (Clave pública).

  3. Elija Add public key (Agregar clave pública).

  4. En Key name (Nombre de la clave), escriba un nombre único para la clave. El nombre no puede tener espacios y solo puede incluir caracteres alfanuméricos, guiones bajos (_) y guiones (-). El número máximo de caracteres es 128.

  5. En Key value (valor de clave), pegue el valor de clave codificado de la clave pública, incluidas las líneas -----BEGIN PUBLIC KEY----- y -----END PUBLIC KEY-----.

  6. En Comment (Comentario), añada un comentario opcional. Por ejemplo, podría incluir la fecha de vencimiento de la clave pública.

  7. Elija Add.

Puede agregar más claves para utilizar con CloudFront repitiendo los pasos del procedimiento.

Paso 3: Crear un perfil para el cifrado en el nivel de campo

Después de añadir al menos una clave pública a CloudFront, cree un perfil que indique a este los campos que desea cifrar.

Para crear un perfil para el cifrado en el nivel de campo (consola)

  1. En el panel de navegación, elija Field-level encryption (Cifrado en el nivel de campo).

  2. Elija Create profile (Crear perfil).

  3. Rellene los siguientes campos:

    Profile name (Nombre de perfil)

    Escriba un nombre único para el perfil. El nombre no puede tener espacios y solo puede incluir caracteres alfanuméricos, guiones bajos (_) y guiones (-). El número máximo de caracteres es 128.

    Public key name (Nombre de clave pública)

    En la lista desplegable, elija el nombre de la clave pública que ha agregado a CloudFront en el paso 2. CloudFront utiliza la clave para cifrar los campos especificados en este perfil.

    Provider name (Nombre de proveedor)

    Escriba una frase para ayudar a identificar la clave, como el proveedor del que ha obtenido el par de claves. Necesita esta información, junto con la clave privada, cuando las aplicaciones descifran los campos de datos. El nombre del proveedor no puede tener espacios y solo puede incluir caracteres alfanuméricos, dos puntos (:), guiones bajos (_) y guiones (-). El número máximo de caracteres es 128.

    Field name pattern to match (Patrón de coincidencia de nombres de campo)

    Escriba los nombres de los campos de datos o los patrones que identifican los nombres de los campos de datos de la solicitud que desea que CloudFront cifre. Elija la opción + para añadir todos los campos que desea cifrar con esta clave.

    Para el patrón de nombre de campo, puede escribir el nombre completo del campo de datos, como DateOfBirth, o solo la primera parte del nombre con un carácter comodín (*), como CreditCard*. El patrón de nombre de campo solo puede incluir caracteres alfanuméricos, corchetes ([ y ]), puntos (.), guiones bajos (_) y guiones (-), además del carácter comodín opcional (*).

    Asegúrese de que no utiliza caracteres solapados para diferentes patrones de nombre de campo. Por ejemplo, si tiene el patrón de nombre de campo ABC*, no puede añadir otro patrón de nombre de campo que sea AB*. Además, los nombres de los campos distinguen entre mayúsculas y minúsculas, y que el número máximo de caracteres que puede utilizar es de 128.

    Comentario

    (Opcional) Escriba un comentario sobre este perfil. El número máximo de caracteres que puede utilizar es 128.

  4. Tras rellenar los campos, elija Create profile (Crear perfil).

  5. Si desea añadir más perfiles, elija Add profile (Añadir perfil).

Paso 4: Crear una configuración

Después de crear uno o varios perfiles de cifrado en el nivel de campo, cree una configuración que especifique el tipo de contenido de la solicitud que incluya los datos que se van a cifrar, el perfil que se va a utilizar para el cifrado y otras opciones que especifiquen cómo desea que CloudFront gestione el cifrado.

Por ejemplo, si CloudFront no puede cifrar los datos, puede especificar si CloudFront debería bloquear o reenviar una solicitud al origen en los siguientes casos:

  • Cuando el tipo de contenido de una solicitud no está en una configuración: si no ha agregado un tipo de contenido a una configuración, puede especificar si CloudFront debería reenviar la solicitud con ese tipo de contenido al origen sin cifrar los campos de datos o bloquear la solicitud y devolver un error.

    nota

    Si agrega un tipo de contenido a una configuración pero no ha especificado el perfil con el que utilizarlo, CloudFront siempre reenvía las solicitudes con ese tipo de contenido al origen.

  • Cuando se desconoce el nombre de perfil proporcionado en un argumento de consulta: si especifica el argumento de consulta de fle-profile con un nombre de perfil que no existe para la distribución, puede especificar si CloudFront debería enviar la solicitud al origen sin cifrar los campos de datos o bloquear la solicitud y devolver un error.

En una configuración, también puede especificar si al proporcionar un perfil como un argumento de consulta en una URL se anula el perfil que ha mapeado al tipo de contenido de esa consulta. De forma predeterminada, CloudFront utiliza el perfil que ha mapeado a un tipo de contenido, si especifica uno. Esto le permite tener un perfil que se utiliza de forma predeterminada, pero también optar por aplicar un perfil diferente en determinadas solicitudes.

Así, por ejemplo, puede especificar (en la configuración) SampleProfile como el perfil de argumento de consulta que se va a utilizar. A continuación, puede utilizar la URL https://d1234.cloudfront.net?fle-profile=SampleProfile en lugar de https://d1234.cloudfront.net, para que CloudFront utilice SampleProfile para esta solicitud y no el perfil que ha configurado para el tipo de contenido de la solicitud.

Puede crear hasta 10 configuraciones para una única cuenta y, a continuación, asociar una de ellas al comportamiento de la caché de cualquier distribución para la cuenta.

Para crear una configuración para el cifrado en el nivel de campo (consola)

  1. En la página Field-level encryption (Cifrado en el nivel de campo), elija Create configuration (Crear configuración).

    Nota: para poder ver la opción para crear una configuración, debe haber creado al menos un perfil.

  2. Rellene los siguientes campos para especificar el perfil que se va a usar. (Algunos campos no se pueden cambiar).

    Content type (no se puede cambiar)

    El tipo del contenido está establecido en application/x-www-form-urlencoded y no se puede cambiar.

    Default profile ID (opcional)

    En la lista desplegable, elija el perfil al que desea mapear al tipo de contenido en el campo Content type (Tipo de contenido).

    Content format (no se puede cambiar)

    El formato del contenido está establecido en URLencoded y no se puede cambiar.

  3. Si desea cambiar el comportamiento predeterminado de CloudFront para las siguientes opciones, seleccione la casilla de verificación correspondiente.

    Forward request to origin when request’s content type is not configured (Reenviar solicitud al origen cuando el tipo de contenido de la solicitud no está configurado)

    Seleccione la casilla si desea permitir que la solicitud vaya al origen si no ha especificado el perfil que se va a utilizar para el tipo de contenido de la solicitud.

    Override the profile for a content type with a provided query argument (Invalidar el perfil de un tipo de contenido con un argumento de consulta proporcionado)

    Seleccione la casilla si desea permitir que un perfil proporcionado en un argumento de consulta anule el perfil que ha especificado para un tipo de contenido.

  4. Si selecciona la casilla para permitir que un argumento de consulta anule el perfil predeterminado, debe rellenar los siguientes campos adicionales para la configuración. Puede crear hasta cinco de estos mapeos de argumentos de consulta para su uso con las consultas.

    Query argument (Argumento de consulta)

    Escriba el valor que desea incluir en las URL para el argumento de consulta fle-profile. Este valor indica a CloudFront que debe utilizar el ID de perfil (que especificará en el campo siguiente) asociado con este argumento de consulta para el cifrado en el nivel de campo de esta consulta.

    El número máximo de caracteres que puede utilizar es 128. El valor no puede incluir espacios, y solo se pueden utilizar caracteres alfanuméricos además de los siguientes caracteres: guion (-), punto (.), guion bajo (_), asterisco (*), signo más (+), porcentaje (%).

    Profile ID (ID de perfil)

    En la lista desplegable, elija el perfil que desea asociar al valor que ha especificado para Query argument (Argumento de consulta).

    Forward request to origin when the profile specified in a query argument does not exist (Reenviar solicitud al origen cuando el perfil especificado en una consulta no exista)

    Seleccione la casilla de verificación si desea permitir que la solicitud vaya al origen si el perfil especificado en un argumento de consulta no está definido en CloudFront.

Paso 5: Añadir una configuración a un comportamiento de la caché

Para utilizar el cifrado en el nivel de campo, enlace una configuración a un comportamiento de la caché de una distribución añadiendo el ID de configuración como un valor de dicha distribución.

importante

Para vincular una configuración de cifrado en el nivel de campo a un comportamiento de la caché, la distribución debe configurarse para que siempre use HTTPS y acepte las solicitudes HTTP POST y PUT de los espectadores. Es decir, se debe cumplir lo siguiente:

  • La Viewer Protocol Policy (política del protocolo del espectador) del comportamiento de la caché debe establecerse en Redirect HTTP to HTTPS (Redireccionamiento de HTTP a HTTPS) o HTTPS Only (solo HTTPS). (En AWS CloudFormation o la API de CloudFront, ViewerProtocolPolicy debe establecerse en redirect-to-https o https-only).

  • Los métodos HTTP permitidos del comportamiento de la caché deben establecerse en GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE. (En AWS CloudFormation o la API de CloudFront, AllowedMethods debe establecerse en GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE. Estos se pueden especificar en cualquier orden).

  • La Origin Protocol Policy (política del protocolo de origen) de la configuración de origen debe establecerse en Match Viewer (coincidir con espectador) o HTTPS Only (solo HTTPS). (En AWS CloudFormation o la API de CloudFront, OriginProtocolPolicy debe establecerse en match-viewer o https-only).

Para obtener más información, consulte Valores que deben especificarse al crear o actualizar una distribución.

Descifrado de campos de datos en el origen

CloudFront cifra los campos de datos mediante el SDK de cifrado de AWS. Los datos permanecen cifrados en toda la pila de aplicaciones y únicamente pueden tener acceso a ellos las aplicaciones que dispongan de las credenciales para descifrarlos.

Tras el cifrado, el texto cifrado se codifica en base64. Cuando las aplicaciones descifran el texto en el origen, primero deben descodificar el texto cifrado y, a continuación, utilizar el SDK de cifrado de AWS para descifrar los datos.

El siguiente código de ejemplo ilustra cómo las aplicaciones pueden descifrar datos en el origen. Tenga en cuenta lo siguiente:

  • Para simplificar el ejemplo, esta muestra carga claves públicas y privadas (en formato DER) desde archivos que se encuentran en el directorio de trabajo. En la práctica, debería almacenar la clave privada en una ubicación segura sin conexión, como un módulo de seguridad de hardware sin conexión, y distribuir la clave pública a su equipo de desarrollo.

  • CloudFront utiliza información específica al cifrar los datos y se debería utilizar el mismo conjunto de parámetros en el origen para descifrarlos. Entre los parámetros que CloudFront utiliza al inicializar la clave maestra se incluyen los siguientes:

    • PROVIDER_NAME: este valor se especificó al crear un perfil de cifrado en el nivel de campo. Utilice aquí el mismo valor.

    • KEY_NAME: el nombre para la clave pública se creó al cargarla en CloudFront y, a continuación, se especificó el nombre de la clave en el perfil. Utilice aquí el mismo valor.

    • ALGORITHM: CloudFront utiliza RSA/ECB/OAEPWithSHA-256AndMGF1Padding como algoritmo para cifrar, por lo que debe usar el mismo algoritmo para descifrar los datos.

  • Si ejecuta el siguiente programa de muestra con texto cifrado como entrada, los datos descifrados se muestran en la consola. Para obtener más información, consulte el código de ejemplo de Java del SDK de cifrado de AWS.

Código de muestra

import java.nio.file.Files; import java.nio.file.Paths; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import org.apache.commons.codec.binary.Base64; import com.amazonaws.encryptionsdk.AwsCrypto; import com.amazonaws.encryptionsdk.CryptoResult; import com.amazonaws.encryptionsdk.jce.JceMasterKey; /** * Sample example of decrypting data that has been encrypted by CloudFront Field-Level Encryption. */ public class DecryptExample { private static final String PRIVATE_KEY_FILENAME = "private_key.der"; private static final String PUBLIC_KEY_FILENAME = "public_key.der"; private static PublicKey publicKey; private static PrivateKey privateKey; // CloudFront uses the following values to encrypt data, and your origin must use same values to decrypt it. // In your own code, for PROVIDER_NAME, use the provider name that you specified when you created your Field Level // Encryption Profile. This sample uses 'DEMO' for the value. private static final String PROVIDER_NAME = "DEMO"; // In your own code, use the Key name that you specified when you added your public key to CloudFront. This sample // uses 'DEMOKEY' for the Key name. private static final String KEY_NAME = "DEMOKEY"; // Cloudfront uses this algorithm when encrypting data. private static final String ALGORITHM = "RSA/ECB/OAEPWithSHA-256AndMGF1Padding"; public static void main(final String[] args) throws Exception { final String dataToDecrypt = args[0]; // This sample uses files to get public and private keys. // In practice, you should distribute the public key and save the private key in secure storage. populateKeyPair(); System.out.println(decrypt(debase64(dataToDecrypt))); } private static String decrypt(final byte[] bytesToDecrypt) throws Exception { // You can decrypt the stream only by using the private key. // 1. Instantiate the SDK final AwsCrypto crypto = new AwsCrypto(); // 2. Instantiate a JCE master key final JceMasterKey masterKey = JceMasterKey.getInstance( publicKey, privateKey, PROVIDER_NAME, KEY_NAME, ALGORITHM); // 3. Decrypt the data final CryptoResult <byte[], ? > result = crypto.decryptData(masterKey, bytesToDecrypt); return new String(result.getResult()); } // Function to decode base64 cipher text. private static byte[] debase64(final String value) { return Base64.decodeBase64(value.getBytes()); } private static void populateKeyPair() throws Exception { final byte[] PublicKeyBytes = Files.readAllBytes(Paths.get(PUBLIC_KEY_FILENAME)); final byte[] privateKeyBytes = Files.readAllBytes(Paths.get(PRIVATE_KEY_FILENAME)); publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(PublicKeyBytes)); privateKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes)); } }