Como criptografar secrets na camada do aplicativo

Nesta página, você aprenderá a criptografar os Secrets do Kubernetes na camada do aplicativo usando uma chave que é gerenciada no Cloud Key Management Service (Cloud KMS). Como esse recurso depende da funcionalidade do Cloud KMS, é recomendado que você primeiro conheça a rotação de chaves e a criptografia de envelope.

Visão geral

Por padrão, o GKE criptografa o conteúdo do cliente armazenado em repouso, incluindo os Secrets. O GKE executa e gerencia essa criptografia sem que você precise executar outra ação.

A criptografia de Secrets da camada de aplicativos fornece uma camada extra de segurança para dados confidenciais, como Secrets armazenados no etcd. Essa funcionalidade permite usar uma chave gerenciada com o Cloud KMS para criptografar dados na camada do aplicativo. Isso protege contra invasores que consigam acesso a uma cópia off-line do etcd.

Para usar a criptografia de secrets da camada de aplicativos, é preciso primeiro criar uma chave do Cloud KMS e conceder a ela acesso à conta do serviço GKE. A chave precisa estar no mesmo local que o cluster para diminuir a latência e evitar casos em que os recursos dependem de serviços espalhados por vários domínios de falha. Em seguida, é possível ativar o recurso em um cluster novo ou atual especificando a chave que você quer usar.

Criptografia de envelope

O Kubernetes oferece criptografia de envelope de secrets com um provedor KMS. Ou seja, uma chave local chamada de chave de criptografia de dados (DEK, na sigla em inglês), é usada para criptografar os secrets. A DEK é criptografada com outra chave chamada chave de criptografia de chaves. Esta chave não é armazenada pelo Kubernetes.

A criptografia de envelope proporciona dois principais benefícios:

  • A rotação da chave de criptografia de chaves pode ser feita sem necessidade de criptografar novamente todos os secrets. Isso torna mais fácil seguir a prática recomendada de rotação de chaves regular, sem um impacto significativo no desempenho.

  • Os secrets armazenados no Kubernetes podem contar com uma raiz de confiança externa. Isso quer dizer que é possível usar uma raiz de confiança central, como um módulo de segurança de hardware para todos secrets, e que um invasor que acessar seus contêineres no modo off-line não terá acesso a seus secrets.

Com a criptografia de secrets da camada de aplicativo no GKE, seus secrets são criptografados localmente, usando o provedor AES-CBC com DEKs locais, e as DEKs são criptografadas com uma chave de criptografia de chaves que você gerencia no Cloud KMS.

Para saber mais sobre criptografia de envelope, consulte este link.

O que acontece quando você cria um secret?

Eis o que acontece quando um novo secret é criado:

  • O servidor da API do Kubernetes gera uma DEK exclusiva para o secret usando um gerador de números aleatórios.

  • O servidor da API Kubernetes utiliza a DEK localmente para criptografar secret.

  • O plug-in KMS envia a DEK para o Cloud KMS para criptografia. O plug-in KMS usa a conta de serviço GKE do seu projeto para se autenticar no Cloud KMS.

  • O Cloud KMS criptografa a DEK e a envia de volta ao plug-in KMS.

  • O servidor da API do Kubernetes salva o secret criptografado e a DEK criptografada. O texto simples DEK não é salvo no disco.

Quando um cliente pede um secret do servidor da API Kubernetes, o processo descrito acima é revertido.

O que acontece quando você destrói uma chave?

Quando você destrói uma chave no Cloud KMS usada para criptografar um secret no GKE, ele fica indisponível. A menos que se use uma Projeção de volume de token da conta de serviço, as contas de serviço usadas pelo GKE também usam secrets. Além disso, se uma chave for destruída, ela ficará indisponível. Caso não seja possível acessar, o cluster não será iniciado.

Antes de destruir uma chave, é recomendado verificar se ela está sendo usada pelo cluster. Também é possível criar uma política de alertas para a destruição da chave no Cloud KMS.

