Como usar chaves de criptografia gerenciadas pelo cliente (CMEK)

Veja nesta página como usar as chaves de criptografia gerenciadas pelo cliente (CMEKs, na sigla em inglês) no Google Kubernetes Engine (GKE). Se você precisa controlar o gerenciamento das suas chaves, use o Cloud Key Management Service e as CMEKs para proteger os discos permanentes e os discos de inicialização personalizados no cluster do GKE.

Visão geral

Por padrão, o Google Cloud criptografa conteúdo de cliente em repouso, e o GKE administra a criptografia para você automaticamente.

Se você quiser controlar e gerenciar a rotação de chaves de criptografia, use as CMEKs. Elas criptografam as chaves de criptografia dos seus dados. Para mais informações, consulte Gerenciamento de chaves. Também é possível criptografar chaves secretas no cluster usando chaves que você gerencia. Para mais detalhes, consulte Criptografia de secrets da camada de aplicativos.

No GKE, as CMEKs podem proteger dados de dois tipos de disco de armazenamento: discos anexados e de inicialização de nós.

Discos de inicialização de nós
Os discos de inicialização de nós fazem parte dos pools de nós do cluster. É possível criar um disco de inicialização de nós criptografado por CMEKs ao criar clusters e pools de nós.
Discos anexados
Os discos anexados são PersistentVolumes usados por pods para armazenamento durável. Os discos permanentes anexados e criptografados por CMEKs estão disponíveis no GKE como um PersistentVolume provisionado dinamicamente.

Para saber mais sobre os discos de armazenamento, consulte Opções de armazenamento. Os discos do plano de controle, usados em planos de controle do GKE, não podem ser protegidos com CMEKs.

Antes de começar

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

    • Projeto principal: é onde você cria uma chave de criptografia.

    • Projeto do cluster: é onde você cria um cluster que ativa as CMEKs.

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

    Ativar a API Cloud KMS

  • No projeto principal, 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 são concedidas ao papel predefinido roles/cloudkms.admin do gerenciamento de identidade e acesso. Saiba mais sobre a concessão de permissões para gerenciar chaves na documentação do Cloud KMS.

  • No projeto do cluster, verifique se você ativou a API Cloud KMS.

    Ativar a API Cloud KMS

  • 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

Antes de proteger o disco de inicialização do nó ou o disco anexado com uma CMEK, você precisa do keyring e da chave do Cloud KMS.

O keyring e a chave têm os seguintes requisitos:

  • Sua chave precisa usar criptografia simétrica.

  • Você precisa conceder permissões à conta de serviço do GKE para usar a chave.

  • O keyring precisa ter um local que corresponda ao local do 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 por um keyring da região asia-northeast1.

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

Para instruções sobre como criar um keyring e uma chave, consulte Como criar chaves simétricas.

Conceder permissão para usar a chave

É preciso atribuir o papel de criptografia/descriptografia de CryptoKey do Cloud KMS à conta de serviço do Compute Engine usada pelos nós do seu cluster. Essa ação é necessária para que os discos permanentes do GKE acessem e usem a chave de criptografia.

O nome da conta de serviço do Compute Engine tem o seguinte formato:

service-project-number@compute-system.iam.gserviceaccount.com

Substitua project-number pelo número do projeto do cluster.

Para conceder acesso à conta de serviço, use o comando gcloud ou o Console do Google Cloud.

gcloud

Conceda à conta de serviço do Compute Engine o papel de criptografia/descriptografia de CryptoKey do Cloud KMS:

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

Substitua:

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

Console

Conceda à conta de serviço do Compute Engine o papel de criptografia/descriptografia de CryptoKey do Cloud KMS:

  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 Compute Engine a que você está concedendo acesso.

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

  6. Clique em Salvar.

Criar um disco de inicialização protegido por CMEKs

Nesta seção, você cria um novo cluster ou pool de nós com um disco de inicialização protegido por CMEKs.

Não é possível ativar a criptografia gerenciada pelo cliente para discos de inicialização de nós em um cluster existente, já que não é permitido alterar o tipo de disco de inicialização de um pool de nós ou um cluster existente. No entanto, você consegue criar um novo pool de nós para o cluster com a criptografia gerenciada pelo cliente ativada e excluir o pool de nós antigo.

Também não é possível desativar a criptografia gerenciada pelo cliente para discos de inicialização de nós em um cluster ou pool de nós existente. No entanto, você consegue criar um novo pool de nós para o cluster com a criptografia gerenciada pelo cliente desativada e excluir o pool de nós antigo.

Criar um cluster com um disco de inicialização de nós protegido por CMEKs

É possível criar um cluster com um disco de inicialização de nós protegido por CMEKs usando o comando gcloud ou o Console do Google Cloud.

Somente um disco permanente padrão (pd-standard) ou um disco permanente SSD (pd-ssd) pode ser criptografado com uma chave CMEK.

gcloud

Para criar um cluster com disco de inicialização criptografado por uma chave CMEK, especifique um valor para --boot-disk-kms-key parameter no seu comando de criação.

    gcloud container clusters create cluster \
  --cluster-version=latest \
  --zone zone \
  --boot-disk-kms-key projects/key-project-id/locations/location/keyRings/key-ring/cryptoKeys/key \
  --project cluster-project-id\
  --disk-type disk-type

Substitua:

  • cluster é 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;
  • key-ring é o nome do keyring;
  • key é o nome da chave;
  • cluster-project-id é o ID do projeto de cluster.
  • disk-type é pd-standard (padrão) ou pd-ssd.

