Como criptografar dados do aplicativo

Neste tópico, mostramos uma maneira de usar o Cloud Key Management Service para criptografar diretamente os dados do aplicativo em um cliente, antes de transmiti-lo por uma rede.

Neste exemplo, os dados criptografados são transmitidos ao Google Cloud e armazenados em um bucket do Cloud Storage. O Cloud Storage também é compatível com a criptografia automática do servidor usando chaves de criptografia gerenciadas pelo cliente, que automatiza todo esse processo. Para proteger os dados do aplicativo antes de transmiti-los ao Google Cloud, recomendamos que você use a biblioteca do Tink.

A biblioteca do Tink é uma biblioteca em várias linguagens e em várias plataformas que fornece APIs simples e à prova de uso para tarefas criptográficas comuns. Ele pode ser usado para criptografar dados antes deles entrarem nos armazenamentos do Google Cloud, além de ser compatível com Java, Python, C ++, Go, Objective-C e outras linguagens, e compatível com armazenamento de objetos e serviços de banco de dados relacional.

Neste tutorial, você criptografa um arquivo usando o Cloud KMS antes de fazer o upload dele para um bucket. Em seguida, você faz o download e descriptografa os mesmos dados para que possa lê-los no cliente.

Ao seguir essas instruções, suas chaves e todas as operações criptográficas permanecem no Google Cloud, e você precisa usar o Cloud KMS para descriptografar. A criptografia simétrica bruta permite criptografar ou descriptografar dados localmente ou mover dados criptografados entre diferentes bibliotecas e provedores de serviços sem precisar descriptografar primeiro.

Antes de começar

Na sua organização do Google Cloud, você precisa de permissão para criar novos projetos, ativar o faturamento, criar usuários e gerenciar permissões nesses projetos. O papel roles/resourcemanager.organizationAdmin concede essa permissão.

Configuração

Recomendamos usar dois projetos e dois usuários para garantir separação de tarefas. Se você seguir as etapas neste tópico, os usuários e serviços que gerenciam as chaves de criptografia são diferentes dos usuários e serviços que as utilizam. Um projeto contém e gerencia as chaves, e o outro armazena os dados criptografados em um bucket do Cloud Storage e os descriptografa conforme necessário.

Criar projetos

Você cria projetos no console do Google Cloud. Para instruções passo a passo, consulte o Guia de início rápido do gerenciamento de identidade e acesso.

Dentro da organização:

  1. Crie um projeto do Google Cloud para conter o bucket do Cloud Storage usado para armazenar os secrets. Elas serão armazenadas como objetos no bucket. Nas etapas abaixo, este projeto é chamado de my-storage-project.

  2. Como opção, crie um segundo projeto do Google Cloud para gerenciar as chaves do Cloud KMS usadas para criptografar e descriptografar o secret. Nas etapas abaixo, esse projeto é chamado de my-kms-project.

    É possível usar o mesmo projeto do Google Cloud para my-storage-project e my-kms-project.

  3. Para cada projeto, ative a API Cloud KMS e ative o faturamento seguindo as etapas na seção Antes de começar do Guia de início rápido do Cloud KMS.

Criar usuários

Você cria usuários e concede papéis a eles no console do Google Cloud. Para instruções passo a passo, consulte o Guia de início rápido do gerenciamento de identidade e acesso.

Este procedimento cria dois usuários. key-admin gerencia as chaves de criptografia e key-user pode criptografar e descriptografar dados usando as chaves.

Execute este procedimento no projeto my-kms-project.

  1. Crie o usuário key-admin. Para criar usuários, você precisa do papel roles/resourcemanager.organizationAdmin para o projeto my-kms-project.

  2. Conceda a key-admin o papel roles/cloudkms.admin do gerenciamento de identidade e acesso. key-admin pode criar e gerenciar chaves.

  3. Crie o usuário key-user.

  4. Conceda o papel roles/cloudkms.cryptoKeyEncrypterDecrypter do IAM a key-user. key-user pode usar chaves para criptografar e descriptografar dados.

Crie um bucket de armazenamento

