Use chaves de encriptação geridas pelo cliente (CMEK)

Esta página descreve como usar chaves de encriptação geridas pelo cliente (CMEK) no Google Kubernetes Engine (GKE). Se precisar de controlar a gestão das suas chaves, pode usar o Cloud Key Management Service e as CMEK para proteger os discos persistentes anexados e os discos de arranque personalizados no seu cluster do GKE.

Vista geral

Por predefinição, Google Cloud encripta o conteúdo do cliente em repouso, e o GKE gere a encriptação por si sem que tenha de fazer nada.

Se quiser controlar e gerir a rotação das chaves de encriptação de forma autónoma, pode usar a CMEK. Estas chaves encriptam as chaves de encriptação de dados que encriptam os seus dados. Para mais informações, consulte Gestão de chaves.

Também pode encriptar segredos no cluster através de chaves que gere. Para ver detalhes, consulte o artigo Encriptação de segredos da camada de aplicação.

No GKE, a CMEK pode proteger dados de dois tipos de discos de armazenamento: discos de arranque de nós e discos anexados.

Discos de arranque de nós
Os discos de arranque dos nós fazem parte dos conjuntos de nós do cluster. Pode criar um disco de arranque do nó encriptado com CMEK quando cria clusters e node pools.
Discos anexados
Os discos anexados são PersistentVolumes usados por pods para armazenamento duradouro. Os discos persistentes anexados encriptados com CMEK estão disponíveis no GKE como um PersistentVolume aprovisionado dinamicamente.

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

Antes de começar

  1. Para fazer os exercícios neste tópico, precisa de dois Google Cloud projetos:

    • Projeto da chave: é aqui que cria uma chave de encriptação.

    • Projeto de cluster: é aqui que cria um cluster que ativa o CMEK.

  2. No projeto da chave, certifique-se de que ativou a API Cloud KMS.

    Ative a API Cloud KMS

  3. No seu projeto de chaves, o utilizador que cria o conjunto de chaves e a chave precisa das seguintes autorizações de IAM:

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

    Estas autorizações são concedidas à roles/cloudkms.admin função de gestão de identidade e de acesso predefinida. Pode saber mais acerca de conceder autorizações para gerir chaves na documentação do Cloud KMS.

  4. No projeto do cluster, certifique-se de que ativou a API Cloud KMS.

    Ative a API Cloud KMS

  5. Certifique-se de que instalou a CLI gcloud.

  6. Atualize o gcloud para a versão mais recente:

    gcloud components update
    

Crie uma chave do Cloud KMS

Antes de poder proteger o disco de arranque do nó ou o disco anexado com uma CMEK, precisa de um conjunto de chaves e uma chave do Cloud KMS.

O conjunto de chaves e a chave têm os seguintes requisitos:

  • A sua chave deve usar a encriptação simétrica.

  • Tem de conceder autorizações à conta de serviço do GKE para usar a chave.

  • O seu anel de chaves tem de ter uma localização que corresponda à localização do seu cluster do GKE:

    • Um cluster zonal deve usar um porta-chaves de uma localização de superconjunto. Por exemplo, um cluster na zona us-central1-a só pode usar uma chave na região us-central1.

    • Um cluster regional deve usar um conjunto de chaves da mesma localização. Por exemplo, um cluster na região asia-northeast1 deve ser protegido com um conjunto de chaves da região asia-northeast1.

    • A região do Cloud KMS global não é suportada para utilização com o GKE.

Para ver instruções sobre como criar um conjunto de chaves e uma chave, consulte o artigo Criar chaves simétricas.

Conceda autorização para usar a chave

Tem de conceder a função da IAM Encriptador/desencriptador de CryptoKey do Cloud KMS (roles/cloudkms.cryptoKeyEncrypterDecrypter) na chave do Cloud KMS ao agente de serviço do Compute Engine no projeto do cluster. A concessão desta função permite que os discos persistentes do GKE acedam e usem a sua chave de encriptação.

Para conceder a função roles/cloudkms.cryptoKeyEncrypterDecrypter ao agente de serviço do Compute Engine, selecione uma das seguintes opções:

gcloud

Execute o seguinte comando:

gcloud kms keys add-iam-policy-binding KEY_NAME \
    --location LOCATION \
    --keyring RING_NAME \
    --member serviceAccount:service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --project KEY_PROJECT_ID