Antes de começar

  • Para fazer os exercícios neste tópico, você precisa de dois projetos do Google Cloud.

    • Projeto de chave: em que você cria uma chave de criptografia de chaves.

    • Projeto de cluster: em que você cria um cluster que habilita a criptografia de secrets da camada de aplicativos.

  • Verifique se você ativou a API Cloud KMS no seu projeto de chave.

    Ativar a API Cloud KMS

  • No seu projeto de chave, o usuário que cria o keyring e a chave precisa das seguintes permissões do IAM:

    • cloudkms.keyRings.getIamPolicy
    • cloudkms.keyRings.setIamPolicy

    Essas permissões (e muitas outras) são concedidas ao papel de gerenciamento de identidade e acesso predefinido roles/cloudkms.admin. Saiba mais sobre a concessão de permissões para gerenciar chaves na documentação do Cloud KMS.

  • Verifique se você ativou a API Google Kubernetes Engine no seu projeto de cluster.

    Ativar a API Google Kubernetes Engine

  • Verifique se o SDK do Cloud está instalado.

  • Atualize gcloud para a versão mais recente:

    gcloud components update

Criar uma chave do Cloud KMS

Quando criar um keyring, especifique um local que corresponda ao local do seu cluster do GKE:

  • Um cluster zonal precisa usar um keyring de um local de superconjunto. Por exemplo, um cluster na zona us-central1-a só pode usar uma chave na região us-central1.

  • Um cluster regional precisa usar um keyring do mesmo local. Por exemplo, um cluster na região asia-northeast1 precisa ser protegido com um keyring da região asia-northeast1.

  • A região global do Cloud KMS não é compatível com o GKE.

Você pode usar o Console do Google Cloud ou o comando gcloud.

Console

No projeto de chave, crie um keyring:

  1. Acesse a página Chaves criptográficas no Console do Cloud.

    Acessar a página "Chaves criptográficas"

  2. Clique em Criar keyring.

  3. No campo Nome do keyring, digite o nome do seu keyring.

  4. No menu suspenso Local, selecione o local do seu cluster do Kubernetes. A página Criar keyring terá esta aparência:

    Tela de criação de keyring na IU da Web do Google Cloud

  5. Clique em Criar.

Em seguida, crie uma chave:

  1. Acesse a página Chaves criptográficas no Console do Cloud.

    Acessar a página "Chaves criptográficas"

  2. Clique no nome do keyring em que a chave será criada.

  3. Clique em Criar chave.

  4. No campo Nome da chave, insira o nome da sua chave.

  5. Aceite os valores padrão de Período de rotação e A partir de. Se quiser usar valores diferentes, defina um período de rotação de chaves e o horário de início.

  6. [Opcional] No campo Rótulos, clique em Adicionar rótulo se quiser adicionar rótulos à chave.

    A página Criar chave terá esta aparência:

    Tela de criação de chave na IU da Web do Google Cloud

  7. Clique em Criar.

gcloud

No projeto de chave, crie um keyring:

gcloud kms keyrings create ring-name \
    --location location \
    --project key-project-id

em que:

  • ring-name é o nome escolhido para o keyring;
  • location é a região em que você quer criar o keyring;
  • key-project-id é o ID do projeto de chave.

Crie uma chave:

gcloud kms keys create key-name \
    --location location \
    --keyring ring-name \
    --purpose encryption \
    --project key-project-id

em que:

  • key-name é o nome escolhido para a chave;
  • location é a região em que o keyring foi criado;
  • ring-name é o nome do keyring;
  • key-project-id é o ID do projeto de chave.

Conceder permissão para usar a chave

A conta de serviço do GKE no seu projeto de cluster tem o nome a seguir:

service-cluster-project-number@container-engine-robot.iam.gserviceaccount.com

em que cluster-project-number é o número de projeto do cluster.

Para conceder acesso à conta de serviço, você pode usar o Console do Google Cloud ou o comando gcloud.

Console

Conceda à sua conta de serviço GKE o papel criptografador/descriptografador do Cloud KMS CryptoKey:

  1. Abra o navegador de chaves do Cloud Key Management Service no Console do Google Cloud.
    Abrir o navegador de Chaves do Cloud KMS
  2. Clique no nome do keyring que contém a chave que você quer.

  3. Marque a caixa de seleção da chave.

    A guia Permissões no painel da janela à direita fica disponível.

  4. Na caixa de diálogo Adicionar membros, especifique o endereço de e-mail da conta de serviço do GKE à qual você está concedendo acesso.

  5. Na lista suspensa Selecionar um papel, escolha Criptografador/Descriptografador do Cloud KMS CryptoKey.

  6. Clique em Salvar.

