Como receber credenciais de curta duração com federação de identidade

Neste guia, descrevemos como usar um pool de identidades de carga de trabalho e um provedor para receber credenciais de curta duração seguindo este processo:

  1. Consiga uma credencial do provedor de identidade confiável.
  2. Troque a credencial por um token do Security Token Service.
  3. Use o token do Security Token Service para personificar uma conta de serviço e receber um token de acesso do Google de curta duração.

Usando os tokens de acesso de curta duração do Google, você pode acessar todos os recursos do Google Cloud a que a conta de serviço recebeu acesso.

Antes de começar

  1. Ative as APIs IAM, Security Token Service, and Service Account Credentials.

    Ative as APIs

  2. Federe com um provedor de identidade externo criando um pool e um provedor de federação de identidade da carga de trabalho

  3. Crie uma conta de serviço que você queira que as identidades externas representem.

  4. Conceda à conta de serviço acesso a recursos que você quer que as identidades externas acessem.

Como conceder permissão de identidades externas para personificar uma conta de serviço

Para permitir que identidades externas personifiquem uma conta de serviço, você precisa conceder a elas o papel de usuário de identidade da carga de trabalho (roles/iam.workloadIdentityUser) na conta de serviço. É possível conceder o papel a uma identidade externa específica ou a várias identidades externas:

  • Para uma identidade externa específica, escreva uma condição de atributo que verifique o atributo google.subject.
  • Para um grupo de identidades externas, escreva uma condição de atributo que verifique o atributo google.groups ou um atributo personalizado attribute.NAME.
  • Para todas as identidades externas no pool de identidades da carga de trabalho, você não usa uma condição de atributo.

Console

  1. No Console do Google Cloud, acesse a página Pools de Identidades da carga de trabalho.

    Acesse Pools de identidade da carga de trabalho

  2. Encontre o pool de identidades de carga de trabalho que você quer atualizar e clique nele.

  3. Clique em CONCEDER ACESSO.

  4. Na lista suspensa Conta de serviço, selecione a conta de serviço que as identidades externas representarão.

  5. Escolha quais identidades no pool podem representar a conta de serviço.

    • Para permitir que apenas identidades específicas do pool de identidades de carga de trabalho personifiquem a conta de serviço, selecione Somente identidades correspondentes ao filtro.

      Na lista suspensa Nome do atributo, selecione o atributo que você quer filtrar.

      No campo Valor do atributo, insira o valor esperado do atributo.

      Por exemplo, se você usar um mapeamento de atributo google.subject=assertion.sub, defina o nome do atributo como subject e o valor do atributo ao valor da declaração sub em tokens emitidos pelo provedor de identidade externo.

    • Para permitir que todas as identidades externas do pool de identidades de carga de trabalho personifiquem a conta de serviço, selecione Todas as identidades no pool.

  6. Clique em Save.

  7. Clique em Dispensar.

gcloud

  1. Crie um identificador para as identidades externas:

    • Uma identidade externa específica:

      principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
      
    • Um grupo de identidades externas:

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
      
    • Todas as identidades externas que têm um determinado atributo:

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
      
    • Todas as identidades externas em um pool de identidades de carga de trabalho:

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
      

    Substitua os seguintes valores:

    • PROJECT_NUMBER: número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidade da carga de trabalho
    • SUBJECT: valor esperado do atributo mapeado para google.subject
    • GROUP: valor esperado do atributo mapeado para google.groups
    • ATTRIBUTE_NAME: nome de um atributo personalizado no seu mapeamento de atributos

    Para ver o número do seu projeto atual, use o comando a seguir:

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Conceda o papel de usuário da Identidade da carga de trabalho (roles/iam.workloadIdentityUser) ao principal na conta de serviço:

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="MEMBER_ID"
    

    Substitua os seguintes valores:

    • SERVICE_ACCOUNT_EMAIL: endereço de e-mail da conta de serviço
    • MEMBER_ID: identificador do participante que você identificou na etapa anterior

Como autenticar usando bibliotecas de cliente, a ferramenta gcloud ou o Terraform

As bibliotecas de cliente do Cloud, a CLI gcloud e o Terraform podem receber automaticamente credenciais externas e usá-las para representar uma conta de serviço. Para permitir que bibliotecas e ferramentas concluam esse processo, você precisa fornecer um arquivo de configuração de credenciais. Esse arquivo define o seguinte:

  • De onde receber credenciais externas
  • Qual pool de identidades de carga de trabalho e provedor usar
  • Qual conta de serviço representar

A maneira como os arquivos de configuração de credenciais são usados pelas bibliotecas de cliente depende do seu provedor de identidade externo:

AWS

As bibliotecas de cliente recebem automaticamente credenciais temporárias dos metadados de instância do EC2.

Azure

As bibliotecas de cliente recebem automaticamente os tokens de acesso do Serviço de metadados de instância (IMDS) do Azure.

Ações do GitHub

Como os parâmetros necessários para conseguir um token de ID do GitHub variam de acordo com cada execução do fluxo de trabalho, não é possível usar um arquivo de configuração estático de credenciais em um fluxo de trabalho do GitHub Actions.

Use a ação google-github-actions/auth para gerar automaticamente um arquivo de configuração de credenciais durante a execução do fluxo de trabalho. As ferramentas e bibliotecas de cliente, como terraform, podem usar esse arquivo de configuração de credenciais para receber credenciais do Google automaticamente.

OIDC

