Use criptografia de nível de campo para ajudar a proteger dados confidenciais - Amazon CloudFront

Use criptografia de nível de campo para ajudar a proteger dados confidenciais

Com o Amazon CloudFront, é possível impor conexões seguras de ponta a ponta a servidores de origem usando HTTPS. A criptografia no nível de campo acrescenta uma camada adicional de segurança que permite proteger dados específicos em todo o processamento do sistema, de modo que apenas alguns aplicativos possam vê-los.

A criptografia no nível de campo habilita permitir que usuários faça upload de informações confidenciais com segurança nos servidores web. As informações confidenciais fornecidas pelos usuários são criptografadas na borda, próximo ao usuário, e permanecem criptografadas em toda a pilha de aplicativos. Essa criptografia garante que somente os aplicativos que precisam dos dados e que têm as credenciais para descriptografá-los possam fazê-lo.

Para usar a criptografia no nível de campo, ao configurar a distribuição do CloudFront, especifique o conjunto de campos nas solicitações POST que você quer que sejam criptografados e a chave pública a ser usada para criptografá-los. Você pode criptografar até 10 campos de dados em uma solicitação. (Não é possível criptografar todos os dados em uma solicitação com criptografia no nível de campo; é preciso especificar campos individuais para criptografar.)

Quando a solicitação HTTPS com criptografia no nível de campo é encaminhada para a origem, e a solicitação é roteada em todo o subsistema ou aplicativo de origem, os dados confidenciais ainda são criptografados, reduzindo o risco de uma violação dos dados ou da perda acidental de dados confidenciais. Os componentes que precisam acessar os dados confidenciais por motivos comerciais, como um sistema de processamento de pagamento que precisa de acesso a um número de crédito, podem usar a chave privada apropriada para descriptografar e acessar os dados.

nota

Para usar a criptografia no nível de campo, a origem deve oferecer suporte à codificação em partes.

Criptografia em nível de campo no CloudFront

A criptografia no nível de campo do CloudFront usa criptografia assimétrica, também conhecida como criptografia de chave pública. Basta você fornecer uma chave pública para o CloudFront e todos os dados confidenciais especificados são criptografados automaticamente. A chave que você fornece ao CloudFront não pode ser usada para descriptografar os valores criptografados; somente sua chave privada poderá fazer isso.

Criptografar apenas dados confidenciais

Visão geral da criptografia no nível de campo

As etapas a seguir fornecem uma visão geral de como configurar a criptografia no nível de campo. Para obter as etapas específicas, consulte Configurar a criptografia em nível de campo.

  1. Obtenha um par de chaves pública e privada. É necessário obter e adicionar a chave pública antes de iniciar a configuração da criptografia no nível de campo do CloudFront.

  2. Crie um perfil de criptografia no nível de campo. Os perfis de criptografia no nível de campo, que são criados no CloudFront, definem os campos que você deseja criptografar.

  3. Crie uma configuração de criptografia no nível de campo. A configuração especifica os perfis a serem usados, com base no tipo de conteúdo da solicitação ou em um argumento de consulta, para criptografar campos de dados específicos. Também é possível escolher as opções de comportamento de encaminhamento de solicitações desejadas para diferentes situações. Por exemplo, você pode definir o comportamento para quando o nome do perfil especificado pelo argumento da consulta de um URL de solicitação não existir no CloudFront.

  4. Vincule um comportamento de cache. Vincule a configuração a um comportamento de cache de uma distribuição para especificar quando o CloudFront deverá criptografar os dados.

Configurar a criptografia em nível de campo

Siga essas etapas para começar a usar a criptografia no nível de campo. Para saber mais sobre cotas (anteriormente conhecidas como limites) na criptografia em nível de campo, consulte Cotas.

Etapa 1: Criar um par de chaves do RSA

Para começar a usar, é necessário criar um par de chaves RSA que inclua uma chave pública e uma chave privada. A chave pública permite que o CloudFront criptografe dados e a chave privada permite que os componentes na origem descriptografem os campos que foram criptografados. Você pode usar o OpenSSL ou outra ferramenta para criar um par de chaves. O tamanho da chave deve ser de 2048 bits.

