Questo tutorial descrive come utilizzare la federazione delle identità per i workload per autenticare i workload eseguiti al di fuori di Cloud de Confiance by S3NS in modo che possano accedere ai microservizi ospitati da Cloud Run. Questo tutorial è destinato agli amministratori che vogliono integrare la federazione delle identità del workload con il loro provider di identità (IdP) esistente. La federazione delle identità per i workload consente di connettere i workload esterni ai workload eseguiti in Cloud de Confiance by S3NS. Cloud Run consente di eseguire microservizi stateless containerizzati.
Questo tutorial fornisce istruzioni su come configurare Jenkins come workload esterno, Keycloak come IdP, Cloud Run e la federazione delle identità per i workload. Al termine di questo tutorial, potrai vedere in che modo la federazione delle identità per i carichi di lavoro ti consente di autenticare l'applicazione Jenkins con Cloud de Confiance utilizzando l'autenticazione OpenID Connect.
Autenticazione dei workload esterni tramite la federazione delle identità per i workload
La federazione delle identità per i workload consente di autenticare i workload al di fuori di Cloud de Confiance senza utilizzare una chiave statica del account di servizio. Qualsiasi workload esterno che deve utilizzare i servizi inCloud de Confiance può trarre vantaggio da questa funzionalità.
La federazione delle identità per i workload ti consente di utilizzare il tuo IdP per l'autenticazione diretta con Cloud de Confiance. Per l'autenticazione, utilizzi OpenID Connect. Cloud Run accetta i token OpenID Connect dal tuo IdP per l'autenticazione.
La procedura di autenticazione quando utilizzi la federazione delle identità per i workload è la seguente:
- La libreria di autenticazione (AUTHN) invia una richiesta di token web JSON (JWT) al provider di identità.
- Il tuo IdP firma i token web JSON (JWT). La libreria AUTHN legge questi dati da una variabile.
- La libreria invia un comando POST al servizio token di sicurezza che include il token firmato.
- Il servizio token di sicurezza esamina il fornitore del pool di identità del workload che hai configurato per creare attendibilità e verifica l'identità sulla credenziale.
- Il servizio token di sicurezza restituisce un token di accesso federato.
- La libreria invia il token di accesso federato a IAM.
- IAM scambia il token di accesso federato con un token ID. Per maggiori informazioni, consulta Creare un token ID OpenID Connect (OIDC).
- La libreria fornisce il token ID a Jenkins.
- Jenkins utilizza questo token per autenticarsi con Cloud Run.
Il seguente diagramma mostra il flusso di autenticazione:
Obiettivi
- Configura Jenkins come workload esterno.
- Configura Keycloak come IdP compatibile con OpenID Connect.
- Collega Jenkins a Keycloak.
- Installa le librerie client di Cloud per ottenere il token JWT da Keycloak a Cloud de Confiance.
- Connettiti Cloud de Confiance a Keycloak e Jenkins.
- Ottieni il JWT per l'utente autenticato da Keycloak.
Sebbene questo tutorial utilizzi Keycloak, puoi utilizzare qualsiasi provider di identità che supporti OpenID Connect, come GitLab, Okta o OneLogin.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Cloud de Confiance by S3NS:
Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.
Prima di iniziare
-
Nella console Cloud de Confiance , vai alla pagina di selezione del progetto.
-
Seleziona o crea un Cloud de Confiance progetto.
Ruoli richiesti per selezionare o creare un progetto
- Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
-
Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto
(
roles/resourcemanager.projectCreator), che contiene l'autorizzazioneresourcemanager.projects.create. Scopri come concedere i ruoli.
-
Verifica che la fatturazione sia abilitata per il tuo progetto Cloud de Confiance .
- Configura un microservizio su Cloud Run. Per ulteriori informazioni, consulta la guida rapida: esegui il deployment di un container su Cloud Run.
Configura Jenkins
Completa queste attività in un ambiente nonCloud de Confiance , ad esempio il tuo ambiente on-premise o su un altro cloud.
Se hai già un provider di identità che supporta OpenID Connect e un workload esterno, puoi saltare questo passaggio e andare a Installazione delle librerie client Cloud.
Per simulare un workload esterno, puoi utilizzare una VM con Jenkins installato. Puoi eseguire Jenkins come immagine Docker o installarlo direttamente sul server. I seguenti passaggi mostrano come installarlo direttamente sul server.
- Apri una riga di comando su una VM a tua scelta.
Installa Java:
$ sudo apt update $ sudo apt install openjdk-11-jre $ java -versionInstalla Jenkins:
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \ /usr/share/keyrings/jenkins-keyring.asc > /dev/null echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \ https://pkg.jenkins.io/debian-stable binary/ | sudo tee \ /etc/apt/sources.list.d/jenkins.list > /dev/null sudo apt-get update sudo apt-get install jenkinsVerifica di poter accedere al server Jenkins sulla porta 8080. Se utilizzi una VM che si trova dietro un firewall, assicurati che le porte appropriate siano aperte.
Recupera la password amministratore e configura Jenkins. Per istruzioni, vedi Configurazione guidata post-installazione.
Completa le seguenti azioni per configurare SSL:
- Se hai un provider di dominio, puoi utilizzare la sua autorità di certificazione (CA) per richiedere un certificato firmato. In alternativa, puoi ottenere un certificato firmato senza costi valido per 90 giorni da zerossl.com.
Scarica il file ZIP del certificato e trasferiscilo sul server che esegue Jenkins:
scp -i CERTFILE.pem -r CERTFILE.zip VM_FQDN:/home/USERNAMESostituisci quanto segue:
CERTFILEcon il nome del file del certificato che include la tua chiave pubblica.VM_FQDNcon il nome di dominio completo del tuo server al di fuori di Cloud de Confiance.USERNAMEcon il tuo nome utente.
Rinomina i file e genera un file .pkcs12 che Jenkins può utilizzare:
openssl rsa -in KEYFILE.com.key -out KEYFILE.com.keySostituisci
KEYFILEcon il nome del file del certificato.
Aggiorna il file
/etc/sysconfig/jenkins:Apri il file in un editor di testo:
vi /etc/sysconfig/jenkinsImposta
JENKINS_PORTsu-1.Imposta
JENKINS_HTTPS_PORTsu8443.Nella parte inferiore del file, aggiungi i seguenti argomenti:
JENKINS_ARGS="--httpsCertificate=/var/lib/jenkins/.ssl/CERTFILE.crt --httpsPrivateKeys=/var/lib/jenkins/.ssl/KEYFILE.pkcs1.key"Sostituisci quanto segue:
CERTFILEcon il nome del file del certificato utilizzando il formato .crt.KEYFILEcon il nome file della chiave PKCS.
Riavvia il server Jenkins.
Verifica di aver aperto la porta 8443 sul firewall e di accedere a Jenkins sulla porta 8443.
Installa un plug-in Jenkins necessario per integrare Keycloak con Jenkins. Puoi scegliere una delle seguenti opzioni:
Per installare il plug-in:
- Nella dashboard di Jenkins, vai a Manage Jenkins > Manage Plugins (Gestisci Jenkins > Gestisci plug-in).
Seleziona Disponibili e cerca il plug-in che preferisci. Lo screenshot seguente mostra Plugin Manager con la scheda Disponibili selezionata.

