Autenticar cargas de trabalho para outras cargas de trabalho por mTLS


Este documento descreve como configurar o provisionamento automático e o gerenciamento do ciclo de vida de identidades de carga de trabalho gerenciadas para o Compute Engine. Você configura pools de CA para emitir certificados usando o Certificate Authority Service (CA) , que é um serviço altamente disponível e escalável. Google Cloud serviço que simplifica e automatiza a implantação, o gerenciamento e a segurança dos serviços da CA. Cada VM é provisionada com credenciais X.509 do pool de CA configurado. Essas credenciais podem então ser usadas para estabelecer conexões mTLS.

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

Antes de começar

  • Solicite acesso à visualização da identidade da carga de trabalho gerenciada .

  • Configure a CLI do Google Cloud.

    After installing the Google Cloud CLI, initialize it by running the following command:

    gcloud init

    If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  • Configure a CLI do Google Cloud para usar o projeto permitido 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 para a visualização da identidade da carga de trabalho gerenciada.

  • Revise a documentação de visão geral das identidades de carga de trabalho gerenciada .
  • Enable the Compute Engine API:

    gcloud services enable compute.googleapis.com

Funções obrigatórias

Para obter as permissões necessárias para criar VMs que usam certificados de identidade de 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 obter mais informações sobre a concessão de funções, consulte Gerenciar acesso a projetos, pastas e organizações .

Você também poderá obter as permissões necessárias por meio de funções personalizadas ou outras funções predefinidas .

Visão geral

Para usar identidades de carga de trabalho gerenciadas para seus aplicativos, você deve executar as seguintes tarefas:

  1. Administrador de segurança :

  2. Administrador de computação :

Configurar identidades de carga de trabalho gerenciadas no Identity and Access Management

  • Siga as instruções em Configurar autenticação de identidades de carga de trabalho gerenciada .

    Estas instruções detalham como concluir o seguinte:

    • Crie um pool de identidades de carga de trabalho.
    • Crie namespaces no pool de identidades da carga de trabalho. Você usa os namespaces para criar limites administrativos para suas identidades de carga de trabalho gerenciadas, por exemplo, um namespace para cada um dos aplicativos de propriedade de sua organização.
    • Crie uma identidade de carga de trabalho gerenciada em um namespace no pool de identidades de carga de trabalho. Por exemplo, você pode criar um namespace para um aplicativo e criar identidades gerenciadas nesse namespace para os microsserviços que dão suporte a esse aplicativo.
    • Crie uma conta de serviço. As VMs do Compute Engine podem ser autorizadas a receber uma identidade de carga de trabalho gerenciada com base no Google Cloud conta de serviço anexada à VM.
    • Crie uma política de atestado de carga de trabalho que permita que sua carga de trabalho receba credenciais para a identidade de carga de trabalho gerenciada. Para emitir credenciais para a identidade da carga de trabalho gerenciada, a carga de trabalho deve estar dentro de um projeto especificado e ter a conta de serviço anexada.
    • Configure o Serviço de Autoridade de Certificação para emitir certificados para identidades de carga de trabalho gerenciadas:
      • Configurar o pool de CA raiz
      • Configurar as CAs subordinadas
      • Autorizar identidades de carga de trabalho gerenciadas para solicitar certificados do pool de autoridades de certificação

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

O administrador de segurança cria um arquivo JSON que contém o seguinte:

Este arquivo deve ser denominado CONFIGS.json . Você usa esse arquivo ao criar um modelo de instância para MIGs ou ao criar uma VM individual.

O arquivo CONFIGS.json deve ser semelhante ao seguinte:

  {
  "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"
     }
  }
  }
  

Habilitar identidades de carga de trabalho gerenciadas para um grupo de instâncias gerenciadas (MIG)

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

Crie um modelo de instância

Crie um modelo de instância com o recurso de identidades de carga de trabalho gerenciadas habilitado. Em seguida, use este modelo para criar um grupo gerenciado de instâncias (MIG).

gcloud

Use o comando gcloud beta compute instance-templates create para criar um novo modelo de instância que habilite identidades de carga de trabalho gerenciadas.

gcloud beta 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

Você pode adicionar sinalizações adicionais ao criar o modelo de instância para personalizar as VMs que ele cria, como especificar o tipo de máquina e a imagem, em vez de usar os valores padrão.