Por exemplo, se estiver usando OpenSSL, poderá usar o seguinte comando para gerar um par de chaves de 2.048 bits e salvá-lo no arquivo private_key.pem:

openssl genrsa -out private_key.pem 2048

O arquivo resultante contém a chave pública e a privada. Para extrair a chave pública do arquivo, execute o seguinte comando:

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

O arquivo de chave pública (public_key.pem) contém o valor de chave codificada que você colar na etapa seguinte.

Etapa 2: Adicionar uma chave pública ao CloudFront

Após obter o par de chaves RSA, adicione a sua chave pública ao CloudFront.

Como adicionar sua chave pública ao CloudFront (console)
  1. Faça login no AWS Management Console e abra o console do CloudFront em https://console.aws.amazon.com/cloudfront/v4/home.

  2. No painel de navegação, escolha Public key.

  3. Escolha Add public key (Adicionar chave pública).

  4. Em Key name, digite um nome exclusivo para a chave. O nome não pode conter espaços e só pode incluir caracteres alfanuméricos, sublinhados (_) e hífens (-). O número máximo de caracteres é 128.

  5. Em Key value (Valor de chave), cole o valor da chave pública codificada, incluindo as linhas -----BEGIN PUBLIC KEY----- e -----END PUBLIC KEY-----.

  6. Em Comment, adicione um comentário opcional. Por exemplo, você pode incluir a data de expiração para a chave pública.

  7. Escolha Adicionar.

É possível adicionar mais chaves para uso com o CloudFront repetindo as etapas desse procedimento.

Etapa 3: Criar um perfil de criptografia no nível de campo

Depois de adicionar pelo menos uma chave pública ao CloudFront, crie um perfil que informe ao CloudFront quais campos serão criptografados.

Para criar um perfil de criptografia no nível de campo (console)
  1. No painel de navegação, escolha Field-level encryption.

  2. Escolha Create profile (Criar perfil).

  3. Preencha os seguintes campos:

    Profile name

    Digite um nome exclusivo para o perfil. O nome não pode conter espaços e só pode incluir caracteres alfanuméricos, sublinhados (_) e hífens (-). O número máximo de caracteres é 128.

    Nome da chave pública

    Na lista suspensa, escolha o nome de uma chave pública que você adicionou ao CloudFront na etapa 2. O CloudFront usa a chave para criptografar os campos especificados neste perfil.

    Nome do provedor

    Digite uma frase que ajude a identificar a chave, como o provedor que forneceu o par de chaves. Essas informações, juntamente com a chave privada, são necessárias quando os aplicativos descriptografam os campos de dados. O nome do provedor não pode conter espaços e só pode incluir caracteres alfanuméricos, dois pontos (:), sublinhados (_) e hífens (-). O número máximo de caracteres é 128.

    Padrão do nome do campo para correspondência

    Digite os nomes dos campos de dados, ou padrões que identifiquem nomes de campos de dados na solicitação, a serem criptografados pelo CloudFront. Escolha a opção + para adicionar todos os campos que você deseja criptografar com essa chave.

    Para o padrão do nome de campo, você pode digitar o nome inteiro do campo de dados, como DateOfBirth ou apenas a primeira parte do nome seguido por um caractere curinga (*), como CreditCard*. O padrão do nome de campo deve incluir apenas caracteres alfanuméricos, colchetes ([ e ]), pontos (.), sublinhados (_) e hífens (-), além do caractere opcional curinga (*).

    Certifique-se de que você não está usando caracteres sobrepostos para padrões diferentes de nomes de campos. Por exemplo, se você tiver o padrão de nome de campo ABC*, não poderá adicionar um outro padrão de nome de campo que seja AB*. Além disso, os nomes dos campos diferenciam maiúsculas de minúsculas, e o número máximo de caracteres que podem ser usados é 128.

    Comentário

    (Opcional) Digite um comentário sobre este perfil. O número máximo de caracteres que você pode usar é 128.

  4. Após preencher os campos, escolha Create profile (Criar perfil).

  5. Se você deseja adicionar mais perfis, escolha Add profile.

Etapa 4: Criar uma configuração

