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:
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.
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.
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.
Crie a conta de administrador principal.
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.Crie a conta de usuário principal.
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
.
- Crie um bucket de armazenamento chamado
STORAGE_BUCKET
. - 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.
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.
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.
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
.
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.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.
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.
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.
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 dePATH_TO_SECRET
.Opcional: exclua os arquivos
PATH_TO_ENCRYPTED_SECRET
ePATH_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
- Leia mais sobre gerenciamento de chaves secretas.
- Saiba mais sobre a separação de deveres.
- Saiba como conceder, alterar e revogar acesso a recursos.
- Saiba mais sobre como criar uma conta de serviço.