Substitua o seguinte:

  • 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 onde a conta de serviço foi criada.
  • CONFIGS.json : o arquivo de configuração que contém a configuração de emissão de certificado, a configuração de confiança e a identidade da carga de trabalho gerenciada.

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

Crie um grupo gerenciado de instâncias a partir do modelo

Crie um grupo de instâncias gerenciadas que use um modelo de instância que habilite as identidades de carga de trabalho gerenciada. Para obter 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 o seguinte:

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

Para obter informações detalhadas sobre a criação de MIGs, consulte Cenários básicos para a criação de grupos de instâncias gerenciadas (MIGs)

Habilitar identidades de carga de trabalho gerenciadas para VMs individuais

Você pode habilitar identidades de carga de trabalho gerenciadas para uma VM ao criar a VM ou atualizando os metadados do parceiro para uma VM existente.

Criar VMs com identidades de carga de trabalho gerenciadas habilitadas

Ao criar uma VM, para ativar o recurso de identidades de carga de trabalho gerenciadas para a VM, você deve fazer o seguinte:

  • Especifique uma conta de serviço para a VM usar
  • Configure o atributo de metadados enable-workload-certificate como true
  • Especifique as informações de configuração de emissão de certificado e de configuração confiável como metadados do parceiro .

gcloud

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

  1. Crie uma VM com o recurso de identidades de carga de trabalho gerenciada habilitado.

    gcloud beta 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
    

    Você pode adicionar linhas adicionais ao comando para configurar a VM, como tipo de máquina e imagem, em vez de usar os valores padrão. Para obter mais informações, consulte Criar e iniciar uma instância de VM .

    Substitua o seguinte:

    • INSTANCE_NAME : um nome exclusivo para a VM. Para obter detalhes sobre nomes de instância válidos, consulte Nomear recursos .
    • INSTANCE_ZONE : a zona na qual criar a VM.
    • 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 onde 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 certificado, a configuração de confiança e a configuração de identidade da carga de trabalho gerenciada.

Habilitar identidades de carga de trabalho gerenciadas em VMs existentes

Para ativar identidades de carga de trabalho gerenciadas para uma VM existente, atualize a VM para configurar o seguinte:

  • Se a VM ainda não tiver uma conta de serviço anexada, crie e anexe uma conta de serviço à VM.
  • Configure o atributo de metadados enable-workload-certificate como true .
  • Especifique as informações de configuração de emissão de certificado e de configuração confiável como metadados do parceiro .
  • Reinicie a VM.

gcloud

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

  1. Se a VM ainda não tiver uma conta de serviço anexada, anexe a conta de serviço à VM .

  2. Atualize os metadados de uma VM existente para ativar identidades de carga de trabalho gerenciadas.

    gcloud beta compute instances add-metadata VM_NAME \
       --zone=ZONE \
       --metadata enable-workload-certificate=true
    

    Substitua o seguinte:

    • VM_NAME : o nome da VM
    • ZONE : a zona onde a VM está localizada
  3. Atualize a configuração de uma VM existente para adicionar o arquivo de configuração.

    gcloud beta compute instances update VM_NAME \
       --zone=ZONE \
       --partner-metadata-from-file CONFIGS.json
    

    Substitua o seguinte:

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

    gcloud beta compute instances stop VM_NAME \
       --zone=ZONE
    

    Substitua o seguinte:

    • VM_NAME : o nome da VM
    • ZONE : a zona onde a VM está localizada.
  5. Inicie a VM.

    gcloud beta compute instances start VM_NAME \
       --zone=ZONE
    

    Substitua o seguinte:

    • VM_NAME : o nome da VM
    • ZONE : a zona onde a VM está localizada.

Acessar credenciais de carga de trabalho em uma VM Linux

Depois de configurar com êxito a carga de trabalho para autenticação de carga de trabalho usando mTLS, você poderá acessar as credenciais emitidas em sua VM.

Há duas maneiras de acessar as credenciais de identidade da carga de trabalho gerenciada do Compute Engine e o pacote confiável associado:

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

Acesse as credenciais da carga de trabalho e o pacote confiável usando o sistema de arquivos na VM