Depois que criar um ou mais perfis de criptografia no nível de campo, crie uma configuração para especificar o tipo de conteúdo da solicitação que inclua os dados a serem criptografados, o perfil a ser usado na criptografia e outras opções especificando como você deseja que o CloudFront processe a criptografia.

Por exemplo, quando o CloudFront não puder criptografar os dados, você poderá especificar se ele deve bloquear ou encaminhar uma solicitação para a origem nos seguintes cenários:

  • Quando o tipo de conteúdo de uma solicitação não estiver em uma configuração: se não tiver adicionado um tipo de conteúdo a uma configuração, você poderá especificar se o CloudFront deve encaminhar a solicitação com esse tipo de conteúdo para a origem sem criptografar os campos de dados ou bloquear a solicitação e retornar um erro.

    nota

    Se você adicionar um tipo de conteúdo a uma configuração, mas não tiver especificado um perfil para usar com esse tipo, o CloudFront sempre encaminhará as solicitações com esse tipo de conteúdo para a origem.

  • Quando o nome de perfil fornecido em um argumento de consulta for desconhecido: ao especificar o argumento de consulta fle-profile com um nome de perfil que não existe para a distribuição, você poderá especificar se o CloudFront deve enviar a solicitação para a origem sem criptografar os campos de dados ou bloquear a solicitação e retornar um erro.

Em uma configuração, você também pode especificar se um perfil fornecido como um argumento de consulta em uma URL poderá substituir o perfil que foi mapeado para o tipo de conteúdo dessa consulta. Por padrão, o CloudFront usará o perfil que você mapeou para um tipo de conteúdo, se houver um perfil especificado. Isso permite que você tenha um perfil que é usado por padrão, mas que possa decidir, em determinadas solicitações, que deseja impor um perfil diferente.

Assim, por exemplo, é possível especificar (em sua configuração) SampleProfile como o perfil do argumento de consulta a ser usado. Depois, você poderá usar o URL https://d1234.cloudfront.net?fle-profile=SampleProfile em vez de https://d1234.cloudfront.net, para que o CloudFront use SampleProfile para essa solicitação, em vez do perfil configurado para o tipo de conteúdo da solicitação.

Você pode criar até 10 configurações para uma única conta e, em seguida, associar uma das configurações ao comportamento de cache de qualquer distribuição da conta.

Para criar uma configuração de criptografia no nível de campo (console)
  1. Na página Field-level encryption (Criptografia de nível de campo), escolha Create configuration (Criar configuração).

    Observação: se você não tiver criado pelo menos um perfil, não verá a opção para criar uma configuração.

  2. Preencha os seguintes campos para especificar o perfil a ser usado. (Alguns campos não podem ser alterados.)

    Tipo de conteúdo (não pode ser alterado)

    O tipo do conteúdo é definido como application/x-www-form-urlencoded e não pode ser alterado.

    ID do perfil padrão (opcional)

    Na lista suspensa, escolha o perfil que você deseja mapear para o tipo de conteúdo no campo Content type (Tipo de conteúdo).

    Formato do conteúdo (não pode ser alterado)

    O formato do conteúdo é definido como URLencoded e não pode ser alterado.

  3. Se quiser alterar o comportamento padrão do CloudFront para as opções a seguir, marque a caixa de seleção apropriada.

    Encaminhar solicitação para a origem quando o tipo de conteúdo da solicitação não está configurado

    Marque esta caixa de seleção se você quiser permitir que a solicitação vá para a origem caso você não tenha especificado um perfil a ser usado para o tipo de conteúdo da solicitação.

    Substituir perfil de um tipo de conteúdo por um argumento de consulta fornecido

    Marque esta caixa de seleção se você quiser permitir que um perfil fornecido em um argumento de consulta substitua o perfil que você especificou para um tipo de conteúdo.

  4. Se você marcar a caixa de seleção permitindo que um argumento de consulta substitua o perfil padrão, deverá preencher os seguintes campos adicionais para a configuração. É possível criar até cinco desses mapeamentos de argumento de consulta para usar com as consultas.

    Argumento de consulta

    Digite o valor que deseja incluir nas URLs para o argumento de consulta fle-profile. Esse valor informa o CloudFront para usar o ID do perfil (que você especificará no próximo campo) associado a esse argumento de consulta para a criptografia no nível do campo para essa consulta.

    O número máximo de caracteres que você pode usar é 128. O valor não pode incluir espaços e deve usar apenas caracteres alfanuméricos, traço (-), ponto (.), sublinhado (_), asterisco (*), sinal de mais (+) e porcentagem (%).

    ID do perfil

    Na lista suspensa, escolha o perfil que deseja associar ao valor que você digitou em Query argument (Argumento de consulta).

    Encaminhar solicitação para a origem quando o perfil especificado em um argumento de consulta não existe

    Marque esta caixa de seleção se você quiser permitir que a solicitação vá para a origem caso o perfil especificado em um argumento de consulta não esteja definido no CloudFront.

