Questo argomento spiega come attivare Workload Identity Federation per le installazioni di Apigee hybrid sulle piattaforme AKS ed EKS.
Per le installazioni su GKE, segui le istruzioni riportate in Abilitazione di Workload Identity su GKE.
Panoramica
La federazione delle identità per i carichi di lavoro consente alle applicazioni in esecuzione all'esterno di Google Cloud di rubare l'identità di un account di servizio della piattaforma Google Cloud 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ò aiutarti a sostituire le chiavi degli account di servizio.
Per una panoramica, consulta le best practice per l'utilizzo della federazione delle identità di lavoro.
Configurare la federazione delle identità per i carichi di lavoro
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. Gli account di servizio IAM e gli account di servizio Kubernetes vengono creati durante l'installazione iniziale. Consulta la sezione Panoramica per una panoramica dell'installazione di Apigee hybrid.
Per le installazioni su AKS, assicurati di aver attivato l'emittente OpenID Connect (OIDC). Devi attivare 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 carichi di lavoro.
-
Verifica che la configurazione
gcloud
corrente sia impostata sull'ID progetto Google Cloud con il seguente comando:gcloud config get project
-
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.
Riga di comando
Abilita l'API con il seguente comando:
gcloud services enable sts.googleapis.com --project PROJECT_ID
-
Crea il provider e il pool di identità del workload.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per configurare la federazione di Workload Identity, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
Amministratore di pool di identità di lavoro (
roles/iam.workloadIdentityPoolAdmin
) -
Amministratore account di servizio (
roles/iam.serviceAccountAdmin
)
Per saperne di più sulla concessione dei ruoli, consulta Gestire 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 dovresti concedere ruoli di base in un ambiente di produzione, ma puoi farlo in un ambiente di sviluppo o di test.Per creare un fornitore e un pool di identità del workload:
-
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. L'URL dell'emittente ti servirà in uno dei passaggi successivi.
Se il comando non restituisce un URL 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 è necessario in uno dei passaggi successivi.
Altri Kubernetes
-
Connettiti al tuo 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.
-
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 all'URL del provider con un comando CURL e ricevere una risposta 200.
-
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 scelto. 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"
-
Aggiungi il cluster come provider del pool di identità del workload. Scegli il comando per creare il provider a seconda che l'emittente OIDC sia accessibile pubblicamente o non accessibile pubblicamente:
Pubblicamente accessibile
Se l'emittente OIDC è 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" \ --attribute-mapping="google.subject=assertion.sub"
Non accessibile al pubblico
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 scelto da te.POOL_ID
: l'ID pool di identità del workload 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.
-
Amministratore di pool di identità di lavoro (
Se necessario, imposta la configurazione attuale di gcloud
:
gcloud config set project PROJECT_ID
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:
-
Elenca gli account di servizio IAM (chiamati anche "account di servizio Google") con il seguente comando:
gcloud iam service-accounts list --project PROJECT_ID
Dovrai creare i file di configurazione delle credenziali per i seguenti account di servizio IAM:
Produzione
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 prod
Per gli ambienti non di produzione:
DISPLAY NAME EMAIL DISABLED apigee-non-prod apigee-non-prod@my_project_id.iam.gserviceaccount.com False
-
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à di lavoro, sono necessari 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 del progetto contenente il pool di identità del workload. Deve essere il numero del progetto anziché l'ID progetto. -
POOL_ID
: l'ID del pool di identità del workload -
WORKLOAD_PROVIDER_ID
: l'ID del provider del pool di identità del workload -
SERVICE_ACCOUNT_EMAIL
: indirizzo email dell'account di servizio, se hai configurato il tuo account di servizio Kubernetes per utilizzare l'usurpazione dell'identità dell'account di servizio IAM.
Il file di configurazione delle credenziali consente alle [librerie client Cloud](/apis/docs/cloud-client-libraries), all'interfaccia a riga di comando gcloud e a Terraform di determinare quanto segue:
- Da dove ottenere le credenziali esterne
- Quale provider e pool di identità per i carichi di lavoro utilizzare
- Quale account di servizio rappresentare
Configurare Apigee hybrid per utilizzare la federazione delle identità per i carichi di lavoro
-
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 Creare i file di configurazione delle credenziali.Produzione
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 prod
Service account Grafico Helm di Apigee apigee-non-prod
apigee-datastore/
apigee-telemetry/
apigee-org/
apigee-env/
-
Apporta le seguenti modifiche globali al file delle sostituzioni 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
. -
Configura le sostituzioni per ogni componente utilizzando la federazione delle identità per i carichi di lavoro. Seleziona le istruzioni per i file di certificati, 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 l'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: udca-credential-configuration.json mart: serviceAccountPath: mart-credential-configuration.json connectAgent: serviceAccountPath: mart-credential-configuration.json metrics: serviceAccountPath: metrics-credential-configuration.json udca: serviceAccountPath: UDCA_SERVICE_ACCOUNT_FILEPATH watcher: serviceAccountPath: WATCHER_SERVICE_ACCOUNT_FILEPATH
Secret K8s
-
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"
-
Sostituisci il valore di
serviceAccountRef
con il nuovo secret. Ad esempio:udca: serviceAccountRef: udca-workoad-identity-secret
Vault
Aggiorna la chiave dell'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 UDCA:SAKEY=$(cat .apigee-udca-credential-configuration.json); kubectl -n APIGEE_NAMESPACE exec vault-0 -- vault kv patch secret/apigee/orgsakeys udca="$SAKEY"
Per ulteriori informazioni, visita la pagina
Storing service account keys in Hashicorp Vault
. -
Crea un nuovo secret Kubernetes utilizzando il file di origine delle credenziali per ogni file di configurazione delle credenziali.
-
Applica le modifiche a ogni componente interessato con il comando
helm upgrade
:Se hai aggiornato le chiavi del service account di 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 ogni volta $ENV_RELEASE_NAME e ENV_NAME:helm upgrade $ENV_RELEASE_NAME apigee-env/ \ --namespace APIGEE_NAMESPACE \ --atomic \ --set env=$ENV_NAME \ -f overrides.yaml
Consulta la documentazione di riferimento di Helm per Apigee hybrid per un elenco dei componenti e dei relativi grafici.
Concedi l'accesso agli account di servizio Kubernetes
-
Elenca gli account di servizio Kubernetes con il seguente comando:
kubectl get sa -n APIGEE_NAMESPACE
-
Concedi agli account di servizio Kubernetes l'accesso per rubare l'identità degli account di servizio 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 gli account di servizio IAM corrispondenti:
Account di servizio Kubernetes Service account IAM Account di servizio 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
Account di servizio 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 abilitato) 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 dell'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 rubare l'identità dell'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 dell'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
: l'account di servizio Kubernetes dal claim nel token di identità che hai mappato agoogle.subject
. Ad esempio, se hai mappatogoogle.subject=assertions.sub
e il tuo token ID contiene"sub": "system:serviceaccount:default:my-kubernetes-serviceaccount"
, alloraMAPPED_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.
-