Usar a criptografia no nível de campo para ajudar a proteger dados sigilosos - Amazon CloudFront

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Usar a criptografia no nível de campo para ajudar a proteger dados sigilosos

Com a Amazon CloudFront, você pode impor end-to-end conexões seguras aos 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 em nível de campo, ao configurar sua CloudFront distribuição, especifique o conjunto de campos nas solicitações POST que você deseja criptografar 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 em  CloudFront

CloudFront a criptografia em nível de campo usa criptografia assimétrica, também conhecida como criptografia de chave pública. Você fornece uma chave pública para CloudFront, e todos os dados confidenciais que você especifica são criptografados automaticamente. A chave que você fornece CloudFront não pode ser usada para descriptografar os valores criptografados; somente sua chave privada pode 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 no nível de campo.

  1. Obtenha um par de chaves pública e privada. Você deve 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 em nível de campo, que você cria em 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 de consulta em uma URL de solicitação não existir em 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 deve criptografar os dados.

Configurar a criptografia no 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 CloudFront criptografar dados e a chave privada permite que os componentes em sua 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 sua chave pública ao CloudFront

Depois de obter seu par de chaves RSA, adicione sua chave pública a. CloudFront

Para adicionar sua chave pública ao CloudFront (console)
  1. Faça login no AWS Management Console e abra o CloudFront console emhttps://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 Add.

Você pode adicionar mais teclas para usar CloudFront repetindo as etapas do procedimento.

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

Depois de adicionar pelo menos uma chave pública CloudFront, crie um perfil que informe CloudFront quais campos devem ser 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 CloudFront na etapa 2. CloudFront usa a chave para criptografar os campos que você especifica nesse 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 do campo, você pode digitar o nome inteiro do campo de dados DateOfBirth, como, ou apenas a primeira parte do nome com 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 de criar um ou mais perfis de criptografia em nível de campo, crie uma configuração que especifique o tipo de conteúdo da solicitação que inclui os dados a serem criptografados, o perfil a ser usado para criptografia e outras opções que especificam como você deseja lidar com CloudFront a criptografia.

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

  • Quando o tipo de conteúdo de uma solicitação não está em uma configuração — se você não adicionou um tipo de conteúdo a uma configuração, pode especificar se CloudFront deve encaminhar a solicitação com esse tipo de conteúdo para a origem sem criptografar 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, CloudFront sempre encaminhe as solicitações com esse tipo de conteúdo para a origem.

  • Quando o nome do perfil fornecido em um argumento de consulta é desconhecido — Quando você especifica o argumento de fle-profile consulta com um nome de perfil que não existe para sua distribuição, você pode especificar se CloudFront deve enviar a solicitação para a origem sem criptografar 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, CloudFront usa o perfil que você mapeou para um tipo de conteúdo, se você especificar um. 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. Em seguida, você poderia usar o URL https://d1234.cloudfront.net?fle-profile=SampleProfile em vez dehttps://d1234.cloudfront.net, SampleProfile para CloudFront usar essa solicitação, em vez do perfil que você configurou 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 você quiser alterar o comportamento CloudFront padrão das 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 ao CloudFront para usar o ID do perfil (que você especifica no próximo campo) associado a este argumento de consulta para a criptografia no nível do campo para esta 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). (Em AWS CloudFormation ou na CloudFront API, ViewerProtocolPolicy deve ser definido como redirect-to-https ouhttps-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. (Em AWS CloudFormation ou a CloudFront API, AllowedMethods deve ser definida como GETHEAD,OPTIONS,PUT,POST,PATCH,DELETE. Eles podem ser especificados 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). (Em AWS CloudFormation ou na CloudFront API, OriginProtocolPolicy deve ser definido como match-viewer ouhttps-only.)

Para ter mais informações, consulte Valores especificados ao criar ou atualizar uma distribuição.

Descriptografar campos de dados na origem

CloudFront criptografa 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.

  • 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 CloudFront usados ao inicializar o MasterKey incluem o seguinte:

    • 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 ao carregá-la e CloudFront, em seguida, especificou o nome da chave no perfil. Use o mesmo valor aqui.

    • ALGORITMO: CloudFront usa RSA/ECB/OAEPWithSHA-256AndMGF1Padding como algoritmo para criptografia, então você deve usar o mesmo algoritmo 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)); } }