As bibliotecas de cliente recebem as credenciais de um arquivo local, um URL HTTP ou um executável local:

  • Credenciais originárias do arquivo: os tokens são carregados de um arquivo. Outro processo precisa atualizar esse arquivo com um novo token OIDC antes que o antigo expire. Por exemplo, se o token tiver um ciclo de vida de uma hora, você precisará atualizar o arquivo antes de ele completar 1 hora.
  • Credenciais fornecidas pelo URL: os tokens são carregados de um servidor local com um endpoint que responde a solicitações HTTP GET. A resposta precisa ser um token de ID do OIDC, em texto simples ou em formato JSON.
  • Credenciais de origem executável: os tokens são carregados de um executável local. O executável precisa processar o envio de um token de ID do OIDC válido e não expirado no formato JSON para stdout:

    {
      "version": 1,
      "success": true,
      "token_type": "urn:ietf:params:oauth:token-type:id_token",
      "id_token": "HEADER.PAYLOAD.SIGNATURE",
      "expiration_time": 1620499962
    }
    
    Esses campos são obrigatórios para uma resposta bem-sucedida, exceto expiration_time. O campo expiration_time só é necessário quando um arquivo de saída é especificado na configuração da credencial.

    Se ocorrer um erro, ele precisará ser exibido pelo executável no seguinte formato JSON para stdout:

    {
      "version": 1,
      "success": false,
      "code": "401",
      "message": "Caller not authorized."
    }
    
    Todos esses campos são obrigatórios para uma resposta de erro. Os campos de código e mensagem serão usados pelas bibliotecas de cliente ao gerar o erro apropriado.

    Resumo dos campos de formato das respostas:

    • version: a versão da saída JSON. No momento, somente a versão 1 é compatível.
    • success: o status da resposta. Quando verdadeiro, a resposta precisa conter o token, o tipo e a validade do token de terceiros. O executável também precisa sair com o código de saída 0. Quando for "false", a resposta precisará conter o código do erro e os campos de mensagem e sair com um valor diferente de zero.
    • token_type: o tipo de token de assunto de terceiros. Os valores aceitos são urn:ietf:params:oauth:token-type:id_token e urn:ietf:params:oauth:token-type:jwt.
    • id_token: o token OIDC de terceiros.
    • expiration_time: o prazo de validade do token OIDC em segundos (horário Unix).
    • code: a string do código de erro.
    • message: a mensagem de erro

    As bibliotecas de cliente preencherão as seguintes variáveis de ambiente quando o executável for executado:

    • GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE: o campo de público-alvo da configuração da credencial. Sempre presente.
    • GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE: o tipo de token de assunto esperado. Sempre presente.
    • GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL: o e-mail da conta de serviço. Presente apenas quando a representação da conta de serviço é usada.
    • GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE: o local do arquivo de saída da configuração da credencial. Presente somente quando especificado na configuração de credencial.

    Essas variáveis de ambiente podem ser usadas pelo executável para evitar que esses valores sejam fixados no código.

    Para ativar esse método de geração de credenciais com as bibliotecas de cliente, a variável de ambiente GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES precisa ser definida como 1.

OIDC (AD FS)

As bibliotecas de cliente recebem credenciais de um arquivo local ou de um URL HTTP, mas não são compatíveis com a Autenticação integrada do Windows (IWA, na sigla em inglês). Para receber um token de acesso para o usuário conectado e armazená-lo em um arquivo local, use o seguinte comando do PowerShell:

(Invoke-RestMethod `
    -Uri "https://ADFS_DOMAIN/adfs/oauth2/token/" `
    -Method POST `
    -Body @{
        client_id = 'CLIENT_ID'
        grant_type = 'client_credentials'
        scope = 'openid'
        resource = 'RELYING_PARTY_ID'
        use_windows_client_authentication = 'true'
        } `
    -UseDefaultCredentials).access_token | Out-File -Encoding ASCII TOKEN_FILEPATH

Substitua os seguintes valores:

  • ADFS_DOMAIN: nome de domínio público do servidor do AD FS do farm.
  • CLIENT_ID: ID do cliente do registro do aplicativo no AD FS.
  • RELYING_PARTY_ID: identificador de parte confiável que você usou ao criar um aplicativo de API da Web para o pool de identidade da carga de trabalho no AD FS.
  • TOKEN_FILEPATH: caminho para um arquivo temporário em que o token do AD FS será salvo. Verifique se o arquivo está armazenado em um local em que apenas usuários autorizados possam ler o conteúdo.

Como as credenciais de curta duração do Google são válidas somente por um tempo limitado (1 hora por padrão), é necessário executar esse comando periodicamente.

SAML

As bibliotecas de cliente recebem as credenciais de um arquivo local, um URL HTTP ou um executável local:

  • Credenciais originárias do arquivo: as declarações são carregadas de um arquivo. Outro processo precisa atualizar esse arquivo com uma nova declaração SAML codificada em base64 antes que a antiga expire. Por exemplo, se a declaração tiver um ciclo de vida de uma hora, você precisará atualizar o arquivo antes de ela completar 1 hora.
  • Credenciais fornecidas pelo URL: as declarações são carregadas de um servidor local com um endpoint que responde a solicitações HTTP GET. A resposta precisa ser uma declaração SAML codificada em base64 ou JSON contendo uma declaração SAML codificada em base64.
  • Credenciais de origem executável: as declarações são carregadas de um executável local. O executável precisa processar uma declaração SAML válida e não expirada no formato JSON para stdout:

    {
      "version": 1,
      "success": true,
      "token_type": "urn:ietf:params:oauth:token-type:saml2",
      "saml_response": "...",
      "expiration_time": 1620499962
    }
    
    Esses campos são obrigatórios para uma resposta bem-sucedida, exceto expiration_time. O campo expiration_time só é necessário quando um arquivo de saída é especificado na configuração da credencial.

    Se ocorrer um erro, ele precisará ser exibido pelo executável no seguinte formato JSON para stdout:

    {
      "version": 1,
      "success": false,
      "code": "401",
      "message": "Caller not authorized."
    }
    
    Todos esses campos são obrigatórios para uma resposta de erro. Os campos de código e mensagem serão usados pelas bibliotecas de cliente ao gerar o erro apropriado.

    Resumo dos campos de formato das respostas:

    • version: a versão da saída JSON. No momento, somente a versão 1 é compatível.
    • success: o status da resposta. Quando verdadeiro, a resposta precisa conter o token, o tipo e a validade do token de terceiros. O executável também precisa sair com o código de saída 0. Quando for "false", a resposta precisará conter o código do erro e os campos de mensagem e sair com um valor diferente de zero.
    • token_type: o tipo de token de assunto de terceiros. Precisa ser urn:ietf:params:oauth:token-type:saml2.
    • saml_response: a resposta SAML de terceiros.
    • expiration_time: o prazo de validade da resposta SAML de terceiros em segundos (horário Unix).
    • code: a string do código de erro.
    • message: a mensagem de erro

    As bibliotecas de cliente vão preencher as variáveis de ambiente a seguir quando o executável for executado: * GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE: o campo de público-alvo da configuração de credenciais. Sempre presente. * GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE: o tipo de token de assunto esperado. Sempre presente. * GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL: o e-mail da conta de serviço. Presente apenas quando a representação da conta de serviço é usada. * GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE: o local do arquivo de saída da configuração da credencial. Presente somente quando especificado na configuração de credencial.

    Essas variáveis de ambiente podem ser usadas pelo executável para evitar que esses valores sejam fixados no código.

    Para ativar esse método de geração de credenciais com as bibliotecas de cliente, a variável de ambiente GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES precisa ser definida como 1.

