Encriptar os discos de arranque do etcd e do plano de controlo

.

Esta página mostra-lhe como encriptar dados armazenados no seu plano de controlo do Google Kubernetes Engine (GKE) através de chaves que gere no Cloud Key Management Service (Cloud KMS). Já deve estar familiarizado com conceitos como o etcd, a arquitetura do cluster do GKE e o Cloud KMS.

Esta página descreve uma parte de um conjunto de funcionalidades opcionais do plano de controlo no GKE que lhe permitem realizar tarefas como validar a sua postura de segurança do plano de controlo ou configurar a encriptação e a assinatura de credenciais no plano de controlo através de chaves que gere. Para mais detalhes, consulte o artigo Acerca da autoridade do plano de controlo do GKE.

Por predefinição, Trusted Cloud aplica várias medidas de segurança ao plano de controlo gerido. Esta página descreve as capacidades opcionais que lhe dão mais visibilidade ou controlo sobre o plano de controlo do GKE.

Acerca do disco de arranque do plano de controlo e da encriptação etcd

Por predefinição, o GKE encripta o disco de arranque de um nó do plano de controlo, o disco que armazena dados no etcd e a cópia de segurança operacional Trusted Cloud by S3NS interna do etcd através de chaves de encriptação que Trusted Cloud gere. Para ver detalhes sobre esta encriptação predefinida, consulte o artigo Encriptação predefinida em repouso. Opcionalmente, pode usar as suas próprias chaves de encriptação que gere com o Cloud KMS para encriptar estes recursos. Para saber mais, consulte o artigo Disco de arranque do plano de controlo e encriptação etcd.

Cria chaves no Cloud KMS que o GKE usa para encriptar os recursos do plano de controlo. Considere o seguinte quando criar estes recursos:

  • Pode usar um porta-chaves para todas as chaves num cluster, independentemente da finalidade de cada chave. Se tiver um anel de chaves existente que usou para um objetivo diferente, como configurar as suas próprias autoridades de certificação, pode usar esse anel de chaves para este guia.
  • Deve criar as chaves na mesma Trusted Cloud localização que o seu cluster para uma melhor latência.
  • Para a maioria dos exemplos de utilização, pode usar o nível de proteção da chave do Cloud KMS software. Também pode usar chaves de hardware com o Cloud HSM.
  • Tem de especificar a flag --purpose com o valor encryption porque estas chaves são usadas para encriptação simétrica.
  • Não deve modificar a duração predefinida para a destruição de chaves.

Utilização com outras funcionalidades de autoridade do plano de controlo do GKE

A autoridade do plano de controlo do GKE oferece as seguintes funcionalidades relacionadas com chaves autogeridas que tem de ativar ao mesmo tempo quando cria um cluster:

Só pode ativar estas funcionalidades quando cria um novo cluster do GKE. Não pode atualizar clusters existentes para usar estas funcionalidades. Para usar ambas as funcionalidades no mesmo cluster, execute todos os procedimentos de configuração de chaves e CA em ambos os guias e, em seguida, execute o comando de criação do cluster que ativa ambos os conjuntos de funcionalidades, conforme descrito na secção Crie um cluster.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute gcloud components update para obter a versão mais recente.
  • Certifique-se de que o projeto da chave tem um conjunto de chaves do Cloud KMS para o seu cluster. Pode usar qualquer anel de chaves existente na localização do cluster. Para criar um novo conjunto de chaves, consulte o artigo Crie um conjunto de chaves.
  • Enable the Cloud Key Management Service API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

Identifique projetos

Recomendamos que use Trusted Cloud projetos separados da seguinte forma:

  • Projeto principal: contém todas as chaves.
  • Projeto do cluster: contém os seus clusters do GKE.

Opcionalmente, pode usar o mesmo projeto para as suas chaves e clusters do GKE, mas recomendamos que use projetos separados para que as equipas que gerem as suas chaves e operações criptográficas estejam separadas das equipas que gerem os seus clusters.

Funções e autorizações necessárias

Para receber as autorizações de que precisa para executar as suas próprias chaves de encriptação, peça ao seu administrador que lhe conceda as seguintes funções de IAM:

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

Requisitos

O cluster tem de executar a versão 1.31.1-gke.1846000 ou posterior do GKE.