Este método coloca as credenciais X.509 e o pacote confiável em um caminho específico dentro do sistema de arquivos da VM. Os aplicativos podem ler diretamente as credenciais e o pacote confiável do sistema de arquivos. Para obter exemplos de como recuperar as credenciais, consulte os seguintes exemplos no GitHub:

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

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

Se a versão do agente convidado for inferior a 20231103.01, será possível atualizá-lo seguindo as instruções em Atualizando o ambiente convidado .

Para disponibilizar as credenciais da carga de trabalho e o pacote confiável 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 posterior. O agente convidado faz o seguinte:

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

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

    • private_key.pem : uma chave privada formatada em PEM
    • certificates.pem : um pacote de certificados X.509 formatados em 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 em PEM para usar como âncoras de confiança ao validar os certificados de pares.

      spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog
      
    • config_status : um arquivo de log contendo mensagens de erro.

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

Acesse as credenciais da carga de trabalho e o pacote confiável 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 confiável. O aplicativo é responsável por verificar periodicamente os terminais do servidor de metadados em busca de novas credenciais e atualizações no pacote confiável.

O servidor de metadados do Compute Engine expõe três endpoints HTTP para permitir o uso do recurso de identidades de carga de trabalho gerenciadas por aplicativos executados dentro da VM.

  • gce-workload-certificates/config-status : um endpoint que contém erros nos valores de configuração fornecidos por meio dos metadados da VM.
  • gce-workload-certificates/workload-identities : um endpoint de identidades gerenciadas pelo plano de controle do Compute Engine. Este endpoint contém o certificado X.509 e a chave privada do domínio confiável 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 peer X.509.

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

Para acessar as credenciais da carga de trabalho e o pacote confiável usando o servidor de metadados, seu aplicativo deve fazer o seguinte:

  1. Consulte o endpoint gce-workload-certificates/config-status . Certifique-se de que o código de resposta HTTP seja 200 e que a resposta não contenha erros partnerMetadataConfigsErrors . Se tais erros existirem, atualize a configuração apropriada com valores válidos seguindo as etapas discutidas em Atualizar emissão de certificado e configuração confiável .

    Para verificar o valor, você pode executar 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 . Certifique-se de que o código de resposta HTTP seja 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 . É fundamental que ambos os valores sejam lidos na mesma resposta para evitar incompatibilidade entre a chave privada e pública, caso as identidades da carga de trabalho gerenciada sejam atualizadas pela infraestrutura do Compute Engine.

  3. Consulte o endpoint gce-workload-certificates/trust-anchors . Certifique-se de que o código de resposta HTTP seja 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 confiável que pode então ser usado para autenticar credenciais X.509 de peer ao estabelecer uma conexão mTLS.

Atualizando as credenciais e o pacote confiável

O plano de controle do Compute Engine alterna automaticamente as credenciais de identidade da carga de trabalho gerenciada e as âncoras de confiança periodicamente.

Se seus aplicativos usarem o sistema de arquivos para acessar as credenciais da carga de trabalho e o pacote confiável, o agente convidado do Compute Engine atualizará automaticamente as credenciais e o pacote confiável, por exemplo, quando os certificados mTLS forem alternados.

Se seus aplicativos consultarem o servidor de metadados, os aplicativos em execução em uma VM deverão consultar periodicamente os pontos de extremidade do servidor de metadados para obter o conjunto mais recente de credenciais de identidade de carga de trabalho gerenciada e o pacote confiável. Não fazer isso pode interromper os aplicativos devido à expiração do certificado ou alterações no pacote confiável, o que pode causar falha no estabelecimento da conexão mTLS. O Google recomenda que os aplicativos consultem o servidor de metadados em busca das credenciais de identidade da carga de trabalho gerenciada e do pacote confiável a cada cinco minutos.

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

Você pode modificar a configuração de emissão de certificado e a configuração de confiança para uma VM que usa identidades de carga de trabalho gerenciadas.

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

Para atualizar a configuração de emissão de certificado e os valores de configuração confiável em um modelo de instância, é necessário criar um novo modelo com os novos valores. Portanto, não há suporte para atualizar a configuração de emissão de certificado e a configuração de confiança para grupos de instâncias gerenciadas (MIGs) existentes.

Atualizar VMs individuais do Compute Engine

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

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

Substitua o seguinte:

  • 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

Solucionar problemas

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

O que vem a seguir