Siga estas etapas para permitir que as bibliotecas de cliente ou o Terraform usem a federação de identidade da carga de trabalho para autenticar:

  1. Crie um arquivo de configuração de credenciais:

    Console

    Faça o download de um arquivo de configuração de credencial no Console do Google Cloud:

    1. No Console do Google Cloud, acesse a página Pools de Identidades da carga de trabalho.

      Acesse Pools de identidade da carga de trabalho

    2. Localize o pool de identidades de carga de trabalho que contém o provedor de identidade que você quer usar e clique nele.

    3. Selecione Contas de serviço conectadas.

    4. Encontre a conta de serviço que você quer usar e clique em Download.

    5. Na caixa de diálogo Configurar seu aplicativo, selecione o provedor que contém as identidades externas que personificarão a conta de serviço.

    6. Forneça as configurações extras a seguir:

      AWS

      Nenhuma configuração adicional é necessária.

      Azure

      Caminho do recurso: URI do ID do aplicativo Azure

      OIDC

      Caminho do token OIDC: caminho ou URL do arquivo local que será usado para receber credenciais.

      Tipo de formato: formato do arquivo ou da resposta do URL de onde o token de ID é recuperado.

      Nome do campo de token do assunto: campo na resposta que contém o token (se o tipo de formato for json).

      SAML

      Caminho de declaração SAML: caminho ou URL do arquivo local que será usado para receber credenciais.

      Formato de tipo: formato do arquivo ou resposta do URL em que a declaração é recuperada.

      Campo de nome da declaração: campo na resposta que contém a declaração (se o tipo de formato for json).

    7. Selecione Fazer download da configuração para fazer o download do arquivo de configuração de credenciais e clique em Dispensar.

    gcloud

    Crie um arquivo de configuração de credencial usando gcloud iam workload-identity-pools create-cred-config:

    AWS

    Crie um arquivo de configuração de credenciais que permita à biblioteca receber um token de acesso dos metadados da instância do EC2:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
        --aws \
        --output-file=FILEPATH.json
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
    • SERVICE_ACCOUNT_EMAIL: endereço de e-mail da conta de serviço
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: a duração do ciclo de vida desejado do token de acesso da conta de serviço em segundos. O padrão é de uma hora quando não é fornecido. Se um ciclo de vida superior a uma hora for necessário, a conta de serviço precisará ser adicionada como um valor permitido em uma política da organização que aplique a restrição constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: arquivo em que a configuração será salva

    Se você estiver usando o AWS IGDGv2, uma outra sinalização --enable-imdsv2 precisará ser adicionada ao comando gcloud iam workload-identity-pools create-cred-config:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --aws \
        --enable-imdsv2 \
        --output-file=FILEPATH.json
    

    Azure

    Crie um arquivo de configuração de credenciais que permita que a biblioteca receba um token de acesso do Serviço de metadados de instância (IMDS) do Azure:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
        --azure \
        --app-id-uri APPLICATION_ID_URI \
        --output-file=FILEPATH.json
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
    • SERVICE_ACCOUNT_EMAIL: endereço de e-mail da conta de serviço
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: a duração do ciclo de vida desejado do token de acesso da conta de serviço em segundos. O padrão é de uma hora quando não é fornecido. Se um ciclo de vida superior a uma hora for necessário, a conta de serviço precisará ser adicionada como um valor permitido em uma política da organização que aplique a restrição constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • APPLICATION_ID_URI: o URI do ID do aplicativo do Azure
    • FILEPATH: arquivo em que a configuração será salva

    OIDC

    Para usar credenciais criadas pelo arquivo, use a sinalização --credential-source-file:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
        --output-file=FILEPATH.json \
        --credential-source-file=TOKEN_FILEPATH \
        --credential-source-type=SOURCE_TYPE \
        --credential-source-field-name=FIELD_NAME
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
    • SERVICE_ACCOUNT_EMAIL: endereço de e-mail da conta de serviço
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: a duração do ciclo de vida desejado do token de acesso da conta de serviço em segundos. O padrão é de uma hora quando não é fornecido. Se um ciclo de vida superior a uma hora for necessário, a conta de serviço precisará ser adicionada como um valor permitido em uma política da organização que aplique a restrição constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: arquivo em que a configuração será salva
    • TOKEN_FILEPATH: caminho em que os tokens de ID do OIDC são armazenados
    • SOURCE_TYPE: formato do arquivo de token de ID do OIDC, definido como text (padrão) ou json
    • FIELD_NAME: campo no arquivo de texto que contém o token (se SOURCE_TYPE for json)

    Para usar credenciais originadas de URL, use a sinalização --credential-source-url:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
        --output-file=FILEPATH.json \
        --credential-source-url="TOKEN_URL" \
        --credential-source-headers="KEY_1=VALUE_1,KEY_2=VALUE_2" \
        --credential-source-type=SOURCE_TYPE \
        --credential-source-field-name=FIELD_NAME
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
    • SERVICE_ACCOUNT_EMAIL: endereço de e-mail da conta de serviço
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: a duração do ciclo de vida desejado do token de acesso da conta de serviço em segundos. O padrão é de uma hora quando não é fornecido. Se um ciclo de vida superior a uma hora for necessário, a conta de serviço precisará ser adicionada como um valor permitido em uma política da organização que aplique a restrição constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: arquivo em que a configuração será salva
    • TOKEN_URL: URL do qual o token de ID do OIDC será recuperado
    • KEY_n, VALUE_n: cabeçalhos personalizados para incluir na solicitação HTTP para TOKEN_URL
    • SOURCE_TYPE: formato do arquivo de token de ID do OIDC, definido como text (padrão) ou json
    • FIELD_NAME: campo no arquivo de texto que contém o token (se SOURCE_TYPE for json)

    Para usar credenciais criadas pelo executável, use a sinalização --executable-command:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
        --output-file=FILEPATH.json \
        --executable-command=EXECUTABLE_COMMAND \
        --executable-timeout-millis=EXECUTABLE_TIMEOUT \
        --executable-output-file=EXECUTABLE_OUTPUT_FILE
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidade da carga de trabalho
    • POOL_ID: o ID do pool de identidade da carga de trabalho
    • PROVIDER_ID: o ID do provedor do pool de identidade da carga de trabalho
    • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail da conta de serviço.
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: a duração do ciclo de vida desejado do token de acesso da conta de serviço em segundos. O padrão é de uma hora quando não é fornecido. Se um ciclo de vida superior a uma hora for necessário, a conta de serviço precisará ser adicionada como um valor permitido em uma política da organização que aplique a restrição constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: o arquivo em que a configuração será salva
    • EXECUTABLE_COMMAND: o comando completo, incluindo argumentos, a ser executado para recuperar o token de ID do OIDC (por exemplo, --executable-command="/path/to/command --foo=bar")
    • EXECUTABLE_TIMEOUT: a duração opcional em milissegundos para aguardar a execução do executável (o padrão é 30s)
    • EXECUTABLE_OUTPUT_FILE: esse caminho de arquivo aponta para as credenciais 3PI geradas pelo executável. Isso é útil para armazenar as credenciais em cache. Ao especificar esse caminho, as bibliotecas do Auth verificam a existência dele antes de executar o executável.

    OIDC (AD FS)

    Crie um arquivo de configuração de credenciais que permita que a biblioteca leia o token de acesso do AD FS do arquivo temporário:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
        --output-file=FILEPATH.json \
        --credential-source-file=TOKEN_FILEPATH \
        --credential-source-type=text
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
    • SERVICE_ACCOUNT_EMAIL: endereço de e-mail da conta de serviço
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: a duração do ciclo de vida desejado do token de acesso da conta de serviço em segundos. O padrão é de uma hora quando não é fornecido. Se um ciclo de vida superior a uma hora for necessário, a conta de serviço precisará ser adicionada como um valor permitido em uma política da organização que aplique a restrição constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: arquivo em que a configuração será salva
    • TOKEN_FILEPATH: caminho para o arquivo temporário que contém o token do AD FS

    SAML

    Para usar credenciais criadas pelo arquivo, use a sinalização --credential-source-file:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
        --output-file=FILEPATH.json \
        --credential-source-file=TOKEN_FILEPATH \
        --credential-source-type=SOURCE_TYPE \
        --credential-source-field-name=FIELD_NAME \
        --subject-token-type=urn:ietf:params:oauth:token-type:saml2
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
    • SERVICE_ACCOUNT_EMAIL: endereço de e-mail da conta de serviço
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: a duração do ciclo de vida desejado do token de acesso da conta de serviço em segundos. O padrão é de uma hora quando não é fornecido. Se um ciclo de vida superior a uma hora for necessário, a conta de serviço precisará ser adicionada como um valor permitido em uma política da organização que aplique a restrição constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: arquivo em que a configuração será salva
    • TOKEN_FILEPATH: caminho em que as declarações SAML são armazenadas
    • SOURCE_TYPE: formato do arquivo de declaração SAML, definido como text (padrão) ou json
    • FIELD_NAME: campo no arquivo de texto que contém a declaração (se SOURCE_TYPE for json)

    Para usar credenciais originadas de URL, use a sinalização --credential-source-url:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
        --output-file=FILEPATH.json \
        --credential-source-url="TOKEN_URL" \
        --credential-source-headers="KEY_1=VALUE_1,KEY_2=VALUE_2" \
        --credential-source-type=source_type \
        --credential-source-field-name=field_name
        --subject-token-type=urn:ietf:params:oauth:token-type:saml2
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
    • SERVICE_ACCOUNT_EMAIL: endereço de e-mail da conta de serviço
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: a duração do ciclo de vida desejado do token de acesso da conta de serviço em segundos. O padrão é de uma hora quando não é fornecido. Se um ciclo de vida superior a uma hora for necessário, a conta de serviço precisará ser adicionada como um valor permitido em uma política da organização que aplique a restrição constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: arquivo em que a configuração será salva
    • TOKEN_URL: URL do qual a declaração SAML será recuperada
    • KEY_n, VALUE_n: cabeçalhos personalizados para incluir na solicitação HTTP para TOKEN_URL
    • SOURCE_TYPE: formato do arquivo de declaração SAML, definido como text (padrão) ou json
    • FIELD_NAME: campo no arquivo de texto que contém a declaração (se SOURCE_TYPE for json)

    Para usar credenciais criadas pelo executável, use a sinalização --executable-command:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
        --output-file=FILEPATH.json \
        --executable-command=EXECUTABLE_COMMAND \
        --executable-timeout-millis=EXECUTABLE_TIMEOUT \
        --executable-output-file=EXECUTABLE_OUTPUT_FILE
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
    • SERVICE_ACCOUNT_EMAIL: endereço de e-mail da conta de serviço
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: a duração do ciclo de vida desejado do token de acesso da conta de serviço em segundos. O padrão é de uma hora quando não é fornecido. Se um ciclo de vida superior a uma hora for necessário, a conta de serviço precisará ser adicionada como um valor permitido em uma política da organização que aplique a restrição constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: arquivo em que a configuração será salva
    • EXECUTABLE_COMMAND: comando completo a ser executado para recuperar a declaração SAML
    • EXECUTABLE_TIMEOUT: a duração opcional em milissegundos para aguardar a execução do executável (o padrão é 30s)
    • EXECUTABLE_OUTPUT_FILE: o arquivo de saída opcional que armazena a resposta executável

    Ações do GitHub

    Edite o arquivo YAML do GitHub Actions e adicione o seguinte:

    • Permita que o job busque um token de ID do GitHub adicionando a seguinte configuração:

      permissions:
        id-token: write
        contents: read
      
    • Adicione uma etapa para criar um arquivo de configuração de credenciais:

      - id: 'auth'
        name: 'Authenticate to Google Cloud'
        uses: 'google-github-actions/auth@v0.3.1'
        with:
          create_credentials_file: true
          workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
          service_account: 'SERVICE_ACCOUNT_EMAIL'
      

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
    • SERVICE_ACCOUNT_EMAIL: endereço de e-mail da conta de serviço

    Exemplo:

    jobs:
      build:
        # Allow the job to fetch a GitHub ID token
        permissions:
          id-token: write
          contents: read
    
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v2
    
          - id: 'auth'
            name: 'Authenticate to Google Cloud'
            uses: 'google-github-actions/auth@v0.3.1'
            with:
              create_credentials_file: true
              workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
              service_account: 'SERVICE_ACCOUNT_EMAIL'
    
  2. Inicialize uma variável de ambiente GOOGLE_APPLICATION_CREDENTIALS e aponte-a para o arquivo de configuração de credenciais:

    Bash

      export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
      
    em que FILEPATH é o caminho de arquivo relativo do arquivo de configuração de credenciais.

    PowerShell

      $env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
      
    em que FILEPATH é o caminho de arquivo relativo do arquivo de configuração de credenciais.

    YAML do GitHub Actions

    A ação google-github-actions/auth inicializa automaticamente GOOGLE_APPLICATION_CREDENTIALS.
  3. Use uma biblioteca de cliente compatível com a federação de identidade da carga de trabalho e que possa encontrar credenciais automaticamente:

    C++

    A maioria das bibliotecas de cliente do Google Cloud para C++ é compatível com a federação de identidade usando um objeto ChannelCredentials, que é criado chamando grpc::GoogleDefaultCredentials(). Para inicializar essa credencial, crie as bibliotecas de cliente com a versão 1.36.0 ou posteriores do gRPC.

    A biblioteca de cliente do Cloud Storage para C++ usa a API REST, não a gRPC. Portanto, ela não é compatível com a federação de identidade.

    Go

    As bibliotecas de cliente do Go são compatíveis com a federação de identidade se usarem a versão v0.0.0-20210218202405-ba52d332ba99 ou posteriores do módulo golang.org/x/oauth2.

    Para verificar qual versão deste módulo sua biblioteca de cliente usa, execute os seguintes comandos:

    cd $GOPATH/src/cloud.google.com/go
    go list -m golang.org/x/oauth2
    

    Java

    As bibliotecas de cliente do Java aceitam federação de identidade se usarem a versão 0.24.0 ou posteriores do artefato com.google.auth:google-auth-library-oauth2-http.

    Para verificar qual versão desse artefato a biblioteca de cliente usa, execute o seguinte comando do Maven no diretório do aplicativo:

    mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
    

    Node.js

    As bibliotecas de cliente do Node.js são compatíveis com a federação de identidade se usarem a versão 7.0.2 ou posteriores do pacote google-auth-library.

    Para verificar qual versão desse pacote sua biblioteca de cliente usa, execute o seguinte comando no diretório do seu aplicativo:

    npm list google-auth-library
    

    Ao criar um objeto GoogleAuth, é possível especificar um ID de projeto ou permitir que GoogleAuth encontre o ID do projeto automaticamente. Para encontrar o ID do projeto automaticamente, a conta de serviço no arquivo de configuração precisa ter o papel de navegador (roles/browser), ou um papel com permissões equivalentes no projeto. Para ver detalhes, consulte o README do pacote google-auth-library.

    Python

    As bibliotecas de cliente do Python são compatíveis com a federação de identidade se usarem a versão 1.27.0 ou posteriores do pacote google-auth.

    Para verificar qual versão desse pacote sua biblioteca de cliente usa, execute o seguinte comando no ambiente em que o pacote está instalado:

    pip show google-auth
    

    Para especificar um ID de projeto para o cliente de autenticação, defina a variável de ambiente GOOGLE_CLOUD_PROJECT ou permita que o cliente encontre o ID do projeto automaticamente. Para encontrar o ID do projeto automaticamente, a conta de serviço no arquivo de configuração precisa ter o papel de Navegador (roles/browser) ou um papel com permissões equivalentes no projeto. Para ver detalhes, consulte o guia do usuário do pacote google-auth.

    gcloud

    Para autenticar usando a federação de identidade da carga de trabalho, use o comando gcloud auth login:

    gcloud auth login --cred-file=FILEPATH.json
    

    em que FILEPATH é o caminho de arquivo do arquivo de configuração de credenciais.

    O suporte para a federação de identidade de carga de trabalho na CLI gcloud está disponível na versão 363.0.0 e posteriores da CLI gcloud.

    Terraform

    O provedor do Google Cloud é compatível com a federação de identidade da carga de trabalho se você usar a versão 3.61.0 ou posterior:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = "~> 3.61.0"
        }
      }
    }
    

    gsutil

    Para autenticar usando a federação de identidade da carga de trabalho, use um dos seguintes métodos:

    Ao usar a gsutil com a gcloud, faça login normalmente:

    gcloud auth login --cred-file=FILEPATH.json
    

    Ao usar a gsutil como um aplicativo de linha de comando autônomo, edite o arquivo .boto para incluir a seguinte seção:

    [Credentials]
    gs_external_account_file = FILEPATH
    

    Em ambos os casos, FILEPATH é o caminho para o arquivo de configuração de credencial.

    O suporte para a federação de identidade de carga de trabalho na gsutil está disponível na versão 379.0.0 e posteriores da CLI gcloud.

    bq

    Para autenticar usando a federação de identidade da carga de trabalho, use o comando gcloud auth login:

    gcloud auth login --cred-file=FILEPATH.json
    

    em que FILEPATH é o caminho de arquivo do arquivo de configuração de credenciais.

    O suporte para a federação de identidade de carga de trabalho no bq está disponível na versão 390.0.0 e posteriores da CLI gcloud.

