Como criptografar dados do aplicativo

Esta página mostra 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 são armazenados em um bucket do Cloud Storage. O Cloud Storage também oferece suporte à 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 Tink.

A biblioteca Tink é uma biblioteca multiplataforma que fornece APIs para tarefas criptográficas comuns. Ele pode ser usado para criptografar dados antes de eles entrarem nos armazenamentos de dados do Google Cloud . Além disso, ele oferece suporte a Java, Python, C++, Go, Objective-C e outras linguagens, além de 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 estas instruções, suas chaves e todas as operações criptográficas permanecem no Google Cloud e você precisa usar o Cloud KMS para descriptografia. 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 deste guia, 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.

Crie os seguintes projetos na sua organização:

  1. Crie um projeto para conter o bucket do Cloud Storage usado para armazenar os secrets. Os segredos serão armazenados como objetos no bucket. Esse projeto é chamado de STORAGE_PROJECT_ID.

  2. Crie um segundo projeto do Google Cloud para gerenciar as chaves do Cloud KMS usadas para criptografar e descriptografar o secret. Esse projeto é chamado de KEY_PROJECT_ID.

  3. Para cada projeto, ative a API Cloud KMS e 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. O administrador de chaves gerencia as chaves de criptografia, e o usuário pode criptografar e descriptografar dados usando as chaves.

Execute este procedimento no projeto KEY_PROJECT_ID.

  1. Crie a conta de administrador principal.

  2. Conceda o papel roles/cloudkms.admin do Identity and Access Management ao administrador principal. Com esse papel, o administrador de chaves pode criar e gerenciar chaves.

  3. Crie a conta de usuário principal.

  4. Conceda o papel do IAM roles/cloudkms.cryptoKeyEncrypterDecrypter ao usuário principal. Essa função permite que o usuário principal criptografe e descriptografe dados.

Criar um bucket de armazenamento

Execute este procedimento no projeto STORAGE_PROJECT_ID.

  1. Crie um bucket de armazenamento chamado STORAGE_BUCKET.
  2. Conceda o papel roles/storage.objectAdmin no bucket de armazenamento STORAGE_BUCKET à conta de usuário da chave.

Criar uma chave de criptografia

Execute este procedimento como o usuário administrador de chaves no projeto KEY_PROJECT_ID.

  1. Criar um keyring O nome de um keyring precisa ser exclusivo no projeto. Não é possível renomear ou excluir um keyring. Use a Google Cloud CLI para criar um chaveiro.

    gcloud kms keyrings create KEY_RING \
      --location LOCATION
    

    Substitua:

    • KEY_RING: o nome a ser usado para o keyring de armazenamento. Por exemplo, storage.
    • LOCATION: o local onde você quer criar o keyring. Ele precisa estar geograficamente próximo ao local em que você quer criar o bucket do Cloud Storage.
  2. Crie uma chave de criptografia no keyring. O nome da chave precisa ser exclusivo no keyring. As chaves não podem ser renomeadas nem excluídas, 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 torna a versão principal.

    gcloud kms keys create KEY_NAME \
      --location LOCATION \
      --keyring KEY_RING \
      --purpose encryption
    

    Substitua:

    • LOCATION: o local em que você criou o keyring.
    • KEY_NAME: o nome a ser usado para a chave de armazenamento. Por exemplo, storage.
    • KEY_RING: o nome usado para o keyring de armazenamento, por exemplo, storage.

    Observação: para usar chaves de criptografia simétrica bruta, defina o campo de finalidade como raw-encryption.

Saiba mais sobre como criar chaves e keyrings.

Criptografar o arquivo que contém o segredo

Execute este procedimento como a conta de usuário principal, trabalhando nos dois projetos.

  1. Na máquina local, salve o secret.

    echo "SECRET_TEXT" > PATH_TO_SECRET
    

    Substitua:

    • SECRET_TEXT: o secret que você quer proteger, em texto simples, por exemplo, this is a secret.
    • PATH_TO_SECRET: o caminho em que você quer criar o secreto. Por exemplo, secret.txt.
  2. Criptografar o segredo usando o Cloud KMS e a chave de criptografia.

    gcloud kms encrypt \
      --location LOCATION \
      --keyring KEY_RING \
      --key KEY_NAME \
      --plaintext-file PATH_TO_SECRET \
      --ciphertext-file PATH_TO_ENCRYPTED_SECRET
    

    Substitua:

    • LOCATION: o local em que você criou o keyring.
    • KEY_RING: o nome do keyring;
    • KEY_NAME: o nome da chave de criptografia.
    • PATH_TO_SECRET: o caminho em que você criou o secreto.
    • PATH_TO_ENCRYPTED_SECRET: o caminho em que você quer salvar o secret criptografado, por exemplo, 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 secreto criptografado no bucket de armazenamento. Use o seguinte comando da CLI gcloud:

    gcloud storage cp PATH_TO_ENCRYPTED_SECRET gs://STORAGE_BUCKET
    

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

  4. Opcional: exclua o arquivo secret de texto simples (PATH_TO_SECRET) da máquina local. Essa é uma boa prática para arquivos que contêm dados sensíveis não criptografados.

O bucket de armazenamento STORAGE_BUCKET agora contém o arquivo secreto criptografado, que é criptografado usando a chave de criptografia KEY_NAME.

Descriptografar o arquivo que contém a chave secreta

Siga estas etapas como a conta de usuário principal, trabalhando nos dois projetos.

  1. Faça o download do arquivo secreto criptografado do bucket de armazenamento. Use o seguinte comando da CLI gcloud:

    gcloud storage cp gs://STORAGE_BUCKET/PATH_TO_ENCRYPTED_SECRET .
    

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

  2. Descriptografar o arquivo usando a mesma chave usada para criptografar.

    gcloud kms decrypt --location LOCATION \
      --keyring KEY_RING \
      --key KEY_NAME \
      --ciphertext-file PATH_TO_ENCRYPTED_SECRET \
      --plaintext-file PATH_TO_DECRYPTED_SECRET
    

    Substitua:

    • LOCATION: o local em que você criou o keyring.
    • KEY_RING: o nome do keyring;
    • KEY_NAME: o nome da chave de criptografia.
    • PATH_TO_ENCRYPTED_SECRET: o caminho para o secret criptografado transferido por download. Por exemplo, secret.txt.encrypted.
    • PATH_TO_DECRYPTED_SECRET: o caminho em que você quer salvar o secret descriptografado, por exemplo, secret_decrypted.txt.

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

    Use raw-decrypt para criptografia simétrica bruta.

    Agora você pode ler o texto simples descriptografado do secret usando cat ou um editor de texto. O conteúdo é idêntico ao conteúdo original de PATH_TO_SECRET.

  3. Opcional: exclua os arquivos PATH_TO_ENCRYPTED_SECRET e PATH_TO_DECRYPTED_SECRET da máquina local.

Limpar

Para limpar, exclua todos os arquivos criados na máquina local e exclua os projetos KEY_PROJECT_ID e STORAGE_PROJECT_ID.

A seguir