Criptografia de secrets da camada de aplicativos

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).

É possível criar novos clusters que usam a criptografia de secrets da camada de aplicativo no GKE v1.11.2 ou superior. A atualização de clusters atuais para usar a criptografia de secrets da camada de aplicativo é compatível com as versões do GKE a seguir:

  • GKE 1.11: v1.11.9 e posterior
  • GKE 1.12: v1.12.7 e posterior
  • GKE 1.13 e posterior

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. Usando essa funcionalidade, é possível 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 com 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 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 Kubernetes salva o secret criptografado e a DEK criptografada. O texto simples DEK não é salvo no disco.

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

Rotação de chaves

As KEKs que criptografam os secrets não são rotacionadas e permanecem com ele. Para garantir que uma KEK diferente una uma chave secreta, rotacione a KEK e, em seguida, crie um novo secret.

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.

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 deixará de ficar disponí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 deste tópico, você precisa de dois projetos do Google Cloud Platform.

    • 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 permissões do Cloud IAM a seguir:

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

    Essas permissões (e muitas outras) são concedidas ao roles/cloudkms.admin papel predefinido do Cloud Identity and Access Management. 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

Como criar uma chave do Cloud KMS

Ao 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.

Use o Console do Google Cloud Platform ou o comando gcloud.

Console

No projeto de chave, crie um keyring:

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

    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 Platform

  5. Clique em Criar.

Em seguida, crie uma chave:

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

    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 Platform

  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, use o Console do Google Cloud Platform ou o comando gcloud.

Console

Conceda à sua conta de serviço do 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 Platform.
    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 do 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

Crie um novo cluster usando o Console do Google Cloud Platform ou o comando gcloud.

Console

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

    Acessar o menu do Google Kubernetes Engine

  2. Clique em Criar cluster.

  3. Configure seus pools de nós e de cluster conforme você quiser. Antes de salvar, selecione Disponibilidade, rede, segurança e recursos extras.

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

  5. Continue configurando o cluster e salve as alterações.

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. Use o cluster versão v1.11.2 ou posterior:

gcloud beta 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.

Use o Console do Google Cloud Platform 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 GCP.

    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 beta 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 secret da camada de aplicativos

É possível atualizar um cluster atual para interromper o uso da 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.

Use o Console do Google Cloud Platform ou o comando gcloud.

Console

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

    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 secret da camada do aplicativo.

  4. Clique em Salvar.

gcloud

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

gcloud beta 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

É possível verificar se um cluster está usando a criptografia de secrets da camada de aplicativo usando o Console do Google Cloud Platform ou o comando gcloud.

Console

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

    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 beta 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 com falha.

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 replace -f -

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

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Kubernetes Engine