Ativar a Workload Identity Federation no AKS e no EKS

Este tópico explica como ativar a Workload Identity Federation para instalações híbridas do Apigee nas plataformas AKS e EKS.

Para instalações no GKE, siga as instruções em Ativar o Workload Identity no GKE.

Vista geral

A federação de identidades de cargas de trabalho permite que as aplicações executadas fora do Google Cloud se façam passar por uma conta de serviço da Google Cloud Platform através da utilização de credenciais de um fornecedor de identidade externo.

A utilização da federação de identidades de cargas de trabalho pode ajudar a melhorar a segurança, permitindo que as aplicações usem os mecanismos de autenticação fornecidos pelo ambiente externo, e pode ajudar a substituir as chaves de contas de serviço.

Para uma vista geral, consulte o artigo Práticas recomendadas para usar a Workload Identity Federation.

Configure a Workload Identity Federation

Para usar a Workload Identity Federation com o Apigee hybrid, primeiro configure o cluster e, em seguida, aplique a funcionalidade à instalação do Apigee hybrid.

Antes de começar

Estas instruções pressupõem que já configurou a instalação híbrida do Apigee. As contas de serviço da IAM e as contas de serviço do Kubernetes são criadas durante a instalação inicial. Consulte o artigo O panorama geral para ver uma vista geral da instalação do Apigee Hybrid.

Para instalações no AKS, certifique-se de que ativou o emissor do OpenID Connect (OIDC). Tem de ativar esta funcionalidade para que a Workload Identity Federation possa aceder aos metadados do OpenID Connect e ao conjunto de chaves Web JSON (JWKS) para o cluster.

Configure o cluster para usar a Workload Identity Federation.

  1. Verifique se a configuração gcloud atual está definida para o ID do projeto do Google Cloud com o seguinte comando:
    gcloud config get project
  2. Se necessário, defina a configuração gcloud atual:

    gcloud config set project PROJECT_ID
  3. Ative a API Security Token Service:

    Verifique se a API Security Token Service está ativada com o seguinte comando:

    gcloud services list --enabled --project PROJECT_ID | grep sts.googleapis.com

    Se a API não estiver ativada:

    Consola

    Enable the Security Token Service API.

    Enable the API

    Linha de comandos

    Ative a API com o seguinte comando:

    gcloud services enable sts.googleapis.com --project PROJECT_ID
  4. Crie o Workload Identity Pool e o fornecedor.

    Funções necessárias

    Para obter as autorizações de que precisa para configurar a Workload Identity Federation, peça ao seu administrador para lhe conceder as seguintes funções de IAM no projeto:

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

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

    Em alternativa, a função básica de proprietário da IAM (roles/owner) também inclui autorizações para configurar a federação de identidades. Não deve conceder funções básicas num ambiente de produção, mas pode concedê-las num ambiente de desenvolvimento ou teste.

    Para criar um Workload Identity Pool e um fornecedor, faça o seguinte:

    1. Determine o URL do emissor do cluster do AKS:

      AKS

      az aks show -n NAME -g RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv

      Substitua o seguinte:

      • NAME: o nome do cluster.
      • RESOURCE_GROUP: o grupo de recursos do cluster.

      O comando produz o URL do emissor. Vai precisar do URL do emissor num dos seguintes passos.

      Se o comando não devolver um URL do emissor, verifique se ativou a funcionalidade emissor OIDC.

      EKS

      aws eks describe-cluster --name NAME --query "cluster.identity.oidc.issuer" --output text
      

      Substitua NAME pelo nome do cluster.

      O comando produz o URL do emissor. Precisa do URL do emissor num dos seguintes passos.

      Outro Kubernetes

      1. Ligue-se ao cluster do Kubernetes e use `kubectl` para determinar o URL do emissor do cluster:
        kubectl get --raw /.well-known/openid-configuration | jq -r .issuer
        

        Precisa do URL do emissor num dos seguintes passos.

    2. Opcional: se o emissor de OIDC não estiver acessível publicamente, transfira o conjunto de chaves Web JSON (JWKS) do cluster:
      kubectl get --raw /openid/v1/jwks > cluster-jwks.json
      

      Para verificar se o seu fornecedor de OIDC está disponível publicamente, deve conseguir aceder ao URL do fornecedor com um comando CURL e receber uma resposta 200.

    3. Crie um novo Workload Identity Pool:
      gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
                  

      Substitua o seguinte:

      • POOL_ID: o ID exclusivo do conjunto.
      • DISPLAY_NAME: (Opcional) O nome do conjunto.
      • DESCRIPTION: (opcional) Uma descrição do conjunto que escolhe. Esta descrição é apresentada quando concede acesso a identidades agrupadas.

      Por exemplo:

      gcloud iam workload-identity-pools create my-wi-pool --display-name="My workload pool" --description="My workload pool description"
    4. Adicione o cluster como um fornecedor do Workload Identity Pool. Escolha o comando para criar o fornecedor consoante o emissor de OIDC seja acessível publicamente ou não acessível publicamente:

      Acessível publicamente

      Se o emissor de OIDC for acessível publicamente, crie o fornecedor com o seguinte comando:

      gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER" \
        --attribute-mapping="google.subject=assertion.sub"

      Não acessível publicamente

      Se o emissor OIDC não for acessível publicamente, crie o fornecedor com o seguinte comando:

        gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER" \
        --jwks-file="cluster-jwks.json" \
        --attribute-mapping="google.subject=assertion.sub"

      Substitua o seguinte:

      • WORKLOAD_PROVIDER_ID: um ID do fornecedor do Workload Identity Pool exclusivo à sua escolha.
      • POOL_ID: o ID do Workload Identity Pool que criou anteriormente.
      • ISSUER: use o URL do emissor que determinou anteriormente para o URI do emissor .

      attribute-mapping="google.subject=assertion.sub" mapeia o assunto do Kubernetes para o assunto do IAM.