Como autenticar usando a API REST

Se não for possível usar as bibliotecas de cliente, siga estas etapas para permitir que uma identidade externa receba um token de acesso de curta duração usando a API REST:

  1. Receba as credenciais do provedor de identidade externo:

    AWS

    Crie um documento JSON com as informações que normalmente seriam incluídas em uma solicitação para o endpoint GetCallerIdentity() da AWS, incluindo uma assinatura de solicitação válida. de dados.

    A federação de identidade da carga de trabalho se refere a esse documento JSON como um token GetCallerIdentity. O token permite que a federação de identidade da carga de trabalho verifique a identidade sem revelar a chave de acesso secreta da AWS.

    Um token GetCallerIdentity é semelhante a este:

    {
      "url": "https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
      "method": "POST",
      "headers": [
        {
          "key": "Authorization",
          "value" : "AWS4-HMAC-SHA256 Credential=AKIASOZTBDV4D7ABCDEDF/20200228/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date,Signature=abcedefdfedfd"
        },
        {
          "key": "host",
          "value": "sts.amazonaws.com"
        },
        {
          "key": "x-amz-date",
          "value": "20200228T225005Z"
        },
        {
          "key": "x-goog-cloud-target-resource",
          "value": "//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/my-pool/providers/my-aws-provider"
        },
        {
          "key": "x-amz-security-token",
          "value": "GizFWJTqYX...xJ55YoJ8E9HNU="
        }
      ]
    }
    

    O token contém os seguintes campos:

    • url: o URL do endpoint do AWS STS em GetCallerIdentity(), com o corpo de uma solicitação GetCallerIdentity() padrão anexado como parâmetros de consulta. Por exemplo, https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15. Os endpoints regionais também são compatíveis.
    • method: o método de solicitação HTTP: POST.
    • headers: os cabeçalhos da solicitação HTTP, que precisam incluir:
      • Authorization: a assinatura da solicitação.
      • host: nome do host do campo url. Por exemplo, sts.amazonaws.com.
      • x-amz-date: o horário em que você enviará a solicitação, formatado como uma string ISO 8601 básica. Esse valor normalmente é definido para a hora atual e é usado para evitar ataques de repetição.
      • x-goog-cloud-target-resource: o nome completo do recurso do provedor de identidade sem um prefixo https:. Exemplo:
        //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
        
      • x-amz-security-token: token de sessão. Necessário apenas se você estiver usando credenciais temporárias de segurança.

    No exemplo a seguir, é criado um token GetCallerIdentity codificado por URL. Extraia o token codificado por URL para uso posterior. Ele também cria um token legívelpor humanos apenas para sua referência:

    import json
    import urllib
    
    import boto3
    from botocore.auth import SigV4Auth
    from botocore.awsrequest import AWSRequest
    
    def create_token_aws(project_number: str, pool_id: str, provider_id: str) -> None:
        # Prepare a GetCallerIdentity request.
        request = AWSRequest(
            method="POST",
            url="https://sts.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15",
            headers={
                "Host": "sts.amazonaws.com",
                "x-goog-cloud-target-resource": f"//iam.googleapis.com/projects/{project_number}/locations/global/workloadIdentityPools/{pool_id}/providers/{provider_id}"
            })
    
        # Set the session credentials and Sign the request.
        # get_credentials loads the required credentials as environment variables.
        # Refer:
        # https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html
        SigV4Auth(boto3.Session().get_credentials(), "sts", "us-east-1").add_auth(request)
    
        # Create token from signed request.
        token = {
            "url": request.url,
            "method": request.method,
            "headers": []
        }
        for key, value in request.headers.items():
            token["headers"].append({"key": key, "value": value})
    
        # The token lets workload identity federation verify the identity without revealing the AWS secret access key.
        print("Token:\n%s" % json.dumps(token, indent=2, sort_keys=True))
        print("URL encoded token:\n%s" % urllib.parse.quote(json.dumps(token)))
    
    def main():
        # TODO(Developer): Replace the below credentials.
        # project_number: Google Project number (not the project id)
        project_number = "my-project-number"
        pool_id = "my-pool-id"
        provider_id = "my-provider-id"
    
        create_token_aws(project_number, pool_id, provider_id)
    
    if __name__ == "__main__":
        main()

    Inicialize as seguintes variáveis:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:aws:token-type:aws4_request"
    SUBJECT_TOKEN=TOKEN
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:aws:token-type:aws4_request"
    $SubjectToken = "TOKEN"
    

    Em que TOKEN é o token GetCallerIdentity codificado da URL que foi gerado pelo script acima.

    Azure

    Conecte-se a uma VM do Azure que tenha uma identidade gerenciada atribuída e consiga um token de acesso do Serviço de metadados de instância (IMDS) do Azure:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:jwt"
    SUBJECT_TOKEN=$(curl \
      "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \
      -H "Metadata: true" | jq -r .access_token)
    echo $SUBJECT_TOKEN
    

    Esse comando usa a ferramenta jq. jq está disponível por padrão no Cloud Shell.

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
      -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" `
      -Headers @{Metadata="true"}).access_token
    Write-Host $SubjectToken
    

    Em que APP_ID_URI é o URI do ID do aplicativo que você configurou para a federação de identidade da carga de trabalho.

    Ações do GitHub

    Use a google-github-actions/auth para receber um token de ID do GitHub e trocá-lo por um token de acesso de curta duração:

    • Permita que o job busque um token de ID do GitHub adicionando a seguinte configuração:

      permissions:
        id-token: write
        contents: read
      
    • Adicione uma etapa para gerar um token de acesso e disponibilizá-lo em uma variável ${{ steps.auth.outputs.access_token }}:

      - id: 'auth'
        name: 'Authenticate to Google Cloud'
        uses: 'google-github-actions/auth@v0.3.1'
        with:
          token_format: 'access_token'
          workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
          service_account: 'SERVICE_ACCOUNT_EMAIL'
      

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidades da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
    • SERVICE_ACCOUNT_EMAIL: endereço de e-mail da conta de serviço

    Exemplo:

    jobs:
      build:
        # Allow the job to fetch a GitHub ID token
        permissions:
          id-token: write
          contents: read
    
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v2
    
          - id: 'auth'
            name: 'Authenticate to Google Cloud'
            uses: 'google-github-actions/auth@v0.3.1'
            with:
              token_format: 'access_token'
              workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
              service_account: 'SERVICE_ACCOUNT_EMAIL'
    

    Pule as etapas a seguir.

    OIDC

    Pegue um token com o provedor de identidade externo e inicialize as seguintes variáveis:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:jwt"
    SUBJECT_TOKEN=TOKEN
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = "TOKEN"
    

    Em que TOKEN é o token emitido pelo seu provedor de identidade externo.

    OIDC (AD FS)

    Use os seguintes comandos do PowerShell para autenticar no AD FS usando o IWA e receba um token de acesso:

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
        -Uri "https://ADFS_DOMAIN/adfs/oauth2/token/" `
        -Method POST `
        -Body @{
            client_id = 'CLIENT_ID'
            grant_type = 'client_credentials'
            scope = 'openid'
            resource = 'RELYING_PARTY_ID'
            use_windows_client_authentication = 'true'
            } `
        -Credential USER).access_token
    

    Substitua os seguintes valores:

    • ADFS_DOMAIN: nome de domínio público do servidor do AD FS ou farm.
    • CLIENT_ID: ID do cliente do registro do aplicativo no AD FS.
    • RELYING_PARTY_ID: identificador de parte confiável que você usou ao criar um aplicativo de API da Web para o pool de identidade da carga de trabalho no AD FS. Você só precisará desse parâmetro se usar um identificador de parte confiável personalizado.
    • USER: usuário do Active Directory a ser usado para IWA. Se preferir, substitua -Credential por -UseDefaultCredentials para usar suas credenciais atuais.

    SAML

    Consiga uma declaração do seu provedor de identidade externo e inicialize uma variável:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:saml2"
    SUBJECT_TOKEN=ASSERTION
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:saml2"
    $SubjectToken = "ASSERTION"
    

    Em que ASSERTION é a declaração codificada em base64url emitida pelo provedor de identidade externo.

  2. Use a API Security Service Service para trocar a credencial por um token de acesso de curta duração:

    Bash

    STS_TOKEN=$(curl -0 -X POST https://sts.googleapis.com/v1/token \
        -H 'Content-Type: text/json; charset=utf-8' \
        -d @- <<EOF | jq -r .access_token
        {
            "audience"           : "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID",
            "grantType"          : "urn:ietf:params:oauth:grant-type:token-exchange",
            "requestedTokenType" : "urn:ietf:params:oauth:token-type:access_token",
            "scope"              : "https://www.googleapis.com/auth/cloud-platform",
            "subjectTokenType"   : "$SUBJECT_TOKEN_TYPE",
            "subjectToken"       : "$SUBJECT_TOKEN"
        }
    EOF
    )
    echo $STS_TOKEN
    

    PowerShell

    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
    $StsToken = (Invoke-RestMethod `
        -Method POST `
        -Uri "https://sts.googleapis.com/v1/token" `
        -ContentType "application/json" `
        -Body (@{
            "audience"           = "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID"
            "grantType"          = "urn:ietf:params:oauth:grant-type:token-exchange"
            "requestedTokenType" = "urn:ietf:params:oauth:token-type:access_token"
            "scope"              = "https://www.googleapis.com/auth/cloud-platform"
            "subjectTokenType"   = $SubjectTokenType
            "subjectToken"       = $SubjectToken
        } | ConvertTo-Json)).access_token
    Write-Host $StsToken
    

    Substitua os seguintes valores:

    • PROJECT_NUMBER: o número do projeto que contém o pool de identidade da carga de trabalho
    • POOL_ID: ID do pool de identidades da carga de trabalho
    • PROVIDER_ID: ID do provedor do pool de identidades de carga de trabalho
  3. Use o token do Security Token Service para invocar o método generateAccessToken da API IAM Service Account Credentials para receber um acesso. token:

    Bash

    ACCESS_TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken \
        -H "Content-Type: text/json; charset=utf-8" \
        -H "Authorization: Bearer $STS_TOKEN" \
        -d @- <<EOF | jq -r .accessToken
        {
            "scope": [ "https://www.googleapis.com/auth/cloud-platform" ]
        }
    EOF
    )
    echo $ACCESS_TOKEN
    

    PowerShell

    $AccessToken = (Invoke-RestMethod `
        -Method POST `
        -Uri "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken" `
        -Headers @{ "Authorization" = "Bearer $StsToken" } `
        -ContentType "application/json" `
        -Body (@{
            "scope" = , "https://www.googleapis.com/auth/cloud-platform"
        } | ConvertTo-Json)).accessToken
    Write-Host $AccessToken
    

    Substitua SERVICE_ACCOUNT_EMAIL pelo endereço de e-mail da conta de serviço

