Criptografia de secrets na camada de aplicativos

Nesta página, você aprende a criptografar os secrets do Kubernetes na camada do aplicativo usando uma chave que é gerenciada no Cloud Key Management Service (Cloud KMS).

A criptografia de secrets da camada de aplicativos está disponível a partir da versão 1.11.2 do GKE.

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 na camada de aplicativos fornece uma camada complementar de segurança para dados confidenciais, como secrets armazenados no etcd. Essa funcionalidade permite o uso de uma chave gerenciada no Cloud KMS para criptografar dados na camada do aplicativo. Isso protege contra invasores que obtenham 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. Em seguida, é possível ativar o recurso ao criar um novo cluster, especificando a chave que você quer de 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. O DEK é criptografado 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, por exemplo, 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 os DEKs são criptografados 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 do 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 solicita um secret do servidor da API do 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 não estará mais disponível, e o cluster não será iniciado. Esse processo NÃO é reversível, qualquer dado criptografado com esta versão não será recuperável.

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 do Cloud KMS no seu projeto de chave.

    Ativar a API do Cloud KMS

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

    Ativar a API Google Kubernetes Engine

  • Verifique se o Cloud SDK está instalado.

  • Atualize a 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 deve ser protegido com um keyring da região asia-northeast1.

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

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 código do seu 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] é um nome que você escolhe para sua chave.
  • [LOCATION] é a região em que o keyring foi criado.
  • [RING_NAME] é o nome do seu keyring.
  • [KEY_PROJECT_ID] é o código do seu projeto de chave.

Conceder permissão para usar a chave

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

service-[CLUSTER_PROJECT_NUMBER]@container-engine-robot.iam.gserviceaccount.com

em que [CLUSTER_PROJECT_NUMBER] é o número de projeto do cluster.

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 sua chave.
  • [LOCATION] é a região em que o keyring foi criado.
  • [RING_NAME] é o nome do seu keyring.
  • [SERVICE_ACCOUNT_NAME] é o nome da sua conta de serviço do GKE.
  • [KEY_PROJECT_ID] é o código do seu projeto de chave.

Criar um cluster com criptografia de secrets da camada de aplicativos

Para criar um cluster que ofereça suporte à criptografia de secrets da camada de aplicativos, especifique um valor para o parâmetro --database-encryption-key no comando de criação. Use a versão 1.11.2 do cluster 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 que você escolhe para o cluster.
  • [ZONE] é a zona em que você quer criar o cluster.
  • [KEY_PROJECT_ID] é o código do seu projeto de chave.
  • [LOCATION] é a localização do seu keyring.
  • [RING_NAME] é o nome do seu keyring.
  • [KEY_NAME] é o nome da sua chave.
  • [CLUSTER_PROJECT_ID] é o código do seu projeto de cluster.

Como determinar se seu cluster está usando a criptografia de secrets da camada de aplicativos

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 existente.
  • [COMPUTE_ZONE] é o nome da zona do cluster.
  • [CLUSTER_PROJECT_ID] é o código do seu projeto de cluster.

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

keyName=projects/[PROJECT]/locations/[LOCATION]/keyRings/[RING_NAME]/cryptoKeys/[KEY_NAME];state=ENCRYPTED

Limitações

Clusters atuais

No momento não é possível habilitar a criptografia de secrets da camada de aplicativos para um cluster existente.

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. No caso de clusters regionais, as chaves devem estar na mesma região.

Rotação de chaves

Quando você faz a rotação de uma chave no Cloud KMS, os dados no GKE não são criptografados novamente. Os dados atuais que foram criptografados anteriormente não serão novamente criptografados, mas todos os novos dados serão criptografados com a nova chave.

Neste ponto, não há como forçar a nova criptografia automática dos secrets. Se você quiser, é possível fazer a rotação da chave de criptografia manualmente, 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]

No GKE, force a nova criptografia tocando em cada secret:

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

EncryptionConfig

No momento, apenas o provedor KMS com uma chave do Cloud KMS está disponível no GKE. Não é possível usar outro provedor KMS do 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