Console

  1. Acesse o menu do Cloud Key Management Service no Console do Cloud.

    Acessar o menu do Cloud Key Management Service

  2. Clique no botão Criar cluster.

  3. Configure o cluster como quiser.

  4. No painel de navegação, em Pools de nós, clique em Nós.

  5. Na lista suspensa Tipo de disco de inicialização, selecione Disco permanente padrão ou Disco permanente SSD.

  6. Marque a caixa de seleção Ativar a criptografia gerenciada pelo cliente para o disco de inicialização e escolha a chave de criptografia do Cloud KMS que você criou acima.

  7. Clique em Criar

Atualizar um cluster com discos de inicialização de nó protegidos por CMEK

Para criar um novo pool de nós com CMEKs ativadas em um cluster existente, use o comando gcloud ou o Console do Google Cloud.

gcloud

Para criar um pool de nós com criptografia gerenciada pelo cliente para discos de inicialização de nós, especifique um valor para --boot-disk-kms-key parameter no seu comando de criação.

gcloud container node-pools create node-pool-name \
  --zone zone \
  --disk-type disk-type \
  --boot-disk-kms-key projects/key-project-id/locations/location/keyRings/ring-name/cryptoKeys/<var>key-name \
  --project cluster-project-id \
  --cluster cluster-name

Substitua:

  • node-pool-name é um nome escolhido para o pool de nós;
  • zone é a zona em que você quer criar o cluster;
  • disk-type é pd-standard (padrão) ou pd-ssd.
  • 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.
  • cluster-name é o nome do cluster que você criou na etapa anterior.

Console

  1. Acesse o menu do GKE no Console do Cloud.

    Acessar o menu do GKE

  2. Selecione o cluster em que você quer adicionar um pool de nós.

  3. Clique em Adicionar pool de nós.

  4. Verifique se o tipo de disco de inicialização é disco permanente padrão ou disco permanente SSD.

  5. Selecione Ativar a criptografia gerenciada pelo cliente para o disco de inicialização e escolha a chave de criptografia do Cloud KMS que você criou.

  6. Clique em Salvar.

Criar um disco anexado protegido por CMEKs

Siga estas instruções para criptografar discos permanentes recém-criados. É possível ativar CMEK em um cluster novo ou atual, usando uma chave nova ou atual do Cloud KMS.

Essas instruções precisam ser concluídas uma vez por cluster do GKE:

Criar uma StorageClass que faça referência à chave do Cloud KMS

  1. Copie o conteúdo abaixo para um arquivo YAML chamado gcepd-sc.yaml. Essa configuração permite o provisionamento dinâmico de volumes criptografados.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-gce-pd-cmek
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: "WaitForFirstConsumer"
    allowVolumeExpansion: true
    parameters:
      type: pd-standard
      disk-encryption-kms-key: projects/key-project-id/locations/location/keyRings/key-ring/cryptoKeys/key
    
    • O campo disk-encryption-kms-key precisa ser o identificador de recurso totalmente qualificado da chave que será usada para criptografar discos novos.
    • Os valores em disk-encryption-kms-key diferenciam maiúsculas de minúsculas (por exemplo: keyRings e cryptoKeys). O provisionamento de um novo volume com valores incorretos resulta em um erro invalidResourceUsage.
    • Defina o StorageClass como padrão (em inglês).

    Não é possível adicionar o parâmetro disk-encryption-kms-key a um StorageClass existente. No entanto, você pode excluir o StorageClass e recriá-lo com o mesmo nome, mas com um conjunto diferente de parâmetros. Se você fizer isso, certifique-se que o provisionador da classe existente é pd.csi.storage.gke.io.

  2. Implante o StorageClass no cluster do GKE usando kubectl:

    kubectl apply -f gcepd-sc.yaml
    
  3. Verifique se o StorageClass usou o driver CSI do disco permanente do Compute Engine e se inclui o ID da chave:

    kubectl describe storageclass csi-gce-pd-cmek
    

    Na resposta ao comando, verifique:

    • O provisionador está definido como pd.csi.storage.gke.io.
    • O ID da chave segue a disk-encryption-kms-key.
    Name:                  csi-gce-pd-cmek
    IsDefaultClass:        No
    Annotations:           None
    Provisioner:           pd.csi.storage.gke.io
    Parameters:            disk-encryption-kms-key=projects/key-project-id/locations/location/keyRings/ring-name/cryptoKeys/key-name,type=pd-standard
    AllowVolumeExpansion:  unset
    MountOptions:          none
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                none
    

Criar um disco permanente criptografado no GKE

Nesta seção, você provisiona dinamicamente volumes de armazenamento do Kubernetes criptografados com o novo StorageClass e a chave do Cloud KMS.

  1. Copie o conteúdo a seguir para um novo arquivo chamado pvc.yaml e verifique se o valor de storageClassName corresponde ao nome do objeto StorageClass:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: csi-gce-pd-cmek
      resources:
        requests:
          storage: 6Gi
    
  2. Aplique o PersistentVolumeClaim (PVC) no cluster do GKE:

    kubectl apply -f pvc.yaml
    
  3. Receba o status de PersistentVolumeClaim do cluster e verifique se o PVC foi criado e vinculado a um PersistentVolume provisionado recentemente.

    kubectl get pvc
    
    NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
    podpvc    Bound     pvc-e36abf50-84f3-11e8-8538-42010a800002   10Gi       RWO            csi-gce-pd-cmek  9s
    

Agora é possível usar o disco permanente protegido por CMEK com o cluster do GKE.

Como remover a proteção CMEK de um disco permanente

Para remover a proteção CMEK de um disco permanente, siga as instruções na documentação do Compute Engine.

A seguir