Attivazione della federazione delle identità per i carichi di lavoro su AKS ed EKS

Questo argomento spiega come attivare Workload Identity Federation per le installazioni ibride di Apigee sulle piattaforme AKS ed EKS.

Per le installazioni su GKE, segui le istruzioni riportate in Attivazione di Workload Identity su GKE.

Panoramica

La federazione delle identità dei carichi di lavoro consente alle applicazioni in esecuzione al di fuori di Google Cloud di rappresentare un account di servizio Google Cloud Platform utilizzando le credenziali di un provider di identità esterno.

L'utilizzo della federazione delle identità per i workload può aiutarti a migliorare la sicurezza consentendo alle applicazioni di utilizzare i meccanismi di autenticazione forniti dall'ambiente esterno e può contribuire a sostituire le account di servizio account.

Per una panoramica, consulta Best practice per l'utilizzo della federazione delle identità dei carichi di lavoro.

Configura la federazione delle identità per i workload

Per utilizzare la federazione delle identità per i carichi di lavoro con Apigee hybrid, configura prima il cluster e poi applica la funzionalità all'installazione di Apigee hybrid.

Prima di iniziare

Queste istruzioni presuppongono che tu abbia già configurato l'installazione di Apigee hybrid. I service account IAM e i service account Kubernetes vengono creati durante l'installazione iniziale. Per una panoramica dell'installazione di Apigee hybrid, consulta Il quadro generale.

Per le installazioni su AKS, assicurati di aver attivato l'emittente OpenID Connect (OIDC). Devi abilitare questa funzionalità in modo che la federazione delle identità per i workload possa accedere ai metadati OpenID Connect e al set di chiavi web JSON (JWKS) per il cluster.

Configura il cluster in modo che utilizzi la federazione delle identità per i workload.

  1. Verifica che la configurazione gcloud corrente sia impostata sul tuo ID progetto Google Cloud con il seguente comando:
    gcloud config get project
  2. Se necessario, imposta la configurazione gcloud attuale:

    gcloud config set project PROJECT_ID
  3. Abilita l'API Security Token Service:

    Verifica che l'API Security Token Service sia abilitata con il seguente comando:

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

    Se l'API non è abilitata:

    Console

    Enable the Security Token Service API.

    Enable the API

    Riga di comando

    Abilita l'API con il seguente comando:

    gcloud services enable sts.googleapis.com --project PROJECT_ID
  4. Crea il fornitore e il pool di identità del workload.

    Ruoli obbligatori

    Per ottenere le autorizzazioni necessarie per configurare la federazione delle identità per i carichi di lavoro, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:

    Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

    In alternativa, il ruolo di base Proprietario IAM (roles/owner) include anche le autorizzazioni per configurare la federazione delle identità. Non devi concedere ruoli di base in un ambiente di produzione, ma puoi concederli in un ambiente di sviluppo o test.

    Per creare un fornitore e un pool di identità del workload:

    1. Determina l'URL dell'emittente del tuo cluster AKS:

      AKS

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

      Sostituisci quanto segue:

      • NAME: il nome del cluster.
      • RESOURCE_GROUP: il gruppo di risorse del cluster.

      Il comando restituisce l'URL dell'emittente. Avrai bisogno dell'URL dell'emittente in uno dei passaggi successivi.

      Se il comando non restituisce un URL dell'emittente, verifica di aver attivato la funzionalità Emittente OIDC.

      EKS

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

      Sostituisci NAME con il nome del cluster.

      Il comando restituisce l'URL dell'emittente. L'URL dell'emittente ti servirà in uno dei passaggi successivi.

      Altri strumenti Kubernetes

      1. Connettiti al cluster Kubernetes e utilizza `kubectl` per determinare l'URL dell'emittente del cluster:
        kubectl get --raw /.well-known/openid-configuration | jq -r .issuer
        

        L'URL dell'emittente ti servirà in uno dei passaggi successivi.

    2. (Facoltativo) Se l'emittente OIDC non è accessibile pubblicamente, scarica il set di chiavi web JSON (JWKS) del cluster:
      kubectl get --raw /openid/v1/jwks > cluster-jwks.json
      

      Per verificare se il tuo provider OIDC è disponibile pubblicamente, dovresti essere in grado di accedere al suo URL con un comando CURL e ricevere una risposta 200.

    3. Crea un nuovo pool di identità del workload:
      gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
                  

      Sostituisci quanto segue:

      • POOL_ID: l'ID univoco del pool.
      • DISPLAY_NAME: (facoltativo) Il nome del pool.
      • DESCRIPTION: (facoltativo) una descrizione del pool che scegli. Questa descrizione viene visualizzata quando concedi l'accesso alle identità del pool.

      Ad esempio:

      gcloud iam workload-identity-pools create my-wi-pool --display-name="My workload pool" --description="My workload pool description"
    4. Aggiungi il cluster come provider pool di identità del workload. Scegli il comando per creare il fornitore a seconda che l'emittente OIDC sia accessibile pubblicamente o non accessibile pubblicamente:

      Pubblicamente accessibile

      Se l'emittente OIDC è accessibile pubblicamente, crea il fornitore con il seguente 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"

      Non accessibile pubblicamente

      Se l'emittente OIDC non è accessibile pubblicamente, crea il provider con il seguente 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"

      Sostituisci quanto segue:

      • WORKLOAD_PROVIDER_ID: un ID fornitore del pool di identità del workload univoco a tua scelta.
      • POOL_ID: l'ID del pool di identità del workload che hai creato in precedenza.
      • ISSUER: utilizza l'URL dell'emittente che hai determinato in precedenza per l'URI dell'emittente .

      attribute-mapping="google.subject=assertion.sub" mappa il soggetto Kubernetes al soggetto IAM.