Limitações

  • Só pode configurar as chaves de encriptação do disco de arranque e do etcd durante a criação do cluster.
  • Para clusters do modo Standard regionais e clusters do Autopilot, a região na qual cria um cluster tem de ter capacidade para o modo confidencial para o Hyperdisk Balanced em, pelo menos, três zonas nessa região.

    Para clusters zonais no modo Standard, a zona do cluster tem de ter capacidade do Hyperdisk Balanced. Para obter ajuda com a capacidade, contacte o Cloud Customer Care.

  • O GKE só suporta chaves do Cloud KMS. Não pode usar outro fornecedor do KMS do Kubernetes nem outro fornecedor de encriptação.

  • As chaves do Cloud External Key Manager (Cloud EKM) não são suportadas.

  • Não pode aceder nem interagir com as cópias de segurança operacionais internas do etcd, que se destinam apenas à recuperação de desastres. Trusted Cloud

  • Os conjuntos de chaves multirregionais não são suportados. Tem de usar um porta-chaves regional.

  • As regiões e as zonas nas quais pode usar a autoridade do plano de controlo do GKE dependem de querer usar também funcionalidades específicas, da seguinte forma:

    • Para encriptar os discos de arranque do plano de controlo com uma chave de encriptação gerida pelo cliente, o cluster tem de estar numa das seguintes regiões:
      • asia-east1
      • asia-northeast1
      • asia-southeast1
      • europe-west1
      • europe-west4
      • us-central1
      • us-east1
      • us-east4
      • us-east5
      • us-south1
      • us-west1
      • us-west3
      • us-west4
    • Para usar nós do GKE confidenciais com a autoridade do plano de controlo do GKE, o cluster tem de estar numa região que suporte o modo confidencial para o Hyperdisk Balanced.

    Se não usar estas funcionalidades, pode usar a autoridade do plano de controlo do GKE em qualquer Trusted Cloud localização.

Crie chaves

Nesta secção, cria uma chave de encriptação para os discos de arranque e os discos etcd no seu plano de controlo, e uma chave de encriptação separada para a Trusted Cloud cópia de segurança operacional interna do etcd. Pode usar um porta-chaves para guardar todas estas chaves e quaisquer outras chaves para o cluster.

  1. Crie a chave de encriptação para os discos de arranque do plano de controlo e os discos etcd:

    gcloud kms keys create KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

    Substitua o seguinte:

    • KCP_DISK_KEY_NAME: o nome da chave de encriptação para os discos de arranque do plano de controlo e os discos etcd.
    • KEYRING_NAME: o nome do conjunto de chaves para guardar as chaves de encriptação do cluster.
    • LOCATION: a Trusted Cloud localização do conjunto de chaves. Tem de ser igual à localização do cluster. Para ver uma lista de regiões, filtre por "Região" na tabela de localizações do Cloud KMS.
    • PROTECTION_LEVEL: o nível de proteção da chave, como software ou hsm.
    • KEY_PROJECT_ID: o ID do projeto do seu projeto principal.
  2. Crie a chave de encriptação de cópias de segurança internas do etcd:

    gcloud kms keys create ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

    Substitua ETCD_BACKUP_KEY_NAME por um nome para a chave de encriptação de cópia de segurança interna do etcd.

Conceda funções IAM ao agente do serviço GKE

