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, puedes reforzar end-to-end las conexiones 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 el cifrado a nivel de campo, al configurar la CloudFront distribución, especifique el conjunto de campos de las solicitudes POST que desea cifrar y la clave pública que se utilizará 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 a nivel de campo en  CloudFront

CloudFront El cifrado a nivel de campo utiliza un cifrado asimétrico, también conocido como cifrado de clave pública. Usted proporciona una clave pública y todos los datos confidenciales que especifique se cifran automáticamente. CloudFront La clave que proporciona CloudFront no se puede utilizar para descifrar los valores cifrados; solo su clave privada puede hacerlo.


				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 añadir 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 a nivel de campo, que usted crea CloudFront, definen los campos que desea 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 de reenvío de solicitudes que desee para diferentes escenarios. Por ejemplo, puede establecer el comportamiento para cuando el nombre de perfil especificado por el argumento de consulta en 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 debe 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 CloudFront permite cifrar los datos y la clave privada permite que los componentes de su 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ñada su clave pública a CloudFront

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

Para añadir tu clave pública a CloudFront (consola)
  1. Inicia sesión en AWS Management Console y abre la CloudFront consola enhttps://console.aws.amazon.com/cloudfront/v4/home.

  2. En el panel de navegación, elija 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 (Añadir).

Puede añadir más teclas para utilizarlas 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 CloudFront, cree un perfil que indique CloudFront qué campos debe 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, elige el nombre de la clave pública que has agregado CloudFront en el paso 2. CloudFront utiliza la clave para cifrar los campos que especifique 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 del nombre del campo, puede escribir el nombre completo del campo de datos, por ejemplo 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

Tras crear uno o más perfiles de cifrado a 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 CloudFront gestionar el cifrado.

Por ejemplo, si no CloudFront puede cifrar los datos, puede especificar si CloudFront debe bloquear o reenviar una solicitud a su origen en los siguientes escenarios:

  • Cuando el tipo de contenido de una solicitud no está en una configuración: si no has agregado un tipo de contenido a una configuración, puedes especificar si CloudFront debes 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 agregas un tipo de contenido a una configuración pero no has especificado un perfil para usarlo con ese tipo, reenvía CloudFront siempre las solicitudes con ese tipo de contenido al origen.

  • Cuando se desconoce el nombre de perfil proporcionado en un argumento de consulta: al especificar el argumento de fle-profile consulta con un nombre de perfil que no existe para su distribución, puede especificar si CloudFront debe enviar la solicitud al origen sin cifrar los campos de datos o bloquear la solicitud y generar 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 usa el perfil que has asignado a un tipo de contenido, si lo especificas. 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. Entonces, puedes usar la URL https://d1234.cloudfront.net?fle-profile=SampleProfile en lugar dehttps://d1234.cloudfront.net, SampleProfile para CloudFront utilizarla en esta solicitud, en lugar del perfil que configuraste 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 quieres cambiar el comportamiento CloudFront predeterminado de las siguientes opciones, selecciona la casilla 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 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: Agregar 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 en la CloudFront API, ViewerProtocolPolicy debe estar establecida en redirect-to-https ohttps-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 en la CloudFront API, AllowedMethods debe estar configurada en GETHEAD,OPTIONS,PUT,POST,PATCH,DELETE. 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 en la CloudFront API, OriginProtocolPolicy debe estar configurado en match-viewer ohttps-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. AWS Encryption SDK 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 debe utilizar el mismo conjunto de parámetros en el origen para descifrarlos. Los parámetros que se CloudFront utilizan al inicializar MasterKey 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: creó un nombre para su clave pública cuando la cargó y CloudFront, a continuación, especificó el nombre de la clave en el perfil. Utilice aquí el mismo valor.

    • ALGORITMO: RSA/ECB/OAEPWithSHA-256AndMGF1Padding se CloudFront utiliza como algoritmo de cifrado, por lo que debe utilizar 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)); } }