Crea i file di configurazione delle credenziali

Per eseguire il deployment di un carico di lavoro Kubernetes che può accedere alle risorse Google Cloud , devi prima creare un file di configurazione delle credenziali per ogni account di servizio IAM:

  1. Elenca i service account IAM (chiamati anche "service account Google") con il seguente comando:
    gcloud iam service-accounts list --project PROJECT_ID

    Dovrai creare i file di configurazione delle credenziali per i seguenti service account IAM:

    Prod

    Per gli ambienti di produzione:

    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
    

    Non di produzione

    Per gli ambienti non di produzione:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    
  2. Crea un file di configurazione delle credenziali per ogni account di servizio IAM nell'elenco precedente. Per configurare Apigee Hybrid in modo che utilizzi la federazione delle identità per i carichi di lavoro, avrai bisogno di questi file di configurazione delle credenziali:

    Codice

    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
      

    Esempio

    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
      

    Dove:

    • PROJECT_NUMBER: Il numero di progetto del progetto contenente il pool di identità del workload. Deve essere il numero di progetto anziché l'ID progetto.
    • POOL_ID: l'ID del pool di identità del workload
    • WORKLOAD_PROVIDER_ID: l'ID del fornitore del pool di identità del workload
    • SERVICE_ACCOUNT_EMAIL: indirizzo email del account di servizio, se hai configurato il service account Kubernetes per utilizzare la rappresentazione del account di servizio IAM.

    Il file di configurazione delle credenziali consente alle [librerie client Cloud](/apis/docs/cloud-client-libraries), a gcloud CLI e a Terraform di determinare quanto segue:

    • Dove ottenere le credenziali esterne
    • Quale fornitore e pool di identità del workload utilizzare
    • Quale account di servizio rappresentare

    Configura Apigee hybrid per utilizzare la federazione delle identità per i workload

    1. Copia o sposta ogni file di output (SERVICE_ACCOUNT_NAME-credential-configuration.json) nelle seguenti directory dei grafici (o nelle relative sottodirectory). Si tratta dei file che hai creato nel passaggio Crea i file di configurazione delle credenziali.

      Prod

      Service account Directory dei grafici Helm di 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/

      Non di produzione

      Service account Grafico Helm di Apigee
      apigee-non-prod apigee-datastore/
      apigee-telemetry/
      apigee-org/
      apigee-env/
    2. Apporta le seguenti modifiche globali al file di override del cluster:

      Codice

      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"
      

      Esempio

      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"
      

      Dove AUDIENCE è il pubblico consentito del provider di identità del workload. Puoi trovare il valore cercando il termine audience: in uno dei file di configurazione delle credenziali. Il valore del segmento di pubblico è lo stesso in ogni file di configurazione delle credenziali.

      Ad esempio, nel seguente file apigee-udca-credential-configuration.json di esempio:

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

      Il valore del segmento di pubblico è //iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider.

    3. Configura gli override per ogni componente utilizzando la federazione delle identità per i carichi di lavoro. Seleziona le istruzioni per i file di certificato, i secret di Kubernetes o Vault in base alla tua installazione.

      File del certificato

      Sostituisci il valore di serviceAccountPath con il file di origine delle credenziali per il account di servizio IAM corrispondente. Deve essere il percorso relativo alla directory del grafico. Ad esempio:

      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
      

      K8s Secret

      1. Crea un nuovo secret Kubernetes utilizzando il file di origine delle credenziali per ogni file di configurazione delle credenziali.
        kubectl create secret -n APIGEE_NAMESPACE generic SECRET_NAME --from-file="client_secret.json=CREDENTIAL_CONFIGURATION_FILE"

        Ad esempio:

        kubectl create secret -n apigee generic udca-workoad-identity-secret --from-file="client_secret.json=./apigee-udca-credential-configuration.json"
      2. Sostituisci il valore di serviceAccountRef con il nuovo secret. Ad esempio:
        udca:
          serviceAccountRef: udca-workoad-identity-secret
        

      Vault

      Aggiorna la chiave del account di servizio, SAKEY, per ogni account di servizio in Vault con il file di origine delle credenziali corrispondente. La procedura è simile per tutti i componenti. Ad esempio, per l'UDCA:

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

      Per saperne di più, consulta Storing service account keys in Hashicorp Vault.

    4. Applica le modifiche a ogni componente interessato con il comando helm upgrade:

      Se hai aggiornato le chiavi del account di servizio Vault, aggiorna il grafico apigee-operator.

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

      Aggiorna gli altri grafici interessati nel seguente ordine:

      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
      

      Aggiorna il grafico apigee-env per ogni ambiente, sostituendo $ENV_RELEASE_NAME e ENV_NAME ogni volta:

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

      Consulta il riferimento Helm di Apigee hybrid per un elenco dei componenti e dei grafici corrispondenti.

    Concedi l'accesso ai service account Kubernetes

    1. Elenca i service account Kubernetes con questo comando:
      kubectl get sa -n APIGEE_NAMESPACE
    2. Concedi ai service account Kubernetes l'accesso per rappresentare i service account IAM associati, come mostrato nella tabella seguente. La tabella mostra i nomi degli account di servizio IAM Apigee predefiniti. Se utilizzi nomi di account di servizio personalizzati, utilizza i service account IAM corrispondenti:
      Service account Kubernetes Account di servizio IAM
      Service account Kubernetes a livello di organizzazione
      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
      Service account Kubernetes a livello di ambiente
      apigee-runtime-ORG_NAME-ENV_NAME-ENV_HASH_ID apigee-runtime
      apigee-synchronizer-ORG_NAME-ENV_NAME-ENV_HASH_ID apigee-synchronizer
      Backup e ripristino di Cassandra (se abilitati)
      apigee-cassandra-backup-sa apigee-cassandra
      apigee-cassandra-restore-sa apigee-cassandra

      Dove:

      • ORG_NAME: I primi 15 caratteri del nome della tua organizzazione.
      • ORG_HASH_ID: un ID hash univoco del nome completo dell'organizzazione.
      • ENV_NAME: I primi 15 caratteri del nome del tuo ambiente.
      • ENV_HASH_ID: un ID hash univoco dei nomi dell'organizzazione e dell'ambiente.

      Ad esempio:

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

      Concedi a ogni account di servizio Kubernetes l'accesso per rappresentare il account di servizio IAM appropriato con il seguente 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

      Dove:

      • IAM_SA_NAME: il nome del account di servizio.
      • PROJECT_ID: l'ID del progetto associato all'organizzazione Apigee.
      • PROJECT_NUMBER: il numero di progetto del progetto in cui hai creato il pool di identità del workload.
      • POOL_ID: l'ID del pool di identità del workload.
      • MAPPED_SUBJECT: il service account Kubernetes dalla rivendicazione nel token ID che hai mappato a google.subject. Ad esempio, se hai mappato google.subject=assertions.sub e il tuo token ID contiene "sub": "system:serviceaccount:default:my-kubernetes-serviceaccount", allora MAPPED_SUBJECT è system:serviceaccount:default:my-kubernetes-serviceaccount.

    Per ulteriori informazioni sulla federazione delle identità per i workload e sulle best practice, consulta Best practice per l'utilizzo della federazione delle identità per i workload.