Crie os ficheiros de configuração de credenciais

Para implementar uma carga de trabalho do Kubernetes que possa aceder a Google Cloud recursos, primeiro tem de criar um ficheiro de configuração de credenciais para cada conta de serviço do IAM:

  1. Liste as contas de serviço do IAM (também denominadas "contas de serviço Google") com o seguinte comando:
    gcloud iam service-accounts list --project PROJECT_ID

    Tem de criar os ficheiros de configuração de credenciais para as seguintes contas de serviço do IAM:

    Prod

    Para ambientes de produção:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-cassandra     apigee-cassandra@my_project_id.iam.gserviceaccount.com     False
    apigee-mart          apigee-mart@my_project_id.iam.gserviceaccount.com          False
    apigee-metrics       apigee-metrics@my_project_id.iam.gserviceaccount.com       False
    apigee-runtime       apigee-runtime@my_project_id.iam.gserviceaccount.com       False
    apigee-synchronizer  apigee-synchronizer@my_project_id.iam.gserviceaccount.com  False
    apigee-udca          apigee-udca@my_project_id.iam.gserviceaccount.com          False
    apigee-watcher       apigee-watcher@my_project_id.iam.gserviceaccount.com       False
    

    Não prod

    Para ambientes de não produção:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    
  2. Crie um ficheiro de configuração de credenciais para cada conta de serviço do IAM na lista anterior. Precisa destes ficheiros de configuração de credenciais para configurar o Apigee Hybrid de modo a usar a Workload Identity Federation:

    Código

    gcloud iam workload-identity-pools create-cred-config \
      projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
      --service-account=SERVICE_ACCOUNT_EMAIL \
      --credential-source-file=/var/
      --credential-source-type=text \
      --output-file=SERVICE_ACCOUNT_NAME-credential-configuration.json
      

    Exemplo

    gcloud iam workload-identity-pools create-cred-config \
      projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider \
      --service-account=apigee-cassandra@myhybridporg.iam.gserviceaccount.com \
      --credential-source-file=/var/
      --credential-source-type=text \
      --output-file=apigee-cassandra-credential-configuration.json
      

    Onde:

    • PROJECT_NUMBER: o número do projeto que contém o Workload Identity Pool. Tem de ser o número do projeto e não o ID do projeto.
    • POOL_ID: o ID do Workload Identity Pool
    • WORKLOAD_PROVIDER_ID: o ID do fornecedor do Workload Identity Pool
    • SERVICE_ACCOUNT_EMAIL: endereço de email da conta de serviço, se configurou a sua conta de serviço do Kubernetes para usar a representação da conta de serviço do IAM.

    O ficheiro de configuração de credenciais permite que as [bibliotecas cliente da nuvem](/apis/docs/cloud-client-libraries), a CLI gcloud e o Terraform determinem o seguinte:

    • Onde obter credenciais externas
    • Que Workload Identity Pool e fornecedor usar
    • Que conta de serviço usar como identidade

    Configure o Apigee Hybrid para usar a Workload Identity Federation

    1. Copie ou mova cada ficheiro de saída (SERVICE_ACCOUNT_NAME-credential-configuration.json) para os seguintes diretórios de gráficos (ou subdiretórios dos mesmos). Estes foram os ficheiros que criou no passo Crie os ficheiros de configuração de credenciais.

      Prod

      Conta de serviço Diretório do gráfico Helm do Apigee
      apigee-cassandra apigee-datastore/
      apigee-mart apigee-org/
      apigee-metrics apigee-telemetry/
      apigee-runtime apigee-env/
      apigee-synchronizer apigee-env/
      apigee-udca apigee-org/
      apigee-env/
      apigee-watcher apigee-org/

      Não prod

      Conta de serviço Gráfico Helm do Apigee
      apigee-non-prod apigee-datastore/
      apigee-telemetry/
      apigee-org/
      apigee-env/
    2. Faça as seguintes alterações globais ao ficheiro de substituições do cluster:

      Código

      gcp:
        workloadIdentity:
          enabled: false # must be set to false to use Workload Identity Federation
        federatedWorkloadIdentity:
          enabled: true
          audience: "AUDIENCE"
          credentialSourceFile: "/var/run/service-account/token"
      

      Exemplo

      gcp:
        workloadIdentity:
          enabled: false
        federatedWorkloadIdentity:
          enabled: true
          audience: "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider"
          credentialSourceFile: "/var/run/service-account/token"
      

      Onde: AUDIENCE é o público-alvo permitido do fornecedor de Workload Identity. Pode encontrar o valor pesquisando qualquer um dos ficheiros de configuração de credenciais pelo termo audience: . O valor do público-alvo é o mesmo em cada ficheiro de configuração de credenciais.

      Por exemplo, no seguinte ficheiro apigee-udca-credential-configuration.json de amostra:

      {
        "universe_domain": "googleapis.com",
        "type": "external_account:,"
        "audience": "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider",
        "subject_token_type": "urn:ietf:params:oauth: token-type:jwt",
        "token_url": "https://sts.googleapis.com/v1/token",
        "service
        "impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/apigee-udca@myhybridproject.iam.gserviceaccount.com:generateAccessToken",
        "credential_source": {
          "file": "/var/run/service-account/token",
          "format": {
            "type": "text"
          }
        }
      }

      O valor do público-alvo é //iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider.

    3. Configure as substituições para cada componente através da Workload Identity Federation. Selecione as instruções para ficheiros CERT, segredos do Kubernetes ou Vault, conforme adequado para a sua instalação.

      Ficheiro de certificação

      Substitua o valor de serviceAccountPath pelo ficheiro de origem das credenciais da conta de serviço do IAM correspondente. Este tem de ser o caminho relativo ao diretório do gráfico. Por exemplo:

      envs:
      - name: ENVIRONMENT_NAME
        serviceAccountPaths:
          synchronizer: apigee-synchronizer-credential-configuration.json
          runtime: apigee-runtime-credential-configuration.json
          udca: apigee-udca-credential-configuration.json
      
      mart:
        serviceAccountPath: apigee-mart-credential-configuration.json
      
      connectAgent:
        serviceAccountPath: apigee-mart-credential-configuration.json
      
      metrics:
        serviceAccountPath: apigee-metrics-credential-configuration.json
      
      udca:
        serviceAccountPath: apigee-udca-credential-configuration.json
      
      watcher:
        serviceAccountPath: apigee-watcher-credential-configuration.json
      

      Segredo do K8s

      1. Crie um novo segredo do Kubernetes com o ficheiro de origem das credenciais para cada ficheiro de configuração das credenciais.
        kubectl create secret -n APIGEE_NAMESPACE generic SECRET_NAME --from-file="client_secret.json=CREDENTIAL_CONFIGURATION_FILE"

        Por exemplo:

        kubectl create secret -n apigee generic udca-workoad-identity-secret --from-file="client_secret.json=./apigee-udca-credential-configuration.json"
      2. Substitua o valor de serviceAccountRef pelo novo segredo. Por exemplo:
        udca:
          serviceAccountRef: udca-workoad-identity-secret
        

      Vault

      Atualize a chave da conta de serviço SAKEY para cada conta de serviço no Vault com o ficheiro de origem das credenciais correspondente. O procedimento é semelhante para todos os componentes. Por exemplo, para UDCA:

      SAKEY=$(cat .apigee-udca-credential-configuration.json); kubectl -n APIGEE_NAMESPACE exec vault-0 -- vault kv patch secret/apigee/orgsakeys udca="$SAKEY"

      Consulte Storing service account keys in Hashicorp Vault para mais informações.

    4. Aplique as alterações a cada componente afetado com o comando helm upgrade:

      Se atualizou as chaves da conta de serviço do Vault, atualize o gráfico apigee-operator.

      helm upgrade operator apigee-operator/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      

      Atualize os restantes tops afetados pela seguinte ordem:

      helm upgrade datastore apigee-datastore/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      
      helm upgrade telemetry apigee-telemetry/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      
      helm upgrade $ORG_NAME apigee-org/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      

      Atualize o gráfico apigee-env para cada ambiente, substituindo $ENV_RELEASE_NAME e ENV_NAME de cada vez:

      helm upgrade $ENV_RELEASE_NAME apigee-env/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        --set env=$ENV_NAME \
        -f overrides.yaml
      

      Consulte a referência do Helm do Apigee hybrid para ver uma lista de componentes e os respetivos gráficos.

    Conceda o acesso às contas de serviço do Kubernetes

    1. Liste as contas de serviço do Kubernetes com o seguinte comando:
      kubectl get sa -n APIGEE_NAMESPACE
    2. Conceda às contas de serviço do Kubernetes acesso para usar a identidade das contas de serviço do IAM associadas, conforme mostrado na tabela seguinte. A tabela mostra os nomes das contas de serviço da IAM do Apigee predefinidas. Se estiver a usar nomes de contas de serviço personalizados, use as contas de serviço do IAM correspondentes:
      Contas de serviço do Kubernetes Conta de serviço do IAM
      Contas de serviço do Kubernetes ao nível da organização
      apigee-connect-agent-ORG_NAME-ORG_HASH_ID apigee-mart
      apigee-mart-ORG_NAME-ORG_HASH_ID apigee-mart
      apigee-metrics-apigee-telemetry apigee-metrics
      apigee-open-telemetry-collector-apigee-telemetry apigee-metrics
      apigee-udca-ORG_NAME-ORG_HASH_ID apigee-udca
      apigee-watcher-ORG_NAME-ORG_HASH_ID apigee-watcher
      Contas de serviço do Kubernetes ao nível do ambiente
      apigee-runtime-ORG_NAME-ENV_NAME-ENV_HASH_ID apigee-runtime
      apigee-synchronizer-ORG_NAME-ENV_NAME-ENV_HASH_ID apigee-synchronizer
      Cópia de segurança e restauro do Cassandra (se ativado)
      apigee-cassandra-backup-sa apigee-cassandra
      apigee-cassandra-restore-sa apigee-cassandra

      Onde:

      • ORG_NAME: os primeiros 15 carateres do nome da sua organização.
      • ORG_HASH_ID: um ID hash exclusivo do nome completo da sua organização.
      • ENV_NAME: os primeiros 15 carateres do nome do seu ambiente.
      • ENV_HASH_ID: um ID hash exclusivo dos nomes da sua organização e ambiente.

      Por exemplo:

      • apigee-connect-agent-myhybridorg-123abcd
      • apigee-runtime-myhybridorg-prodenv-234bcde

      Conceda a cada conta de serviço do Kubernetes acesso para usar a identidade da conta de serviço do IAM adequada com o seguinte comando:

      gcloud iam service-accounts add-iam-policy-binding \
        IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MAPPED_SUBJECT" \
          --role=roles/iam.workloadIdentityUser

      Onde:

      • IAM_SA_NAME: o nome da conta de serviço.
      • PROJECT_ID: o ID do projeto associado à organização do Apigee.
      • PROJECT_NUMBER: o número do projeto do projeto onde criou o Workload Identity Pool.
      • POOL_ID: o ID do Workload Identity Pool.
      • MAPPED_SUBJECT: a ServiceAccount do Kubernetes da reivindicação no seu token de ID que mapeou para google.subject. Por exemplo, se mapeou google.subject=assertions.sub e o seu token de ID contiver "sub": "system:serviceaccount:default:my-kubernetes-serviceaccount", então MAPPED_SUBJECT é system:serviceaccount:default:my-kubernetes-serviceaccount.

    Para mais informações sobre a Workload Identity Federation e as práticas recomendadas, consulte o artigo Práticas recomendadas para usar a Workload Identity Federation.