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
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.
No projeto da chave, certifique-se de que ativou a API Cloud KMS.
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.No projeto do cluster, certifique-se de que ativou a API Cloud KMS.
Certifique-se de que instalou a CLI gcloud.
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ãous-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ãoasia-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
- Na Google Cloud consola, aceda à página Gestão de chaves.
Clique no nome do conjunto de chaves que contém a chave.
Clique no nome da chave que quer modificar.
Clique no separador Autorizações.
Clique em
Conceder acesso. O painel Conceder acesso à chave é aberto.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.No menu Selecionar uma função, selecione Encriptador/desencriptador de CryptoKey do Cloud KMS.
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) oupd-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:
- Na Google Cloud consola, aceda à página Criar um cluster do Kubernetes.
- Configure o cluster conforme pretendido.
- No painel de navegação, em Node Pools, clique em Nodes.
- Na lista pendente Tipo de disco de arranque, selecione Disco persistente padrão ou Disco persistente SSD.
- 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.
- 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:
- Na Google Cloud consola, aceda à página Criar um cluster do Autopilot.
- Configure o cluster conforme pretendido.
- Expanda a secção Opções avançadas e localize as opções de Segurança.
- 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.
- 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) oupd-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
Aceda à página do Google Kubernetes Engine na Google Cloud consola.
Na lista de clusters, clique no nome do cluster que quer modificar.
Clique em add_box Adicionar conjunto de nós.
No painel de navegação, clique em Nodes.
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.
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.
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 um cluster do GKE, se ainda não tiver um disponível.
- Implemente o controlador CSI do Filestore ou o controlador CSI do Persistent Disk do Compute Engine no seu cluster.
- Crie um conjunto de chaves e uma versão da chave do Cloud KMS, se ainda não tiver um disponível.
- Conceda autorizações de acesso à chave à conta de serviço do Filestore.
- Crie uma StorageClass que permita que os discos aprovisionados pelo Kubernetes sejam automaticamente encriptados com essa chave do Cloud KMS. Para ver detalhes sobre como o fazer, consulte a secção seguinte.
Crie uma StorageClass que faça referência à chave do Cloud KMS
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
ecryptoKeys
). O aprovisionamento de um novo volume com valores incorretos resulta num erroinvalidResourceUsage
. - Não pode adicionar o parâmetro
instance-encryption-kms-key
a um objetoStorageClass
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
ecryptoKeys
). O aprovisionamento de um novo volume com valores incorretos resulta num erroinvalidResourceUsage
. - Não pode adicionar o parâmetro
disk-encryption-kms-key
a um objetoStorageClass
existente. No entanto, pode eliminar o objetoStorageClass
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.
- O campo
Implemente o
StorageClass
no seu cluster do GKE usando okubectl
:kubectl apply -f cmek-sc.yaml
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.
Copie o seguinte conteúdo para um novo ficheiro com o nome
pvc.yaml
e certifique-se de que o valor destorageClassName
corresponde ao nome do objetoStorageClass
: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
Aplique o
PersistentVolumeClaim
(PVC) no seu cluster do GKE:kubectl apply -f pvc.yaml
Se o seu
StorageClass
tiver o campovolumeBindingMode
definido comoWaitForFirstConsumer
, 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 nomepod.yaml
e certifique-se de que o valor declaimName
corresponde ao nome do seu objetoPersistentVolumeClaim
: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
Aplique o pod no seu cluster do GKE:
kubectl apply -f pod.yaml
Obtenha o estado do
PersistentVolumeClaim
do cluster e verifique se o PVC foi criado e associado a umPersistentVolume
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?
- Leia as Perguntas frequentes sobre o Cloud Key Management Service.
- Saiba como proteger recursos com chaves do Cloud KMS.