gcloud

Conceda à sua conta de serviço GKE o papel criptografador/descriptografador do Cloud KMS CryptoKey:

gcloud kms keys add-iam-policy-binding key-name \
  --location location \
  --keyring ring-name \
  --member serviceAccount:service-account-name \
  --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
  --project key-project-id

em que:

  • key-name é o nome da chave;
  • location é a região em que o keyring foi criado;
  • ring-name é o nome do keyring;
  • service-account-name é o nome da conta de serviço do GKE.
  • key-project-id é o ID do projeto de chave.

Como ativar a criptografia de secret da camada de aplicativo

Em um novo cluster

É possível criar um novo cluster usando o Console do Google Cloud ou a ferramenta gcloud.

console

  1. Acesse o menu do Google Kubernetes Engine no Console do Cloud.

    Acessar o menu do Google Kubernetes Engine

  2. Clique no botão Criar cluster.

  3. Configure seus pools de nós e de cluster como quiser.

  4. No painel de navegação, em Cluster, clique em Segurança.

  5. Selecione Ativar criptografia dos Secrets da camada do aplicativo e escolha a chave de criptografia do banco de dados criada em Como criar uma chave do Cloud KMS.

  6. Continue configurando o cluster.

  7. Clique em Criar.

gcloud

Para criar um cluster compatível com a criptografia de secret de camada do aplicativo, especifique um valor para o parâmetro --database-encryption-key no comando de criação.

gcloud container clusters create cluster-name \
  --cluster-version=latest \
  --zone zone \
  --database-encryption-key projects/key-project-id/locations/location/keyRings/ring-name/cryptoKeys/key-name \
  --project cluster-project-id

em que:

  • cluster-name é o nome escolhido para o cluster;
  • zone é a zona em que você quer criar o cluster;
  • key-project-id é o ID do projeto de chave;
  • location é a localização do keyring;
  • ring-name é o nome do keyring;
  • key-name é o nome da chave;
  • cluster-project-id é o ID do projeto de cluster.

Em um cluster atual

É possível atualizar um cluster atual para usar criptografia de secret da camada de aplicativo, desde que uma das afirmações a seguir seja verdadeira:

  • A versão do cluster é maior ou igual a v1.11.9 e menor que v1.12.0.
  • A versão do cluster é maior ou igual a v1.12.7.

Você pode usar o Console do Google Cloud ou o comando gcloud.

Console

Para atualizar um cluster para que seja compatível com a criptografia de secret da camada de aplicativo:

  1. Acesse o menu do Google Kubernetes Engine no Console do Cloud.

    Acessar o menu do Google Kubernetes Engine

  2. Clique no ícone Editar do cluster que você quer modificar. Ele parece um lápis.

  3. Ative Criptografia de secret da camada do aplicativo e escolha a chave de criptografia do banco de dados criada em Como criar uma chave do Cloud KMS.

  4. Clique em Salvar.

gcloud

Para ativar as criptografias do secret da camada de aplicativo em um cluster atual, execute o comando a seguir:

gcloud container clusters update cluster-name \
  --zone zone \
  --database-encryption-key projects/key-project-id/locations/location/keyRings/ring-name/cryptoKeys/key-name \
  --project cluster-project-id

em que:

  • cluster-name é o nome escolhido para o cluster;
  • zone é a zona em que você quer criar o cluster;
  • key-project-id é o ID do projeto de chave;
  • location é a localização do keyring;
  • ring-name é o nome do keyring;
  • key-name é o nome da chave;
  • cluster-project-id é o ID do projeto de cluster.

Como atualizar uma chave do Cloud KMS

console

Para atualizar um cluster para usar uma nova chave do Cloud KMS:

  1. Acesse o menu do Google Kubernetes Engine no Console do Cloud.

    Acessar o menu do Google Kubernetes Engine

  2. Clique no ícone Editar do cluster que você quer modificar. Ele parece um lápis.

  3. Em Criptografia de secrets da camada de aplicativos, selecione a nova chave de criptografia que você quer usar.

  4. Clique em Salvar.

gcloud

Atualize o cluster atual para usar uma nova chave do Cloud KMS:

gcloud container clusters update cluster-name \
  --zone zone \
  --database-encryption-key projects/key-project-id/locations/location/keyRings/ring-name/cryptoKeys/key-name \
  --project cluster-project-id