Nesta secção, concede funções de IAM nas chaves que criou ao agente de serviço do GKE no projeto do cluster. O agente de serviço do GKE requer estas funções para usar estas chaves para encriptar os recursos do plano de controlo correspondentes.

  1. Encontre o número do projeto do cluster:

    gcloud projects describe CLUSTER_PROJECT_ID \
        --format='value(projectNumber)'
    

    Substitua CLUSTER_PROJECT_ID pelo ID do projeto do cluster do GKE.

    O resultado é semelhante ao seguinte:

    1234567890
    
  2. Conceda a função Encriptador/desencriptador de CryptoKey do Cloud KMS (roles/cloudkms.cryptoKeyEncrypterDecrypter) na chave de encriptação para discos de arranque e discos etcd ao agente de serviço do GKE no projeto do cluster:

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project=KEY_PROJECT_ID
    

    Substitua o seguinte:

    • KCP_DISK_KEY_NAME: o nome da chave de encriptação do disco.
    • LOCATION: a Trusted Cloud localização da chave.
    • KEYRING_NAME: o nome do conjunto de chaves que contém a chave de encriptação.
    • CLUSTER_PROJECT_NUMBER: o número do projeto numérico do projeto do cluster, que encontrou no passo anterior.
    • KEY_PROJECT_ID: o ID do projeto do seu projeto principal.
  3. Conceda a função Encriptador/desencriptador de CryptoKey do Cloud KMS através de delegação (roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation) na chave de encriptação para discos de arranque e discos etcd ao agente de serviço do GKE no projeto do cluster:

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation \
        --project=KEY_PROJECT_ID
    
  4. Conceda a função Utilizador da chave do Cloud KMS nas chaves de encriptação para discos de arranque e discos etcd ao agente de serviço do GKE no projeto do cluster para a rotação de chaves:

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \
        --role=roles/container.cloudKmsKeyUser \
        --project=KEY_PROJECT_ID
    
  5. Conceda a função Encriptador de CryptoKey do Cloud KMS (roles/cloudkms.cryptoKeyEncrypter) na chave de encriptação de cópias de segurança internas do etcd ao agente de serviço do GKE no projeto do cluster:

    gcloud kms keys add-iam-policy-binding ETCD_BACKUP_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypter \
        --project=KEY_PROJECT_ID
    

    Substitua ETCD_BACKUP_KEY_NAME pelo nome da chave de encriptação de cópia de segurança operacional do etcd.

    A concessão da função roles/cloudkms.cryptoKeyEncrypter impede que o GKE faça restaurações de bases de dados em seu nome e aumenta significativamente o tempo necessário para restaurar a funcionalidade quando ocorre um problema de base de dados. Para permitir que o GKE faça restauros por si, conceda a função roles/cloudkms.cryptoKeyEncrypterDecrypter.

Use chaves de encriptação num cluster

Esta secção mostra como identificar os caminhos para as suas chaves de encriptação.

  1. Identifique o caminho para a chave de encriptação de disco:

    gcloud kms keys describe KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

    Substitua o seguinte:

    • KCP_DISK_KEY_NAME: o nome da chave de encriptação para discos de arranque do plano de controlo e discos etcd.
    • KEYRING_NAME: o nome do conjunto de chaves que contém a chave.
    • LOCATION: a localização da chave. Trusted Cloud
    • KEY_PROJECT_ID: o ID do projeto do seu projeto principal.

    O resultado é semelhante ao seguinte:

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/disk-encryption-key
    
  2. Identifique o caminho para a chave de encriptação de cópia de segurança interna do etcd:

    gcloud kms keys describe ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

    Substitua ETCD_BACKUP_KEY_NAME pelo nome da chave de encriptação de cópia de segurança operacional do etcd.

    O resultado é semelhante ao seguinte:

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/etcd-backup-encryption-key
    

Crie um cluster

