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:
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.
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.
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.
Crie o usuário
key-admin
. Para criar usuários, você precisa do papelroles/resourcemanager.organizationAdmin
para o projeto my-kms-project.Conceda a
key-admin
o papelroles/cloudkms.admin
do gerenciamento de identidade e acesso.key-admin
pode criar e gerenciar chaves.Crie o usuário
key-user
.Conceda o papel
roles/cloudkms.cryptoKeyEncrypterDecrypter
do IAM akey-user
.key-user
pode usar chaves para criptografar e descriptografar dados.
Crie um bucket de armazenamento
Execute este procedimento no projeto my-storage-project
.
- Crie um bucket de armazenamento chamado
my-bucket
. - 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.
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
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.
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
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.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.
[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.
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.
Tente ler o arquivo usando um comando como
less
ou um editor de texto. Observe que não é um arquivo de texto simples.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.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.
[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
- 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.