Substitua o seguinte:

  • KEY_NAME: o nome da sua chave.
  • LOCATION: a região onde criou o conjunto de chaves.
  • RING_NAME: o nome do seu conjunto de chaves.
  • PROJECT_NUMBER: o número do projeto do cluster.
  • KEY_PROJECT_ID: o ID do projeto principal.

Consola

  1. Na Google Cloud consola, aceda à página Gestão de chaves.

    Aceda à gestão de chaves

  2. Clique no nome do conjunto de chaves que contém a chave.

  3. Clique no nome da chave que quer modificar.

  4. Clique no separador Autorizações.

  5. Clique em Conceder acesso. O painel Conceder acesso à chave é aberto.

  6. No campo Novos membros, introduza o nome do agente de serviço do Compute Engine:

    service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com
    

    Substitua PROJECT_NUMBER pelo número do projeto do cluster.

  7. No menu Selecionar uma função, selecione Encriptador/desencriptador de CryptoKey do Cloud KMS.

  8. Clique em Guardar.

Use discos de arranque de nós protegidos por CMEK

Nesta secção, cria um novo cluster ou um conjunto de nós com um disco de arranque protegido pela CMEK.

Não pode ativar a encriptação gerida pelo cliente para discos de arranque de nós num cluster existente, uma vez que não pode alterar o tipo de disco de arranque de um cluster ou de um conjunto de nós existente. No entanto, pode criar um novo conjunto de nós para o cluster com a encriptação gerida pelo cliente ativada e eliminar o conjunto de nós anterior.

Também não pode desativar a encriptação gerida pelo cliente para discos de arranque de nós num cluster existente ou num conjunto de nós existente. No entanto, pode criar um novo conjunto de nós para o cluster com a encriptação gerida pelo cliente desativada e eliminar o conjunto de nós anterior.

Crie um cluster com um disco de arranque do nó protegido por CMEK

Pode criar um cluster com um disco de arranque do nó protegido por CMEK através da CLI gcloud ou da Google Cloud consola.

Para clusters padrão, apenas um disco persistente padrão (pd-standard) ou um disco persistente SSD (pd-ssd) pode ser encriptado com uma chave CMEK.

gcloud

Para criar um cluster cujo disco de arranque esteja encriptado com uma chave CMEK, especifique um valor para o parâmetro --boot-disk-kms-key no comando de criação do cluster.

Crie um cluster padrão

Para criar um cluster padrão cujo disco de arranque esteja encriptado com uma chave CMEK, use o seguinte comando:

gcloud container clusters create CLUSTER_NAME \
    --cluster-version=latest \
    --location CONTROL_PLANE_LOCATION \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID \
    --disk-type DISK_TYPE

Crie um cluster do Autopilot

Para criar um cluster do Autopilot cujo disco de arranque esteja encriptado com uma chave CMEK, use o seguinte comando:

gcloud container clusters create-auto CLUSTER_NAME \
    --cluster-version=latest \
    --location CONTROL_PLANE_LOCATION \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID

Substitua o seguinte:

  • CLUSTER_NAME: o nome do novo cluster.
  • CONTROL_PLANE_LOCATION: a localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters padrão e do Autopilot regionais ou uma zona para clusters padrão zonais.
  • KEY_PROJECT_ID: o ID do projeto principal.
  • LOCATION: a localização do seu conjunto de chaves.
  • RING_NAME: o nome do seu conjunto de chaves.
  • KEY_NAME: o nome da sua chave.
  • CLUSTER_PROJECT_ID é o ID do projeto do cluster.
  • DISK_TYPE: pd-standard (predefinição) ou pd-ssd.

Consola

Crie um cluster padrão

Para criar um cluster padrão cujo disco de arranque esteja encriptado com uma chave CMEK, siga estes passos:

  1. Na Google Cloud consola, aceda à página Criar um cluster do Kubernetes.

    Aceda a Crie um cluster do Kubernetes

  2. Configure o cluster conforme pretendido.
  3. No painel de navegação, em Node Pools, clique em Nodes.
  4. Na lista pendente Tipo de disco de arranque, selecione Disco persistente padrão ou Disco persistente SSD.
  5. Selecione a caixa de verificação Ativar encriptação gerida pelo cliente para o disco de arranque e escolha a chave de encriptação do Cloud KMS que criou anteriormente.
  6. Clique em Criar.

Crie um cluster do Autopilot