Etapa 5: Adicionar uma configuração ao comportamento de cache

Para usar a criptografia no nível de campo, vincule uma configuração ao comportamento de cache de uma distribuição adicionando o ID da configuração como um valor para a sua distribuição.

Importante

Para vincular uma configuração de criptografia em nível de campo a um comportamento de cache, a distribuição deve ser configurada para sempre usar HTTPS e aceitar solicitações HTTP POST e PUT de visualizadores. Isso significa que:

  • A opção Viewer Protocol Policy (Política de protocolo do visualizador) do comportamento de cache deve ser definida como Redirect HTTP to HTTPS (Redirecionar HTTP para HTTPS) ou HTTPS Only (Somente HTTPS). (No AWS CloudFormation ou na API do CloudFront, ViewerProtocolPolicy deve ser definida como redirect-to-https ou https-only.)

  • A opção Allowed HTTP Methods (Métodos HTTP permitidos) do comportamento de cache deve ser definida como GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE. (No AWS CloudFormation ou na API do CloudFront, AllowedMethods deve ser definido como GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE. É possível defini-los em qualquer ordem.)

  • A opção Origin Protocol Policy (Política de protocolo de origem) deve ser definida como Match Viewer (Corresponder ao visualizador) ou HTTPS Only (Somente HTTPS). (No AWS CloudFormation ou na API do CloudFront, OriginProtocolPolicy deve ser definida como match-viewer ou https-only.)

Para obter mais informações, consulte Referência de configurações da distribuição.

Descriptografar campos de dados na origem

O CloudFront criptografa os campos de dados usando o AWS Encryption SDK. Os dados permanecem criptografados em toda a pilha de aplicativos e podem ser acessados somente por aplicativos que tenham as credenciais necessárias para descriptografá-los.

Após a criptografia, o texto cifrado é codificado em base64. Quando as suas aplicações descriptografam o texto na origem, primeiro devem decodificar o texto cifrado e, depois, usar o SDK de criptografia da AWS para descriptografar os dados.

O exemplo de código a seguir ilustra como os aplicativos podem descriptografar dados na origem. Observe o seguinte:

  • Para simplificar, este exemplo carrega chaves públicas e privadas (em formato DER) a partir de arquivos do diretório de trabalho. Na prática, você pode armazenar a chave privada em um local offline seguro, como um módulo de segurança de hardware offline, e distribuir a chave pública para a equipe de desenvolvimento.

  • O CloudFront usa informações específicas ao criptografar os dados, e o mesmo conjunto de parâmetros deve ser usado na origem para descriptografá-los. Os parâmetros que o CloudFront usa ao inicializar a MasterKey incluem:

    • PROVIDER_NAME: você especificou esse valor quando criou um perfil de criptografia no nível de campo. Use o mesmo valor aqui.

    • KEY_NAME: você criou um nome para sua chave pública quando fez upload para o CloudFront e especificou o nome da chave no perfil. Use o mesmo valor aqui.

    • ALGORITMO: o CloudFront usa RSA/ECB/OAEPWithSHA-256AndMGF1Padding como o algoritmo para criptografia e, portanto, o mesmo algoritmo deve ser usado para descriptografar os dados.

  • Se você executar o seguinte programa de exemplo com um texto cifrado como entrada, a saída dos dados descriptografados será exibida em seu console. Para obter mais informações, consulte o Código de exemplo em Java no SDK de criptografia da AWS.

Código de exemplo

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)); } }