Autenticar cargas de trabalho para outras cargas de trabalho por mTLS


Neste documento, descrevemos como configurar o provisionamento automático e o gerenciamento do ciclo de vida de identidades das cargas de trabalho gerenciadas para o Compute Engine. Configure pools de ACs para emitir certificados usando o Certificate Authority Service (AC), que é um serviço do Google Cloud altamente disponível e escalonável que simplifica e automatiza a implantação, o gerenciamento e segurança dos serviços de AC. Cada VM é provisionada com credenciais X.509 do pool de AC configurado. Essas credenciais podem ser usadas para estabelecer conexões mTLS.

Com as identidades das cargas de trabalho gerenciadas para o Compute Engine, é possível implementar comunicações mutuamente autenticadas e criptografadas entre duas VMs do Compute Engine. Os aplicativos de carga de trabalho em execução nas VMs configuradas podem usar as credenciais X.509 para o mTLS por VM. Esses certificados mTLS são alternados e gerenciados automaticamente pelo Certificate Authority Service.

Antes de começar

  • Solicitar acesso ao pré-lançamento da identidade da carga de trabalho gerenciada.

  • Configure a CLI do Google Cloud.

    Instale a Google Cloud CLI e inicialize-a executando o seguinte comando:

    gcloud init
  • Configure a CLI do Google Cloud para usar o projeto da lista de permissões para faturamento e cota.

      gcloud config set billing/quota_project PROJECT_ID

    Substitua PROJECT_ID pelo ID do projeto que foi adicionado à lista de permissões do pré-lançamento da identidade da carga de trabalho gerenciada.

  • Revise a documentação sobre a visão geral das identidades das cargas de trabalho gerenciadas.
  • Ative a API Compute Engine:

    gcloud services enable compute.googleapis.com

Funções exigidas

Para receber as permissões necessárias para criar VMs que usam certificados de identidade da carga de trabalho gerenciada para autenticação em outras cargas de trabalho, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:

Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

Também é possível conseguir as permissões necessárias com papéis personalizados ou outros papéis predefinidos.

Visão geral

Para usar identidades de carga de trabalho gerenciada nos aplicativos, execute as tarefas a seguir:

  1. Administrador de segurança:

  2. Administrador do Compute:

Configurar identidades das cargas de trabalho gerenciadas no Identity and Access Management

  • Siga as instruções em Configurar autenticação de identidades das cargas de trabalho gerenciadas.

    Essas instruções detalham como concluir as seguintes ações:

    • Crie um pool de identidade da carga de trabalho.
    • Criar namespaces no pool de Identidade da carga de trabalho. Você usa os namespaces para criar limites administrativos para suas identidades das cargas de trabalho gerenciadas, por exemplo, um namespace para cada um dos aplicativos que pertencem à sua organização.
    • Criar uma identidade da carga de trabalho gerenciada em um namespace no pool de Identidade da carga de trabalho. Por exemplo, é possível criar um namespace para um aplicativo e criar identidades gerenciadas nesse namespace para os microsserviços compatíveis com esse aplicativo.
    • criam uma conta de serviço; É possível autorizar as VMs do Compute Engine a receberem uma identidade da carga de trabalho gerenciada com base na conta de serviço do Google Cloud vinculada à VM.
    • Criar uma política de atestado da carga de trabalho que permita que sua carga de trabalho receba credenciais da identidade da carga de trabalho gerenciada. Para emitir credenciais para a identidade da carga de trabalho gerenciada, ela precisa estar em um projeto especificado e ter a conta de serviço anexada.
    • Configurar o Certificate Authority Service para que emita certificados para identidades das cargas de trabalho gerenciadas:
      • Configurar o pool de CAs raiz
      • Configurar as CAs subordinadas
      • Autorizar que identidades das cargas de trabalho gerenciadas solicitem certificados do pool de AC.

Acessar o arquivo de configuração para fazer upload dos metadados do parceiro

O administrador de segurança cria um arquivo JSON com as seguintes configurações:

Esse arquivo precisa ser nomeado como CONFIGS.json. Use esse arquivo ao criar um modelo de instância para MIGs ou ao criar uma VM individual.

O arquivo CONFIGS.json será semelhante a este:

  {
  "wc.compute.googleapis.com": {
     "entries": {
        "certificate-issuance-config": {
           "primary_certificate_authority_config": {
              "certificate_authority_config": {
                 "ca_pool": "projects/PROJECT_ID/locations/SUBORDINATE_CA_POOL_REGION/caPools/SUBORDINATE_CA_POOL_ID"
              }
           },
           "key_algorithm": "rsa-2048"
        },
        "trust-config": {
           "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
               "trust_anchors": [{
                  "ca_pool": "projects/PROJECT_ID/locations/SUBORDINATE_CA_POOL_REGION/caPools/SUBORDINATE_CA_POOL_ID"
                }]
           }
     }
  }
  },
  "iam.googleapis.com": {
     "entries": {
        "workload-identity": "spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID"
     }
  }
  }
  

Ativar identidades das cargas de trabalho gerenciadas para um grupo gerenciado de instâncias (MIG)

Um grupo gerenciado de instâncias (MIG) é um grupo de instâncias de máquina virtual (VM) que você trata como uma única entidade. Cada VM em um MIG é criada usando um modelo de instância. Para permitir que as VMs no MIG usem identidades das cargas de trabalho gerenciadas, especifique a configuração no modelo de instância.

Criar um modelo de instância

Crie um modelo de instância com o recurso ativado de identidades das cargas de trabalho gerenciadas. Em seguida, use esse modelo para criar um grupo gerenciado de instâncias (MIG).

gcloud

Use o comando gcloud alpha compute instance-templates create para criar um novo modelo de instância que permita identidades das cargas de trabalho gerenciadas.

gcloud alpha compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --service-account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
    --metadata enable-workload-certificate=true \
    --partner-metadata-from-file CONFIGS.json

É possível adicionar outras flags ao criar o modelo de instância para personalizar as VMs criadas, como especificar o tipo de máquina e a imagem em vez de usar os valores padrão.

Substitua:

  • INSTANCE_TEMPLATE_NAME: o nome do novo modelo.
  • SERVICE_ACCOUNT_NAME: o nome da conta de serviço que tem permissão para receber a identidade gerenciada.
  • PROJECT_ID: o ID do projeto em que a conta de serviço foi criada.
  • CONFIGS.json: o arquivo de configuração que contém a configuração de emissão do certificado, a configuração de confiança e a identidade da carga de trabalho gerenciada.

Para mais informações, consulte Criar modelos de instâncias.

Criar um grupo gerenciado de instâncias com base no modelo

Crie um grupo gerenciado de instâncias que use um modelo de instância que permita as identidades das cargas de trabalho gerenciadas. Para ver detalhes sobre como criar o modelo de instância, consulte Criar um modelo de instância.

gcloud

Crie um MIG usando o modelo de instância e o comando gcloud compute instance-groups managed create.

gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
    --size=SIZE \
    --template=INSTANCE_TEMPLATE_NAME \
    --zone=ZONE

Substitua:

  • INSTANCE_GROUP_NAME: um ID exclusivo para o grupo gerenciado de instâncias. Para ver detalhes sobre nomes válidos, consulte Nomear recursos.
  • SIZE: o tamanho do grupo gerenciado de instâncias.
  • INSTANCE_TEMPLATE_NAME: o nome do modelo de instância a ser usado ao criar VMs no MIG.
  • ZONE: a zona onde as VMs serão criadas.

Para informações detalhadas sobre como criar MIGs, consulte Cenários básicos para criar grupos gerenciados de instâncias (MIGs)

Ativar identidades das cargas de trabalho gerenciadas para VMs individuais

É possível ativar identidades das cargas de trabalho gerenciadas em uma VM ao criá-la ou ao atualizar os metadados do parceiro de uma VM que já existe.

Criar VMs com identidades das cargas de trabalho gerenciadas ativadas