Execute este procedimento no projeto my-storage-project.

  1. Crie um bucket de armazenamento chamado my-bucket.
  2. Conceda a key-user o papel roles/storage.objectAdmin para o intervalo de armazenamento my-bucket.

Criar uma chave de criptografia

Execute este procedimento como o usuário key-admin no projeto my-kms-project.

  1. Crie um keyring chamado storage. O nome dele é exclusivo para o projeto. O keyring não pode ser renomeado nem excluído. Use a Google Cloud CLI para criar um chaveiro.

    gcloud kms keyrings create storage \
      --location global
    
  2. Crie uma chave chamada my-key no keyring storage, para fins de criptografia. O nome dela é exclusivo para o keyring. A chave não pode ser renomeada nem excluída, mas as respectivas versões podem ser destruídas. Use a Google Cloud CLI para criar a chave. Uma versão de chave inicial é criada automaticamente e se tornar a versão principal.

    gcloud kms keys create my-key \
     --location global \
     --keyring storage \
     --purpose encryption
    

Saiba mais sobre como criar chaves e keyrings.

Criptografar o arquivo que contém o segredo

Execute este procedimento como o usuário key-user, usando os dois projetos.

  1. Na máquina local, crie um arquivo chamado my-secret.txt, que contém o texto "This is my secret".

    echo "This is my secret" > my-secret.txt
    
  2. Criptografe my-secret.txt usando a chave my-key no projeto my-kms-project. Grave o arquivo criptografado em mysecret.txt.encrypted.

    gcloud kms encrypt \
     --location global \
     --keyring storage \
     --key my-key \
     --plaintext-file my-secret.txt \
     --ciphertext-file my-secret.txt.encrypted
    

    Saiba mais sobre a criptografia de dados seguindo o guia de início rápido de criptografia de dados.

    Use raw-encrypt para criptografia simétrica bruta.

  3. Faça upload do arquivo my-secret.txt.encrypted criptografado no bucket de armazenamento my-bucket no projeto my-storage-project. Use o seguinte comando da CLI gcloud:

    gcloud storage cp my-secret.txt.encrypted gs://my-storage-bucket
    

    Saiba mais sobre como fazer o upload de objetos para um bucket de armazenamento.

  4. [Opcional] Exclua o arquivo de texto simples my-secret.txt da máquina local. Essa é uma prática recomendada para arquivos que contêm dados confidenciais não criptografados.

O bucket de armazenamento my-storage-bucket agora contém o arquivo my-secret.txt.encrypted, que é criptografado usando a chave my-key,

Descriptografar o arquivo que contém a chave secreta

Realize estas etapas como o usuário key-user usando os dois projetos.

  1. Faça o download do arquivo my-secret.txt.encrypted do bucket de armazenamento my-bucket. Use o seguinte comando da CLI gcloud:

    gcloud storage cp gs://my-storage-bucket/my-secret.txt.encrypted .
    

    Saiba mais sobre como fazer o download de objetos de um bucket de armazenamento.

  2. Tente ler o arquivo usando um comando como less ou um editor de texto. Observe que não é um arquivo de texto simples.

  3. Descriptografe o my-secret.txt.encrypted e salve os dados descriptografados em um novo arquivo de texto simples chamado my-secret.txt.decrypted usando a mesma chave utilizada para criptografar my-secret.txt.

    gcloud kms decrypt --location global \
     --keyring storage \
     --key my-key \
     --ciphertext-file my-secret.txt.encrypted \
     --plaintext-file my-secret.txt.decrypted
    

    Saiba mais sobre como descriptografar dados seguindo o guia de início rápido para criptografar dados.

    Use raw-decrypt para criptografia simétrica bruta.

  4. Leia o arquivo my-secret.txt.decrypted usando o comando cat. O conteúdo dele é idêntico ao conteúdo original do my-secret.txt.

    cat my-secret.txt.decrypted
    
    This is my secret.
  5. [Opcional] Exclua os arquivos my-secret.txt.encrypted e my-secret.txt.decrypted da máquina local.

Limpar

Para limpar, exclua todos os arquivos criados na máquina local e exclua os projetos [MY_KMS_PROJECT] e [MY_STORAGE_PROJECT].

A seguir