Questo tutorial descrive come utilizzare la federazione delle identità per i carichi di lavoro per l'autenticazione carichi di lavoro esterni a Google Cloud per poter accedere ai microservizi ospitati da Cloud Run. Questo tutorial è rivolto agli amministratori che vogliono integrare la federazione delle identità per i carichi di lavoro con il loro provider di identità (IdP) esistente. Federazione delle identità per i carichi di lavoro di connettere carichi di lavoro esterni a carichi di lavoro eseguiti in Google Cloud. Cloud Run ti consente di eseguire microservizi containerizzati stateless.
Questo tutorial fornisce istruzioni su come configurare Jenkins come carico di lavoro esterno, Keycloak come provider di identità, Cloud Run e la federazione Workload Identity. Al termine di questo tutorial, potrai scoprire come la federazione Workload Identity ti consente di autenticare l'applicazione Jenkins con Google Cloud utilizzando l'autenticazione OpenID Connect.
Autenticazione dei carichi di lavoro esterni con la federazione delle identità per i carichi di lavoro
La federazione Workload Identity ti consente di autenticare i carichi di lavoro esterni a Google Cloud senza utilizzare una chiave dell'account di servizio statica. Qualsiasi carico di lavoro esterno che deve utilizzare i servizi in Google Cloud può trarre vantaggio da questa funzionalità.
La federazione delle identità per i carichi di lavoro consente di utilizzare l'IdP per eseguire l'autenticazione direttamente con in Google Cloud. Per l'autenticazione, usi OpenID Connect. Cloud Run accetta token OpenID Connect dal tuo IdP per autenticazione.
La procedura di autenticazione quando si utilizza la federazione delle identità per i carichi di lavoro è la seguente:
- La libreria di autenticazione (AUTHN) invia una richiesta di token web JSON (JWT) all'IDP.
- L'IdP firma i token web JSON (JWT). La libreria AUTHN legge questo dati da una variabile.
- La libreria invia un comando POST al Security Token Service che include il token firmato.
- Il servizio token di sicurezza esamina il provider del pool di identità per i carichi di lavoro che hai configurato per stabilire la fiducia e verifica l'identità nella credenziale.
- Il servizio token di sicurezza restituisce un token federato.
- La libreria invia il token a IAM.
- IAM scambia il token con un token OpenID Connect di un account di servizio. Per ulteriori informazioni, vedi Generazione di token ID OpenID Connect.
- La libreria fornisce il token OpenID Connect a Jenkins.
- Jenkins utilizza questo token per autenticarsi a Cloud Run.
Il seguente diagramma illustra il flusso di autenticazione:
Obiettivi
- Configura Jenkins come carico di lavoro esterno.
- Configura Keycloak come provider di identità compatibile con OpenID Connect.
- Collegare Jenkins a Keycloak.
- Installa le librerie client di Cloud per ottenere il token JWT da Keycloak a Google Cloud.
- Collega Google Cloud a Keycloak e Jenkins.
- Ottieni il JWT per l'utente autenticato da Keycloak.
Anche se questo tutorial utilizza Keycloak, puoi utilizzare qualsiasi provider di identità supporta OpenID Connect, ad esempio GitLab, Okta o OneLogin.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.
Prima di iniziare
-
In the Google Cloud console, go to the project selector page.
-
Select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Configura un microservizio su Cloud Run. Per ulteriori informazioni, consulta la guida rapida: esegui il deployment di un container in Cloud Run.
Configura Jenkins
Completa queste attività in un ambiente non Google Cloud, ad esempio il tuo ambiente on-premise o un altro cloud.
Se disponi già di un provider di identità che supporta OpenID Connect e di un carico di lavoro esterno, puoi saltare questo passaggio e andare Installazione delle librerie client di Cloud.
Per simulare un carico di lavoro esterno, puoi utilizzare una VM con Jenkins installato . Puoi eseguire Jenkins come immagine Docker o installarlo direttamente sul tuo server. I passaggi seguenti spiegano come installarlo direttamente sul server web.
- Apri una riga di comando in una VM a tua scelta.
Installa Java:
$ sudo apt update $ sudo apt install openjdk-11-jre $ java -version
Installa Jenkins:
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.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 jenkins
Verifica di poter accedere al server Jenkins sulla porta 8080. Se utilizzi una VM protetta da un firewall, assicurati che le porte appropriate siano aperte.
Ottieni la password di 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 per richiedere un certificato firmato. In alternativa, puoi ottenere una certificato firmato che dura 90 giorni dalla zerossl.com.
Scarica il file ZIP del certificato e trasferiscilo sul tuo server al quale sta eseguendo Jenkins:
scp -i CERTFILE.pem -r CERTFILE.zip VM_FQDN:/home/USERNAME
Sostituisci quanto segue:
CERTFILE
con il nome del certificato che includa la tua chiave pubblica.VM_FQDN
con il nome di dominio completo del tuo server esterno di Google Cloud.USERNAME
con 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.key
Sostituisci
KEYFILE
con il nome del certificato .
Aggiorna il file
/etc/sysconfig/jenkins
:Apri il file in un editor di testo:
vi /etc/sysconfig/jenkins
Imposta
JENKINS_PORT
su-1
.Imposta
JENKINS_HTTPS_PORT
su8443
.In fondo al 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:
CERTFILE
con il nome file del certificato in formato .crt.KEYFILE
con il nome file della chiave PKCS.
Riavvia il server Jenkins.
Verifica che la porta 8443 del firewall sia aperta e accedi a Jenkins dalla 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 Gestisci Jenkins > Gestisci plug-in.
Seleziona Available (Disponibile) e cerca il plug-in che preferisci. La il seguente screenshot mostra il Gestore plug-in con la scheda Available selezionato.
Installa il plug-in.
Configura Keycloak
In questo tutorial, Keycloak gestisce gli utenti, i gruppi e i ruoli. Il keycloak utilizza reami per gestire gli utenti.
Installa Keycloak sulla VM in esecuzione al di fuori di Google Cloud server web. Per questo tutorial, ti consigliamo installazione di Keycloak da un container Docker.
Apri la Console di amministrazione Keycloak.
Vai a Impostazioni area di autenticazione.
Nella scheda Generale, verifica che i campi siano impostati come segue:
- Attivato: ON
- Accesso gestito dall'utente: OFF
- Endpoint: Configurazione endpoint OpenID e Metadati del fornitore di identità SAML 2.0
Il seguente screenshot mostra i campi da configurare.
Crea un client in modo da avere un'entità che possa richiedere Keycloak a autenticare un utente. Spesso i client sono applicazioni e servizi che utilizzano Keycloak per fornire una soluzione di Single Sign-On (SSO).
- Nella console di amministrazione Keycloak, fai clic su Client > Crea.
Inserisci quanto segue:
- ID cliente: jenkins
- Protocollo client: openid-connect
- URL di base: http://JENKINS_IP_ADDRESS:8080, dove JENKINS_IP_ADDRESS è l'indirizzo IP il 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 Groups > (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 di Keycloak, fai clic su Gestisci utente > Aggiungi utenti.
Inserisci le informazioni utente e fai clic su Salva.
Lo screenshot seguente mostra informazioni di esempio per un account utente.
Fai clic sulla scheda Credenziali e verifica che l'opzione Temporanea sia impostata su Disattivata.
Reimposta la password.
Utilizzerai questo account in un secondo momento nel JWT per l'autenticazione.
Il seguente screenshot 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.
Configurare Jenkins per la configurazione di OpenID Connect
Questa sezione descrive come configurare il plug-in OpenID Connect per Jenkins.
- Sul server Jenkins, vai a Gestisci Jenkins > Configura sicurezza globale.
In Security Realm, seleziona Keycloak Authentication Plugin. Fai clic su Salva.
Fai clic su Configura sistema.
Nelle impostazioni di Keycloak globale, copia il file JSON di installazione di Keycloak creato in Configura Keycloak. Se devi recuperare di nuovo i dati JSON, svolgi le seguenti operazioni:
Nella Console di amministrazione Keycloak, vai a Clients (Clienti).
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 JSON Keycloak:
{ "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.
Installa le librerie client di Cloud
Per inviare un JWT da Keycloak a Google Cloud, devi installare Librerie client di Cloud sul server Jenkins. Questo tutorial utilizza Python per interagire tramite l'SDK.
Sul server Jenkins, installa Python. 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.8
Installa pip3 per poter scaricare e importare le librerie client di Cloud:
pip3 –version sudo apt update sudo apt install python3-pip pip3 –version
Installa le librerie client di Cloud per Python utilizzando pip3:
pip3 install –upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
Ad 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 tuo server Jenkins. Per istruzioni, vedi Guida rapida: installa gcloud CLI.
Configurare l'ambiente Google Cloud
Questa sezione descrive i passaggi da completare per assicurarti che il tuo ambiente Google Cloud che ospita il contenitore serverless possa connettersi a Jenkins e Keycloak.
In Google Cloud, crea account di servizio in modo che il microservizio su Cloud Run possa accedere autorizzazioni associate. Ad esempio, per creare un account di servizio utilizzando gcloud CLI, esegui queste operazioni:
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 dell'account di servizio predefinito non è una best practice per la sicurezza perché l'account dispone di una vasta gamma di autorizzazioni. Pertanto, consigliamo creando un account di servizio separato per il microservizio. Per le istruzioni su come creare un account di servizio per Cloud Run, consulta Creare e gestire gli account di servizio.
Crea un pool di identità per i carichi di lavoro. 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 provider di pool di identità per i carichi di lavoro 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_ENDPOINT
con una variabile contiene il link all'endpoint OIDC Keycloak. Per trovare questo link, nella Nella finestra Realm della console di amministrazione KeyCloud, 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
Scarica il token in un file di testo sulla VM che esegue Keycloak. Ad esempio, su Linux, esegui quanto segue:
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.txt
Sostituisci quanto segue:
IP_FOR_KEYCLOAK
con l'IP del server Keycloak .CLIENT_SECRET
con il client secret di Keycloak.USERNAME
con un utente Keycloak.PASSWORD
con la password per l'utente Keycloak.
Questo comando include l'ID client, il client secret, il nome utente e password. Come best practice per la sicurezza, consigliamo di utilizzare le variabili di ambiente per mascherare questi valori anziché la riga di comando. Il comando example reindirizza le credenziali a un file denominato
token.txt
.Facoltativamente, per automatizzare questo passaggio, puoi creare uno script bash.
Convalida il token in jwt.io.
Nella 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.txt
Per ulteriori informazioni, vedi 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 del progetto.Sulla VM, imposta il file
sts.creds.json
come variabile per ADC:export GOOGLE_APPLICATION_CREDENTIALS=/Users/USERNAME/sts-creds.json
Sostituisci USERNAME con il tuo nome utente UNIX.
Prima dell'avvio della federazione delle identità per i carichi di lavoro, questo valore era il servizio chiave dell'account. Con la federazione delle identità per i carichi di lavoro, questo valore corrisponde al valore appena creato.
Crea un'associazione dei ruoli per consentire all'utente di impersonare 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_EMAIL
Sostituisci quanto segue:
SERVICE_ACCOUNT
con l'indirizzo email dell'account di servizio che hai creato in Configurare l'ambiente Google Cloud. Per ulteriori informazioni, vedi gcloud iam service-accounts add-iam-policy-binding.USER_EMAIL
con il tuo indirizzo email.
Consenti all'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_NAME
con il nome del microservizio in esecuzione su Cloud Run.SERVICE_ACCOUNT
con l'indirizzo email dell'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' 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_FQDN
con il nome di dominio completo per il carico di lavoro.SERVICE_ACCOUNT
con l'indirizzo email del l'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 invocare il servizio Cloud Run.
Puoi utilizzare il token all'interno di una pipeline Jenkins per richiamare il contenitore 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 Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, puoi eliminare il progetto.
Elimina il progetto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Passaggi successivi
- Scopri di più sulla federazione di Workload Identity.
- Per altre architetture di riferimento, diagrammi e best practice, visita il Centro architetture di Google Cloud.