Ao criar uma VM, para ativar o recurso de identidades das cargas de trabalho gerenciadas para a VM, faça isto:

  • Especifique uma conta de serviço para a VM usar.
  • Defina o atributo de metadados enable-workload-certificate como true.
  • Especifique as informações de configuração de emissão de certificados e configuração de confiança como metadados do parceiro.

gcloud

Use o comando gcloud alpha compute instances create para criar uma nova VM. Use o arquivo CONFIGS.json fornecido pelo administrador de segurança ou criado conforme as instruções em Criar um arquivo de configuração para fazer upload dos metadados do parceiro.

  1. Criar uma VM com o recurso ativado de identidades das cargas de trabalho gerenciadas.

    gcloud alpha compute instances create INSTANCE_NAME \
       --zone=INSTANCE_ZONE \
       --service-account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --metadata enable-workload-certificate=true \
       --partner-metadata-from-file CONFIGS.json
    

    É possível adicionar outras linhas ao comando para configurar a VM, como tipo de máquina e imagem, em vez de usar os valores padrão. Para mais informações, consulte Criar e iniciar uma instância de VM.

    Substitua:

    • INSTANCE_NAME: um nome exclusivo da VM. Para ver detalhes sobre nomes válidos de instâncias, consulte Nomear recursos.
    • INSTANCE_ZONE: zona em que a VM será criada.
    • SERVICE_ACCOUNT_NAME: o nome da conta de serviço que tem permissão para receber a identidade gerenciada.
    • PROJECT_ID: o ID do projeto em que a conta de serviço foi criada.
    • CONFIGS.json: o nome do arquivo de configuração que contém a configuração de emissão de certificados, a configuração de confiança e a configuração de identidade da carga de trabalho gerenciada.

Ativar identidades das cargas de trabalho gerenciadas em VMs que já existem

Para ativar identidades das cargas de trabalho gerenciadas em uma VM que já existe, atualize a VM para definir as seguintes configurações:

  • Defina o atributo de metadados enable-workload-certificate como true.
  • Especifique as informações de configuração de emissão de certificados e configuração de confiança como metadados do parceiro.

gcloud

Essa tarefa usa o arquivo CONFIGS.json fornecido pelo administrador de segurança ou criado conforme as instruções em Criar um arquivo de configuração para fazer upload dos metadados do parceiro.

  1. Atualizar a configuração de uma VM que já existe para ativar identidades das cargas de trabalho gerenciadas.

    gcloud alpha compute instances update VM_NAME \
       --zone=ZONE \
       --metadata enable-workload-certificate=true \
       --partner-metadata-from-file CONFIGS.json
    

    Substitua:

    • VM_NAME: o nome da VM
    • ZONE: é a zona em que a VM está localizada
    • CONFIGS.json: o arquivo de configuração que contém a configuração de emissão do certificado, a configuração de confiança e a identidade da carga de trabalho gerenciada.

Acessar credenciais das cargas de trabalho em uma VM do Linux

Depois de configurar com sucesso a carga de trabalho para autenticação de carga de trabalho usando mTLS, é possível acessar as credenciais emitidas na sua VM.

Há duas maneiras de acessar as credenciais das identidades das cargas de trabalho gerenciadas do Compute Engine e o pacote de confiança associado:

  • O sistema de arquivos na VM
  • O servidor de metadados do Compute Engine

Acessar as credenciais das cargas de trabalho e o pacote de confiança usando o sistema de arquivos na VM

Esse método coloca as credenciais X.509 e o pacote de confiança em um caminho específico dentro do sistema de arquivos da VM. Os aplicativos podem ler diretamente as credenciais e o pacote de confiança do sistema de arquivos. Consulte a seguir os exemplos no GitHub de como recuperar as credenciais:

A VM precisa executar o agente convidado do Compute Engine versão 20231103.01 ou mais recente. Use o comando a seguir para verificar a versão do agente convidado do Compute Engine na sua VM:

gcloud alpha compute instances get-serial-port-output INSTANCE_NAME \
   --zone=ZONE | grep "GCE Agent Started"

Se a versão do agente convidado for anterior à 20231103.01, atualize-a conforme as instruções em Como atualizar o ambiente para convidados.

Para disponibilizar as credenciais das cargas de trabalho e o pacote de confiança no sistema de arquivos de uma VM, conclua as etapas a seguir:

  1. Instale ou atualize o agente convidado do Compute Engine para a versão 20231103.01 ou mais recente. O agente convidado realiza as seguintes ações:

    • Recupera automaticamente as credenciais e o pacote de confiança do servidor de metadados do Compute Engine.
    • Garante gravações atômicas no sistema de arquivos durante a atualização do certificado X.509 e da chave privada correspondente.
    • Atualiza automaticamente as credenciais e o pacote de confiança, por exemplo, quando os certificados mTLS são alternados.
  2. Depois que você instala ou atualiza o agente convidado do Compute Engine no SO convidado, o job de atualização da carga de trabalho cria o diretório /var/run/secrets/workload-spiffe-credentials e define as permissões como 0755 (rwxr-xr-x).

    O diretório contém os seguintes arquivos criados com as permissões 0644 (rw-r--r--):

    • private_key.pem: uma chave privada formatada por PEM.
    • certificates.pem: um pacote de certificados X.509 formatados por PEM que podem ser apresentados a outras VMs como a cadeia de certificados do cliente ou usados como uma cadeia de certificados do servidor.
    • ca_certificates.pem: um pacote de certificados X.509 formatados por PEM para usar como âncoras de confiança ao validar certificados de peerings.

      spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog
      
    • config_status: um arquivo de registro que contém mensagens de erro.

  3. Os aplicativos podem ler diretamente os certificados, a chave privada e o pacote de confiança do sistema de arquivos para estabelecer conexões mTLS.

Acesse as credenciais das cargas de trabalho e o pacote de confiança usando o servidor de metadados

Um aplicativo em execução em uma VM do Compute Engine pode consultar diretamente os endpoints do servidor de metadados e recuperar as credenciais e o pacote de confiança. O aplicativo é responsável por verificar periodicamente os endpoints do servidor de metadados em busca de novas credenciais e atualizações para o pacote de confiança.

O servidor de metadados do Compute Engine expõe três endpoints HTTP para permitir que o recurso de identidades das cargas de trabalho gerenciadas seja usado por aplicativos em execução na VM.

  • gce-workload-certificates/config-status: um endpoint que contém erros nos valores de configuração fornecidos pelos metadados da VM.
  • gce-workload-certificates/workload-identities: um endpoint de identidades gerenciadas pelo plano de controle do Compute Engine. Esse endpoint contém o certificado X.509 e a chave privada do domínio de confiança da VM.
  • gce-workload-certificates/trust-anchors: um endpoint que contém um conjunto de certificados confiáveis para validação da cadeia de certificados X.509 de peering.

Para saber mais sobre como consultar os metadados de uma instância de VM, consulte Sobre metadados da VM.