em que:

  • cluster-name é o nome escolhido para o cluster;
  • zone é a zona em que você quer criar o cluster;
  • key-project-id é o ID do projeto de chave;
  • location é a localização do keyring;
  • ring-name é o nome do keyring;
  • key-name é o nome da chave;
  • cluster-project-id é o ID do projeto de cluster.

Como desativar a criptografia de Secrets da camada de aplicativos

Você pode usar o Console do Google Cloud ou o comando gcloud.

Console

  1. Acesse o menu do Google Kubernetes Engine no Console do Cloud.

    Acessar o menu do Google Kubernetes Engine

  2. Clique no ícone Editar do cluster que você quer modificar. Ele parece um lápis.

  3. Desative a criptografia de secrets da camada do aplicativo.

  4. Clique em Salvar.

gcloud

Para desativar a criptografia de secrets da camada do aplicativo, execute o comando:

gcloud container clusters update cluster-name \
  --zone zone \
  --disable-database-encryption \
  --project cluster-project-id

em que:

  • cluster-name é o nome escolhido para o cluster;
  • zone é a zona em que você quer criar o cluster;
  • cluster-project-id é o ID do projeto de cluster.

Como verificar se a criptografia de secret da camada de aplicativo está ativada

Você pode verificar se um cluster está usando a criptografia de Secrets da camada de aplicativos usando o Console do Google Cloud ou o comando gcloud.

Console

  1. Acesse o menu do Google Kubernetes Engine no Console do Cloud.

    Acessar o menu do Google Kubernetes Engine

  2. Clique no nome do cluster que você quer modificar. A página Detalhes do cluster é aberta.

  3. Verifique se a Criptografia de secret da camada de aplicativo está ativada e se a chave correta está listada.

gcloud

Verifique se um cluster está usando a criptografia de secrets da camada de aplicativos:

gcloud container clusters describe cluster-name \
  --zone compute-zone \
  --format 'value(databaseEncryption)' \
  --project cluster-project-id

em que:

  • cluster-name é o nome de um cluster atual;
  • compute-zone é o nome da zona do cluster;
  • cluster-project-id é o ID do projeto de cluster.

Se o cluster estiver usando a criptografia de secret da camada de aplicativo, a resposta conterá EncryptionConfig:

keyName=projects/project/locations/location/keyRings/ring-name/cryptoKeys/key-name;state=ENCRYPTED

Limitações

Local da chave

É preciso selecionar uma chave na mesma região do cluster em que a chave está sendo usada. Por exemplo, um cluster zonal em us-central1-a só pode usar uma chave na região us-central1. Para clusters regionais, as chaves precisam estar no mesmo local para diminuir a latência e evitar casos em que os recursos dependem de serviços espalhados por vários domínios de falha.

Troca de chaves

Quando você realiza uma rotação de chaves, os secrets existentes permanecem criptografadas com a KEK anterior. Para garantir que uma KEK mais recente una um Secret, crie um novo Secret após a rotação de chaves.

Por exemplo, você cria e armazena um secret, Secret1. Ele é criptografado com DEK1, que por si só é unido com KEKv1. Antes de KEKv1 alternar, crie outro secret, Secret2. Secret2 consegue a própria chave, DEK2. KEKv1 é usado novamente para criptografar a DEK.

Após a rotação da KEK, criamos outro segredo, Secret3, que é criptografado com DEK3. DEK3 é, por sua vez, criptografada com KEKv2, a KEK rotacionada.

Para instruções sobre como girar manualmente as KEKs que criptografam seus secrets, consulte Criptografar novamente seus secrets.

Como criptografar novamente seus secrets

Neste ponto, não há como forçar a nova criptografia automática dos secrets. Se quiser, gire manualmente sua KEK criando uma nova versão de chave:

gcloud kms keys versions create --location location \
   --keyring ring-name \
   --key key-name \
   --primary \
   --project key-project-id

Em seguida, force o GKE a criptografar novamente clicando em cada secret:

kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="time"

Substitua time por uma string que indica quando a rotação acontece (por exemplo, 20200909-090909).

EncryptionConfig

No momento, somente chaves do Cloud KMS são compatíveis com o GKE. Não é possível usar outro provedor KMS Kubernetes ou outro provedor de criptografia.

A seguir