Installa il plug-in.
Configura Keycloak
In questo tutorial, Keycloak gestisce utenti, gruppi e ruoli. Keycloak utilizza realm per gestire gli utenti.
Sulla VM in esecuzione all'esterno di Cloud de Confiance, installa il server Keycloak. Per questo tutorial, ti consigliamo di installare Keycloak da un container Docker.
Apri la Console di amministrazione Keycloak.
Vai a Impostazioni del realm.
Nella scheda Generale, verifica che i campi siano impostati come segue:
- Attivato: ON
- Accesso gestito dall'utente: OFF
- Endpoint: Configurazione dell'endpoint OpenID e metadati del provider di identità SAML 2.0
Lo screenshot seguente mostra i campi che devi configurare.

Crea un client in modo da avere un'entità che possa richiedere a Keycloak di autenticare un utente. Spesso, i client sono applicazioni e servizi che utilizzano Keycloak per fornire una soluzione Single Sign-On (SSO).
- Nella console di amministrazione Keycloak, fai clic su Client > Crea.
Inserisci quanto segue:
- ID client: jenkins
- Protocollo client: openid-connect
- URL radice: http://JENKINS_IP_ADDRESS:8080, dove JENKINS_IP_ADDRESS è l'indirizzo IP del tuo server Jenkins.
Lo screenshot seguente mostra i campi che devi configurare.