Para criar um cluster do Autopilot cujo disco de arranque esteja encriptado com uma chave CMEK, siga estes passos:

  1. Na Google Cloud consola, aceda à página Criar um cluster do Autopilot.

    Aceda a Crie um cluster do Autopilot

  2. Configure o cluster conforme pretendido.
  3. Expanda a secção Opções avançadas e localize as opções de Segurança.
  4. Selecione a caixa de verificação Ativar encriptação gerida pelo cliente para o disco de arranque e escolha a chave de encriptação do Cloud KMS que criou anteriormente.
  5. Clique em Criar.

Crie um novo node pool com discos de arranque de nós protegidos pela CMEK

Para criar um novo conjunto de nós com a CMEK ativada num cluster padrão existente, pode usar a CLI gcloud ou a Google Cloud consola.

gcloud

Para criar um conjunto de nós com encriptação gerida pelo cliente para discos de arranque de nós, especifique um valor para o parâmetro --boot-disk-kms-key no comando de criação.

gcloud container node-pools create NODE_POOL_NAME \
    --location CONTROL_PLANE_LOCATION \
    --disk-type DISK_TYPE \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID \
    --cluster CLUSTER_NAME

Substitua o seguinte:

  • NODE_POOL_NAME: o nome que escolher para o seu node pool.
  • CONTROL_PLANE_LOCATION: a localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters regionais ou uma zona para clusters zonais.
  • DISK_TYPE: pd-standard (predefinição) ou pd-ssd.
  • KEY_PROJECT_ID:o ID do projeto principal.
  • LOCATION: a localização do seu conjunto de chaves.
  • RING_NAME: o nome do seu conjunto de chaves.
  • KEY_NAME: o nome da sua chave.
  • CLUSTER_PROJECT_ID: o ID do projeto do cluster.
  • CLUSTER_NAME: o nome do cluster padrão que criou no passo anterior.

Consola

  1. Aceda à página do Google Kubernetes Engine na Google Cloud consola.

    Aceda ao Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que quer modificar.

  3. Clique em Adicionar conjunto de nós.

  4. No painel de navegação, clique em Nodes.

  5. Na secção Configuração da máquina, certifique-se de que o Tipo de disco de arranque é o Disco persistente padrão ou o Disco persistente SSD.

  6. Selecione a caixa de verificação Ativar a encriptação gerida pelo cliente para o disco de arranque e selecione a chave de encriptação do Cloud KMS que criou.

  7. Clique em Criar.

Use instâncias do Filestore ou discos persistentes protegidos por CMEK

As informações seguintes abrangem a forma de encriptar instâncias do Filestore ou discos persistentes criados recentemente. Pode ativar a CMEK num cluster novo ou existente, usando uma chave do Cloud KMS nova ou existente.

Tem de concluir estas instruções uma vez por cluster do GKE:

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

  1. Copie o conteúdo abaixo para um ficheiro YAML com o nome cmek-sc.yaml. Esta configuração permite o aprovisionamento dinâmico de volumes encriptados.

    Instâncias do Filestore

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-cmek
    provisioner: filestore.csi.storage.gke.io
    allowVolumeExpansion: true
    parameters:
      tier: enterprise
      instance-encryption-kms-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    
    • O campo instance-encryption-kms-key tem de ser o identificador de recurso totalmente qualificado para a chave que vai ser usada para encriptar novas instâncias do Filestore.
    • Os valores em instance-encryption-kms-key são sensíveis a maiúsculas e minúsculas (por exemplo: keyRings e cryptoKeys). O aprovisionamento de um novo volume com valores incorretos resulta num erro invalidResourceUsage.
    • Não pode adicionar o parâmetro instance-encryption-kms-key a um objeto StorageClass existente. No entanto, pode eliminar o objeto e recriá-lo com o mesmo nome, mas um conjunto diferente de parâmetros.StorageClass

    Persistent Disks

    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/RING_NAME/cryptoKeys/KEY_NAME
    
    • O campo disk-encryption-kms-key tem de ser o identificador de recurso totalmente qualificado para a chave que vai ser usada para encriptar novos discos.
    • Os valores em disk-encryption-kms-key são sensíveis a maiúsculas e minúsculas (por exemplo: keyRings e cryptoKeys). O aprovisionamento de um novo volume com valores incorretos resulta num erro invalidResourceUsage.
    • Não pode adicionar o parâmetro disk-encryption-kms-key a um objeto StorageClass existente. No entanto, pode eliminar o objeto StorageClass e recriá-lo com o mesmo nome, mas um conjunto diferente de parâmetros. Certifique-se de que o aprovisionador da turma existente é pd.csi.storage.gke.io.

    Pode definir a StorageClass como predefinição.

  2. Implemente o StorageClass no seu cluster do GKE usando o kubectl:

    kubectl apply -f cmek-sc.yaml
    
  3. Verifique se o seu StorageClass usou o controlador CSI do Filestore ou do disco persistente do Compute Engine e inclui o ID da sua chave:

    Instâncias do Filestore

    kubectl describe storageclass csi-filestore-cmek
    

    No resultado do comando, verifique o seguinte:

    • O aprovisionador está definido como filestore.csi.storage.gke.io.
    • O ID da sua chave segue o formato instance-encryption-kms-key.
    Name:                  csi-filestore-cmek
    IsDefaultClass:        No
    Annotations:           None
    Provisioner:           filestore.csi.storage.gke.io
    Parameters:            instance-encryption-kms-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME,type=pd-standard
    AllowVolumeExpansion:  true
    MountOptions:          none
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                none
    

    Persistent Disks

    kubectl describe storageclass csi-gce-pd-cmek
    

    No resultado do comando, verifique o seguinte:

    • O aprovisionador está definido como pd.csi.storage.gke.io.
    • O ID da sua chave segue-se 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
    