Verificação de credenciais externas

A API Security Token Service usa as etapas a seguir para validar credenciais emitidas por um provedor de identidade externo.

AWS

  • Verifique os seguintes campos no token GetCallerIdentity:

    • O url precisa ser um URI HTTPS com um nome de host igual a sts.amazonaws.com (ou subdomínio regional) e nenhuma porta. Exatamente os seguintes parâmetros de consulta estão presentes:
      • action = getcalleridentity
      • version (qualquer valor)
    • O method é POST
    • Exatamente os seguintes headers estão presentes: x-amz-date, authorization, host, x-goog-cloud-target-resource, x-amz-security-token (opcional)
      • O valor de x-goog-cloud-target-resource é o nome do recurso para o provedor do pool de identidades de carga de trabalho.
      • O valor de x-amz-date está no máximo 15 minutos no passado e não no futuro.
  • Execute a solicitação em sts.amazonaws.com ou no subdomínio regional relevante e verifique se o resultado foi bem-sucedido e se o ID da conta da AWS corresponde ao ID da conta configurada para o provedor de pool de identidade da carga de trabalho.

Azure

Os tokens do Azure são do tipo OIDC e verificados da mesma forma que os tokens do OIDC.

Ações do GitHub

Os tokens do GitHub são tokens OIDC e verificados da mesma forma que os tokens OIDC.