Fai clic su Salva.
Nella scheda Installazione, verifica che il formato del token sia Keycloak OIDC JSON. Crea una copia di questo token perché ti servirà per completare la configurazione di Jenkins.
Per creare un gruppo di test:
- Nella console di amministrazione Keycloak, fai clic su Gruppi > Nuovo.
- Inserisci un nome per il gruppo e fai clic su Salva.
- Crea un altro gruppo di test. Puoi assegnare ruoli ai tuoi gruppi, ma questo tutorial non li richiede.
Per creare un utente di test da aggiungere al gruppo:
- Nella Console di amministrazione Keycloak, fai clic su Gestisci utente > Aggiungi utenti.
Compila i dati dell'utente e fai clic su Salva.
Lo screenshot seguente mostra un esempio di informazioni per un account utente.

Fai clic sulla scheda Credenziali e verifica che l'opzione Temporaneo sia impostata su Off.
Reimposta la password.
Utilizzerai questo account in un secondo momento nel JWT per l'autenticazione.
Lo screenshot seguente mostra la scheda Credenziali con i campi che devi configurare.

Fai clic sulla scheda Gruppi e seleziona uno dei gruppi che hai creato in precedenza.
Fai clic su Partecipa.
Ripeti questo passaggio per creare altri utenti di test.
Configura Jenkins per la configurazione di OpenID Connect
Questa sezione descrive come configurare il plug-in OpenID Connect per Jenkins.
- Sul server Jenkins, vai a Manage Jenkins (Gestisci Jenkins) > Configure Global Security (Configura sicurezza globale).
Nella sezione Security Realm, seleziona Keycloak Authentication Plugin. Fai clic su Salva.
Fai clic su Configura sistema.
Nelle impostazioni Global Keycloak, copia il JSON di installazione di Keycloak che hai creato in Configura Keycloak. Se devi recuperare di nuovo i dati JSON, completa i seguenti passaggi:
Nella Console di amministrazione Keycloak, vai a Client.
Fai clic sul nome del cliente.
Nella scheda Installazione, fai clic su Opzione formato e seleziona Keycloak OIDC JSON.
Di seguito è riportato un esempio di Keycloak JSON:
{ "realm":"master" "auth-server-url":"AUTHSERVERURL" "ssl-required":"none" "resource":"jenkins" "public-client":true "confidential-port":0 }AUTHSERVERURL è l'URL del tuo server di autenticazione.
Per salvare la configurazione OIDC, fai clic su Salva.
Ora Jenkins può reindirizzare a Keycloak per ottenere le informazioni sull'utente.
Installare le librerie client Cloud
Per inviare un JWT da Keycloak a Cloud de Confiance, devi installare le librerie client Cloud sul server Jenkins. Questo tutorial utilizza Python per interagire con Cloud de Confiance utilizzando l'SDK.
Installa Python sul server Jenkins. I seguenti passaggi mostrano come installare python3:
sudo apt update sudo apt install software-properties-common sudo add-apt-repository ppa:deadsnakes/ppa sudo apt update sudo apt install python3.8Installa pip3 per poter scaricare e importare le librerie client di Cloud:
pip3 –version sudo apt update sudo apt install python3-pip pip3 –versionInstalla le librerie client di Cloud per Python utilizzando pip3:
pip3 install –upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlibAd esempio:
pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib Collecting google-api-python-client Downloading google_api_python_client-2.42.0-py2.py3-none-any.whl (8.3 MB) USERNAME | 8.3 MB 19.9 MB/s Collecting google-auth-httplib2 Downloading google_auth_httplib2-0.1.0-py2.py3-none-any.whl (9.3 MB) Collecting google-auth-oauthlib Downloading google_auth_oauthlib-0.5.1-py2.py3-non-any.whl (19 KB)Sostituisci USERNAME con il tuo nome utente.
Installa Google Cloud CLI sul server Jenkins. Per istruzioni, vedi Guida rapida: installa gcloud CLI.
Configura il tuo Cloud de Confiance ambiente
Questa sezione descrive i passaggi da completare per assicurarti che l'ambienteCloud de Confiance che ospita il contenitore serverless possa connettersi a Jenkins e Keycloak.
In Cloud de Confiance, crea un service account in modo che il microservizio su Cloud Run possa accedere alle autorizzazioni associate. Ad esempio, per creare un account di servizio utilizzando gcloud CLI, procedi nel seguente modo:
gcloud iam service-accounts create cloudrun-oidc \ –-description="cloud run oidc sa" \ –-display-name="cloudrun-oidc"Per impostazione predefinita, Cloud Run crea un account di servizio predefinito. Tuttavia, l'utilizzo del account di servizio predefinito non è una best practice di sicurezza perché l'account dispone di un ampio insieme di autorizzazioni. Pertanto, ti consigliamo di creare un account di servizio separato per il tuo microservizio. Per istruzioni sulla creazione di un account di servizio per Cloud Run, vedi Creazione e gestione dei service account.
Crea un pool di identità del workload. Per creare un pool utilizzando gcloud CLI, esegui questo comando:
gcloud iam workload-identity-pools create cloudrun-oidc-pool \ --location="global" \ —-description="cloudrun-oidc" \ —-display-name="cloudrun-oidc"Crea un fornitore del pool di identità del workload per OpenID Connect:
gcloud iam workload-identity-pools providers create-oidc cloud-run-provider \ --workload-identity-pool="cloudrun-oidc-pool" \ --issuer-uri="VAR_LINK_TO_ENDPOINT" \ --location="global" \ --attribute-mapping ="google.subject=assertion.sub,attribute.isadmin-assertion.isadmin,attribute.aud=assertion.aud" \ --attribute-condition="attribute.isadmin=='true'"Sostituisci
VAR_LINK_TO_ENDPOINTcon una variabile che contiene il link all'endpoint Keycloak OIDC. Per trovare questo link, nella Console di amministrazione KeyCloud, nella finestra Realm, fai clic sulla scheda Generale. L'endpoint deve essere HTTPS, il che significa che devi configurare il server Keycloak con HTTPS.
Ottieni il JWT per l'utente autenticato da Keycloak
Sulla VM che esegue Keycloak, scarica il token in un file di testo. Ad esempio, su Linux esegui questo comando:
curl -L -X POST 'https://IP_FOR_KEYCLOAK:8080/auth/realms/master/protocol/openid-connect/token' -H 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=jenks' \ --data-urlencode 'grant_type=password' \ --data-urlencode 'client_secret=CLIENT_SECRET \ --data-urlencode 'scope=openid' \ --data-urlencode 'username=USERNAME' \ --data-urlencode 'password=PASSWORD' | grep access_token | cut -c18-1490 > token.txtSostituisci quanto segue:
IP_FOR_KEYCLOAKcon l'indirizzo IP del server Keycloak.CLIENT_SECRETcon il client secret di Keycloak.USERNAMEcon un utente Keycloak.PASSWORDcon la password dell'utente Keycloak.
Questo comando include l'ID client, il client secret, il nome utente e la password. Come best practice di sicurezza, consigliamo di utilizzare variabili di ambiente per mascherare questi valori anziché utilizzare la riga di comando. Il comando di esempio reindirizza le credenziali a un file denominato
token.txt.Se vuoi automatizzare questo passaggio, puoi creare uno script bash.
Convalida il token all'indirizzo jwt.io.
Sulla VM, crea il file delle credenziali:
gcloud iam workload-identity-pools create-cred-config \ projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/cloudrun-oidc-pool/providers/cloud-run/provider \ --output-file=sts-creds.json \ --credential-source-file=token.txtPer maggiori informazioni, consulta gcloud iam workload-identity-pools create-cred-config.
Il file di output dovrebbe avere il seguente aspetto:
{ "type": "external_account", "audience": "//iam.google.apis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/cloudrun-oidc-pool/subject/USER_EMAIL", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "credential_source": { "file" "token.txt" } }PROJECT_NUMBERè il numero di progetto.Sulla VM, imposta il file
sts.creds.jsoncome variabile per le credenziali predefinite dell'applicazione:export GOOGLE_APPLICATION_CREDENTIALS=/Users/USERNAME/sts-creds.jsonSostituisci USERNAME con il tuo nome utente UNIX.
Prima del lancio della federazione delle identità per i carichi di lavoro, questo valore era la chiave del service account. Con la federazione delle identità per i carichi di lavoro, questo valore è il file delle credenziali appena creato.
Crea un binding del ruolo per l'utente per rappresentare l'account di servizio:
gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT \ --role roles/iam.workloadIdentityUser \ --member "principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/cloudrun-oidc-pool/subject/USER_EMAILSostituisci quanto segue:
SERVICE_ACCOUNTcon l'indirizzo email dell'account di servizio che hai creato in Configurare l'ambiente Google Cloud. Per saperne di più, consulta gcloud iam service-accounts add-iam-policy-binding.USER_EMAILcon il tuo indirizzo email.
Consenti al account di servizio di accedere al servizio Cloud Run:
gcloud run services add-iam-policy-binding SERVICE_NAME --member-"serviceAccount:SERVICE_ACCOUNT" \ --role="roles/run.invoker"Sostituisci quanto segue:
SERVICE_NAMEcon il nome del microservizio in esecuzione su Cloud Run.SERVICE_ACCOUNTcon l'indirizzo email del account di servizio per Cloud Run.
Per saperne di più, consulta gcloud run services add-iam-policy-binding.
Genera un token ID:
#!/usr/bin/python from google.auth import credentials from google.cloud import iam_credentials_v1 import google.auth import google.oauth2.credentials from google.auth.transport.requests import AuthorizedSession, Request url = "https://WORKLOAD_FQDN" aud = "https://WORKLOAD_FQDN" service_account = 'SERVICE_ACCOUNT' client = iam_credentials_v1.IAMCredentialsClient() name = "projects/-/serviceAccounts/{}".format(service_account) id_token = client.generate_id_token(name=name,audience=aud, include_email=True) print(id_token.token) creds = google.oauth2.credentials.Credentials(id_token.token) authed_session = AuthorizedSession(creds) r = authed_session.get(url) print(r.status_code) print(r.text)Sostituisci quanto segue:
WORKLOAD_FQDNcon il nome di dominio completo del tuo workload.SERVICE_ACCOUNTcon l'indirizzo email del account di servizio per Cloud Run.
Il token che utilizzi può chiamare l'API Identity and Access Management, che ti fornirà il nuovo JWT necessario per richiamare il servizio Cloud Run.
Puoi utilizzare il token all'interno di una pipeline Jenkins per richiamare il container serverless in esecuzione in Cloud Run. Tuttavia, questi passaggi non rientrano nell'ambito di questo tutorial.
Esegui la pulizia
Per evitare che al tuo account Cloud de Confiance vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, puoi eliminare il progetto.
Elimina il progetto
- Nella console Cloud de Confiance , vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona quello che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Passaggi successivi
- Scopri di più sulla federazione delle identità per i workload.
- Per ulteriori architetture di riferimento, diagrammi e best practice, esplora Cloud Architecture Center.