Para acessar as credenciais das cargas de trabalho e o pacote de confiança usando o servidor de metadados, o aplicativo precisa fazer isto:

  1. Consulte o endpoint gce-workload-certificates/config-status. Verifique se o código de resposta HTTP é 200 e se a resposta não contém erros partnerMetadataConfigsErrors. Se houver esses erros, atualize a configuração apropriada com valores válidos conforme as etapas discutidas em Atualizar a emissão de certificados e a configuração de confiança.

    Para verificar o valor, execute o seguinte comando na VM:

    curl "http://metadata.google.internal/computeMetadata/v1/instance/gce-workload-certificates/config-status" -H "Metadata-Flavor: Google"
    

    O endpoint config-status retorna uma resposta JSON com a seguinte estrutura:

    {
        "partnerMetadataConfigsErrors": {
            "errors": {  // A map of errors keyed by attribute name.
                "ATTRIBUTE_NAME" : "ERROR_DETAILS",
                ...
            }
        }
    }
    
  2. Consulte o endpoint gce-workload-certificates/workload-identities. Verifique se o código de resposta HTTP é 200. O endpoint retorna uma resposta JSON com a seguinte estrutura:

    {
     "workloadCredentials": {  // Credentials for the VM's trust domains
       "spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID": {
          "certificatePem" : "X.509 certificate or certificate chain",
          "privateKeyPem" : "Private for X.509 leaf certificate"
       }
     }
    }
    

    Extraia o certificatePem e o privateKeyPem. É essencial que os dois valores sejam lidos na mesma resposta para evitar incompatibilidade entre as chaves privada e pública, caso as identidades das cargas de trabalho gerenciadas tenham sido atualizadas pela infraestrutura do Compute Engine.

  3. Consulte o endpoint gce-workload-certificates/trust-anchors. Verifique se o código de resposta HTTP é 200. A resposta conterá apenas as âncoras de confiança para o domínio de confiança SPIFFE, se especificado. Caso contrário, a consulta retornará um erro. O endpoint trust-anchors retorna uma resposta JSON com a seguinte estrutura:

    {
        "trustAnchors": {  // Trust bundle for the VM's trust domains
            "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
                "trustAnchorsPem" : "Trust bundle containing the X.509
                roots certificates"
            }
        }
    }
    

    O conteúdo de trustAnchorsPem contém o pacote de confiança que pode ser usado para autenticar as credenciais X.509 de peering ao estabelecer uma conexão mTLS.

Como atualizar as credenciais e o pacote de confiança

O plano de controle do Compute Engine alterna de maneira automática e periódica as credenciais das identidades das cargas de trabalho gerenciadas e as âncoras de confiança.

Se os aplicativos usarem o sistema de arquivos para acessar as credenciais das cargas de trabalho e o pacote de confiança, o agente convidado do Compute Engine atualizará automaticamente as credenciais e o pacote de confiança, por exemplo, quando os certificados mTLS forem alternados.

Se os aplicativos consultarem o servidor de metadados, os aplicativos em execução em uma VM precisarão consultar periodicamente os endpoints do servidor de metadados para receber o conjunto mais recente de credenciais das identidades das cargas de trabalho gerenciadas e o pacote de confiança. Se isso não for feito, os aplicativos poderão ficar corrompidos devido à expiração do certificado ou a alterações no pacote de confiança, causando falha no estabelecimento da conexão mTLS. O Google recomenda que os aplicativos consultem o servidor de metadados em busca das credenciais das identidades das cargas de trabalho gerenciadas e do pacote de confiança a cada cinco minutos.

Atualizar a emissão de certificados e a configuração de confiança

É possível modificar a configuração de emissão de certificados e a configuração de confiança em uma VM que usa identidades das cargas de trabalho gerenciadas.

Atualizar o modelo de instância para um grupo gerenciado de instâncias

Para atualizar valores da configuração de emissão de certificados e configuração de confiança em um modelo de instância, é preciso criar um novo modelo com os novos valores. Portanto, não é possível atualizar a configuração de emissão de certificados e a configuração de confiança para grupos gerenciados de instâncias (MIGs) que já existem.

Atualizar VMs individuais do Compute Engine

Para atualizar a configuração de emissão de certificados e a configuração de confiança, atualize o conteúdo do arquivo CONFIGS.json e use o comando gcloud alpha compute instances update para aplicar as atualizações:

gcloud alpha compute instances update INSTANCE_NAME \
    --partner-metadata-from-file FILENAME.json

Substitua:

  • INSTANCE_NAME: o nome da VM para a qual você está atualizando os valores de configuração.
  • FILENAME: o nome do arquivo de configuração modificado, por exemplo, CONFIGS.json

Resolver problemas

Para encontrar métodos para diagnosticar e resolver erros comuns relacionados à recuperação de credenciais das cargas de trabalho, consulte a documentação Resolver problemas de autenticação entre cargas de trabalho.

A seguir