OIDC

Os tokens OIDC são verificados de acordo com a especificação OIDC. Especificamente, o Security Token Service executa as seguintes etapas:

  • Verificação de assinatura e documento de descoberta:

    • Crie o URI do endpoint de descoberta anexando /.well-known/openid-configuration ao emissor configurado no provedor do pool de identidade da carga de trabalho e busque o documento de descoberta do OIDC.
    • Verifique se a declaração issuer no documento de descoberta é igual ao emissor configurado no provedor de pool de identidade da carga de trabalho. O STS tem uma lógica de verificação personalizada para os seguintes emissores que não estão em conformidade com a especificação OIDC:
      • Oracle Cloud (https://*.identity.oraclecloud.com)
      • Microsoft (https://login.microsoftonline.com/common/v2.0, https://login.microsoftonline.com/consumers/v2.0, https://login.microsoftonline.com/organizations/v2.0)
    • Recupere o conjunto de chaves da Web JSON (JWKS) dos jwks_uri listados no documento de descoberta.
    • Se uma declaração kid estiver presente no cabeçalho JWT, verifique a assinatura JWT usando a chave do JWKS com o ID de chave correspondente ou rejeite o token se nenhuma chave correspondente for encontrada. Se nenhuma declaração kid estiver presente no cabeçalho JWT, tente verificar a assinatura JWT usando cada chave listada no JWKS. A assinatura será aceita se for possível usar qualquer chave para verificar a assinatura.
  • Verificação do cabeçalho:

    • Uma declaração alg precisa estar presente e ser igual a RS256 ou ES256.
  • Verificação de payload:

    • Uma declaração iss precisa estar presente e igual à declaração issuer no documento de descoberta. O STS tem lógica de verificação personalizada para os seguintes emissores que não estão em conformidade com a especificação OIDC:
      • Oracle Cloud (https://*.identity.oraclecloud.com)
      • Microsoft (https://login.microsoftonline.com/common/v2.0, https://login.microsoftonline.com/consumers/v2.0, https://login.microsoftonline.com/organizations/v2.0)
    • Uma declaração aud precisa estar presente e ser igual a https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID. Se allowed_audiences alternativo estiver configurado, a declaração aud precisará ser igual a um desses valores.
    • Uma reivindicação exp precisa estar presente e será no futuro
    • Uma reivindicação iat precisa estar presente e no passado
    • O valor de exp precisa ser maior que o valor de iat em até 24 horas.

SAML

  • Decodificar e desmarcar a credencial SAML em base64 em um objeto Response ou Assertion.
  • Se a credencial SAML for desempacotada em um objeto Response, verifique o seguinte:

    • O StatusCode de resposta é igual a urn:oasis:names:tc:SAML:2.0:status:Success.
    • Exatamente um Assertion está presente.
    • Pelo menos um dos Response ou Assertion está assinado. Para cada assinatura, tente verificar a assinatura usando cada certificado X.509 configurado no provedor de pool de identidade da carga de trabalho. A assinatura será aceita se algum dos certificados verificar a assinatura.
    • Se o Response estiver assinado, o Issuer da Response precisará estar presente e ser igual ao ID da entidade do provedor de identidade SAML configurado no provedor de pool de identidade da carga de trabalho. Verifique também se o Format é omitido ou é igual ao urn:oasis:names:tc:SAML:2.0:nameid-format:entity.
  • Se a credencial SAML for desempacotada em um objeto Assertion, verifique o seguinte:

    • O Assertion está assinado. Para cada assinatura, tente verificar a assinatura usando cada certificado X.509 configurado no provedor de pool de identidade da carga de trabalho. A assinatura será aceita se algum dos certificados verificar a assinatura com sucesso.
  • Independentemente de a credencial SAML ter sido desempacotada em um objeto Response ou Assertion, verifique se Assertion contém os seguintes atributos:

    • Um Issuer precisa estar presente e ser igual ao ID de entidade do provedor de identidade SAML configurado no provedor de pool de identidade da carga de trabalho. O Format de Issuer é omitido ou tem um valor igual a urn:oasis:names:tc:SAML:2.0:nameid-format:entity.
    • Um IssueInstant precisa estar presente e ter menos de uma hora no passado.
    • Um Subject precisa estar presente e conter os seguintes atributos:
      • É necessário que haja um NameID.
      • Exatamente um SubjectConfirmation precisa estar presente e ter um Method igual a urn:oasis:names:tc:SAML:2.0:cm:bearer. Um NotOnOrAfter precisa estar presente no SubjectConfirmationData e está no futuro.
      • Um NotBefore não está presente.
    • Um Conditions precisa estar presente e conter os seguintes atributos:
      • Se um NotBefore estiver presente, ele precisa estar no passado.
      • Se um NotOnOrAfter estiver presente, ele precisa estar no futuro.
      • Pelo menos uma AudienceRestriction precisa estar presente. Todos os AudienceRestrictions precisam conter um Audience igual ao nome do recurso do provedor de pool de identidade da carga de trabalho.
    • Pelo menos uma AuthnStatement precisa estar presente.
    • Se houver SessionNotOnOrAfters, todos eles precisarão estar no futuro.

Além das etapas de verificação específicas do protocolo acima, a API Security Token Service verifica se a condição do atributo foi atendida.

A seguir