Nesta secção, cria um cluster com diferentes opções especificadas, dependendo das funcionalidades de autoridade do plano de controlo do GKE que quer configurar. Só pode configurar estas funcionalidades num cluster durante a criação do cluster. Os seguintes comandos criam clusters no modo padrão. Em alternativa, para criar clusters do modo de piloto automático, use as mesmas flags com o comando gcloud container clusters create-auto.

  • Para criar um cluster que configure a encriptação de disco e execute as suas próprias ACs e chaves de assinatura de contas de serviço, faça o seguinte:

    1. Execute todos os passos de configuração da chave e da AC em Execute as suas próprias autoridades de certificação e chaves.
    2. Encontre os caminhos para cada uma das chaves da conta de serviço e das ACs através das instruções em Configure ACs e chaves num novo cluster.
    3. Crie um cluster:

      gcloud container clusters create CLUSTER_NAME \
          --location=LOCATION \
          --project=CLUSTER_PROJECT_ID \
          --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
          --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY \
          --service-account-signing-keys=PATH_TO_SIGNING_KEY_VERSION \
          --service-account-verification-keys=PATH_TO_VERIFICATION_KEY_VERSION \
          --cluster-ca=PATH_TO_CLUSTER_CA \
          --etcd-peer-ca=PATH_TO_ETCD_PEER_CA \
          --etcd-api-ca=PATH_TO_ETCD_API_CA \
          --aggregation-ca=PATH_TO_AGGREGATION_CA
      

      Substitua o seguinte:

      • CLUSTER_NAME: o nome do novo cluster.
      • LOCATION: a localização do novo cluster.
      • CLUSTER_PROJECT_ID: o ID do projeto do seu projeto de cluster.
      • PATH_TO_DISK_KEY: o caminho para a chave de encriptação do disco dos passos anteriores nesta página.
      • PATH_TO_ETCD_BACKUP_KEY: o caminho para a chave de encriptação de cópia de segurança interna do etcd dos passos anteriores nesta página.
      • PATH_TO_SIGNING_KEY_VERSION: o caminho para a versão da chave de assinatura da conta de serviço do Kubernetes no Cloud KMS.
      • PATH_TO_VERIFICATION_KEY_VERSION: o caminho para a versão da chave de validação da conta de serviço do Kubernetes no Cloud KMS.
      • PATH_TO_CLUSTER_CA: o caminho para o conjunto de ACs do cluster.
      • PATH_TO_ETCD_PEER_CA: o caminho para o conjunto de ACs de pares etcd.
      • PATH_TO_ETCD_API_CA: o caminho para o grupo de ACs da API etcd.
      • PATH_TO_AGGREGATION_CA: o caminho para o conjunto de CA de agregação.
  • Para criar um cluster que apenas configure a encriptação de disco com as chaves que criou neste guia, execute o seguinte comando:

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
        --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY
    

    Substitua o seguinte:

    • CLUSTER_NAME: o nome do novo cluster.
    • LOCATION: a localização do novo cluster.
    • CLUSTER_PROJECT_ID: o ID do projeto do seu projeto de cluster.
    • PATH_TO_DISK_KEY: o caminho para a chave de encriptação do disco dos passos anteriores.
    • PATH_TO_ETCD_BACKUP_KEY: o caminho para a chave de encriptação de cópia de segurança interna do etcd dos passos anteriores.

Também pode especificar todas estas flags quando cria um novo cluster no modo padrão.

Valide o estado da chave de encriptação

Esta secção mostra como validar a chave de encriptação que foi usada durante a criação do cluster. Pode fazer esta validação através do Cloud Logging ou da CLI do Google Cloud.

Use o registo para validar chaves

Para validar as chaves através do registo, faça o seguinte:

  1. Na Trusted Cloud consola, aceda à página Explorador de registos:

    Aceda ao Explorador de registos

  2. Obtenha o registo de criação de clusters especificando a seguinte consulta:

    resource.type="gke_cluster"
    resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.location="CLUSTER_LOCATION"
    protoPayload.serviceName="container.googleapis.com"
    protoPayload.methodName=~"google.container.v(1|1alpha1|1beta1).ClusterManager.CreateCluster"
    protoPayload.request.cluster.userManagedKeysConfig:*
    
  3. Clique em Executar consulta.

Na saída, verifique se os parâmetros de criação do cluster incluíram um caminho da chave que corresponde à chave que configurou no Cloud KMS, como no exemplo seguinte:

# lines omitted for clarity
userManagedKeysConfig: {
  controlPlaneDiskEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KCP_DISK_KEY_NAME"
  gkeopsEtcdBackupEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/ETCD_BACKUP_KEY_NAME"
}

Use a CLI gcloud para validar chaves

Para usar a CLI gcloud para validar a chave de encriptação, faça o seguinte:

  1. Para a chave de encriptação de disco, execute o seguinte comando:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.controlPlaneDiskEncryptionKey)"
    
  2. Para a chave de encriptação de cópias de segurança internas do etcd, execute o seguinte comando:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.gkeopsEtcdBackupEncryptionKey)"
    

Alterne as chaves de encriptação de disco do etcd e do plano de controlo

As chaves de encriptação que cria não expiram. Para melhorar a sua postura de segurança, rode regularmente estas chaves e reencripte os seus recursos com novas versões de chaves. Para mais informações, consulte o artigo Rode as chaves de encriptação do disco de arranque do etcd e do plano de controlo.

O que se segue?