Crie um volume de armazenamento encriptado no GKE

Nesta secção, vai aprovisionar dinamicamente volumes de armazenamento do Kubernetes encriptados com a nova chave do StorageClass e do Cloud KMS.

  1. Copie o seguinte conteúdo para um novo ficheiro com o nome pvc.yaml e certifique-se de que o valor de storageClassName corresponde ao nome do objeto StorageClass:

    Instâncias do Filestore

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-cmek
      resources:
        requests:
          storage: 1Ti
    

    Persistent Disks

    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 seu cluster do GKE:

    kubectl apply -f pvc.yaml
    
  3. Se o seu StorageClass tiver o campo volumeBindingMode definido como WaitForFirstConsumer, tem de criar um Pod para usar o PVC antes de o poder validar. Copie o seguinte conteúdo para um novo ficheiro com o nome pod.yaml e certifique-se de que o valor de claimName corresponde ao nome do seu objeto PersistentVolumeClaim:

    apiVersion: v1
    kind: Pod
    metadata:
      name: web-server
    spec:
      containers:
       - name: web-server
         image: nginx
         volumeMounts:
           - mountPath: /var/lib/www/html
             name: mypvc
      volumes:
       - name: mypvc
         persistentVolumeClaim:
           claimName: podpvc
           readOnly: false
    
  4. Aplique o pod no seu cluster do GKE:

    kubectl apply -f pod.yaml
    
  5. Obtenha o estado do PersistentVolumeClaim do cluster e verifique se o PVC foi criado e associado a um PersistentVolume recém-aprovisionado.

    Instâncias do Filestore

    kubectl get pvc
    

    O resultado é semelhante ao seguinte:

    NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
    podpvc    Bound     pvc-e36abf50-84f3-11e8-8538-42010a800002   1Ti        RWO            csi-filestore-cmek  9s
    

    Persistent Disks

    kubectl get pvc
    

    O resultado é semelhante ao seguinte:

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

Já pode usar o disco persistente protegido por CMEK com o seu cluster do GKE.

Remova a proteção CMEK

Quando encripta um disco persistente com uma chave do Cloud KMS, a encriptação é permanente. Não pode remover a chave de encriptação desse disco específico, mesmo que elimine ou desative a chave do Cloud KMS. A única forma de alterar a chave de encriptação ou remover a proteção CMEK de um disco persistente é criar um novo disco persistente com base numa captura de ecrã do disco existente. Para mais informações, consulte o artigo Remova a chave de encriptação do Cloud KMS de um disco persistente.

Não é possível remover a encriptação CMEK de instâncias do Filestore.

Políticas da organização do GKE e CMEK

O GKE suporta políticas organizacionais de CMEK (pré-visualização) que podem exigir proteção CMEK e limitar as chaves do Cloud KMS que pode usar para proteção CMEK.

Quando container.googleapis.com está na lista de serviços da política Deny para a restrição constraints/gcp.restrictNonCmekServices, o GKE recusa-se a criar os seguintes recursos se não ativar a proteção CMEK:

  • Novos clusters e node pools
  • Novas instâncias do Filestore e discos persistentes

Quando a restrição constraints/gcp.restrictNonCmekCryptoKeyProjects é configurada numa política da organização, o GKE só cria recursos protegidos por CMEK que usam uma chave de encriptação de um projeto, uma pasta ou uma organização permitidos.

O que se segue?