Emissione di certificati che attestano l'identità di terze parti
Questo tutorial mostra come emettere certificati che attestano un'identità di terze parti utilizzando la riflessione dell'identità e i pool di identità dei workload.
Puoi utilizzare la riflessione dell'identità per creare certificati corrispondenti all'identità verificata di un richiedente del certificato. Utilizzando la riflessione dell'identità, puoi limitare un richiedente di certificati senza privilegi a richiedere solo certificati con un nome alternativo dell'oggetto (SAN) corrispondente all'identità nella sua credenziale.
Obiettivi
Questo tutorial fornisce informazioni su come utilizzare il servizio CA con i pool di identità di carico di lavoro per federare un'identità di terze parti e ottenere un certificato che attesti questa identità.
Prima di iniziare
Prima di iniziare, assicurati di comprendere i seguenti concetti:
- Pool di identità dei workload: i pool di identità dei workload ti consentono di gestire provider di identità di terze parti. Per saperne di più, consulta Gestire i fornitori e i pool di identità del workload.
- Federazione delle identità per i workload: la federazione delle identità per i workload sfrutta i pool di identità per i workload per concedere alle identità di terze parti l'accesso ai servizi Google Cloud. Per ulteriori informazioni, consulta la sezione Federazione di Workload Identity.
- Security Token Service (STS): il servizio Security Token Service ti consente di scambiare le credenziali di terze parti con token proprietari (Google Cloud). Per maggiori informazioni, consulta Security Token Service.
- Riflessione dell'identità: la funzionalità di riflessione dell'identità consente di trasferire l'identità verificata di un richiedente del certificato al certificato richiesto. Per maggiori informazioni, consulta Riflessione dell'identità.
Assicurati di disporre dei seguenti ruoli IAM:
- Per gestire le autorità di certificazione (CA) e i pool di CA e richiedere i certificati, devi disporre del ruolo Gestore operazioni servizio CA (
privateca.caManager
). Per ulteriori informazioni sui ruoli IAM per CA Service, consulta Controllo dell'accesso con IAM. - Per gestire i provider e i pool di identità per i carichi di lavoro, devi disporre del ruolo Workload Identity Pool Admin (
iam.workloadIdentityPoolAdmin
). - Per creare un account di servizio, devi disporre del ruolo Amministratore account di servizio
(
iam.serviceAccountAdmin
).
Per informazioni sulla concessione dei ruoli IAM, consulta Gestire l'accesso a progetti, cartelle e organizzazioni. Puoi concedere i ruoli IAM richiesti a un Account Google, a un account di servizio, a un gruppo Google, a un account Google Workspace o a un dominio Cloud Identity.
Configura un provider e un pool di identità per i carichi di lavoro
Questo tutorial spiega come utilizzare un provider OpenID Connect (OIDC) di Google insieme a un account di servizio per fungere da identità di terze parti. Il fornitore OIDC degli Account Google funge da provider di identità (IdP) di terze parti e l'account di servizio Google Cloud è un'identità di terze parti di esempio affermata da questo IdP.
I pool di identità per i carichi di lavoro supportano una serie di provider di identità, tra cui Microsoft Azure/Active Directory on-premise, AWS e provider di identità basati su SAML.
Per configurare un fornitore e un pool di identità per i carichi di lavoro, segui questi passaggi: 1. Per rappresentare un insieme attendibile di identità federate, crea un pool di identità del workload:
```
gcloud iam workload-identity-pools create IDENTITY_POOL_ID --location global --display-name "tutorial-wip"
```
Replace the following:
- <var>IDENTITY_POOL_ID</var>: The unique identifier of the new workload
identity pool.
Crea un provider del pool di identità del workload per il tuo provider di identità di terze parti:
gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID --location global --workload-identity-pool IDENTITY_POOL_ID --display-name "tutorial-oidc" --attribute-mapping "google.subject=assertion.sub" --issuer-uri="https://accounts.google.com"
Sostituisci quanto segue:
- PROVIDER_ID: l'identificatore univoco del provider di identità che vuoi creare nel pool di identità del workload.
Puoi personalizzare i seguenti flag in base al tuo caso d'uso:
attribute-mapping
: questo flag imposta la mappatura tra le rivendicazioni di terze parti e la rivendicazione principale di Google,google.subject
.google.subject
è una mappatura obbligatoria che puoi impostare su qualsiasi affermazione o combinazione di affermazioni utilizzando un'espressione CEL. Per ulteriori informazioni, vedi Definire una mappatura degli attributi e una condizione.issuer-uri
: per i provider OIDC, questo flag è un endpoint accessibile pubblicamente a cui Google si rivolge per la verifica dei token di terze parti. Per saperne di più, consulta Preparare un fornitore di servizi di identità esterno.
Per ulteriori informazioni sulla configurazione di un provider di Workload Identity, consulta Configurare la federazione delle identità di carico di lavoro.
Crea un pool di CA e una CA emittente
Questa sezione spiega come creare un pool di CA e aggiungervi una CA radice. Puoi utilizzare questo pool di CA per emettere certificati che riflettano l'identità. Se vuoi utilizzare un pool di CA e una CA esistenti, puoi saltare questa sezione.
Anziché una CA radice, puoi anche scegliere di creare una CA subordinata. La creazione di una CA principale consente di abbreviare la procedura.
Crea un pool di CA nel livello DevOps:
gcloud privateca pools create CA_POOL_ID --location LOCATION --tier devops
Sostituisci quanto segue:
- CA_POOL_ID: l'ID del pool di CA di CA Service che emette i certificati.
- LOCATION: la posizione del pool di CA.
Per ulteriori informazioni sulla creazione di pool di CA, consulta Creare un pool di CA.
Crea una CA radice:
gcloud privateca roots create CA_ID --pool CA_POOL_ID --location LOCATION --subject "CN=test,O=test-org"
Sostituisci quanto segue:
- CA_ID: l'ID dell'autorità di certificazione che emette i certificati.
- CA_POOL_ID: l'ID del pool di CA di CA Service che emette i certificati.
- LOCATION: la posizione del pool di CA.
Per ulteriori informazioni sulla creazione di una CA radice, consulta Creare una CA radice.
Consenti alle identità federate dal pool di identità del workload di emettere certificati dal pool CA. La riflessione dell'identità richiede il ruolo IAM CA Service Workload Certificate Requester (
roles/privateca.workloadCertificateRequester
) per i richiedenti diCreateCertificate
.Puoi rappresentare i principali del pool di identità del workload in varie granularità, da un singolo soggetto a tutte le identità del pool tra i provider. Per ulteriori informazioni, consulta i principali o gli insiemi di principali disponibili (utilizza la scheda Google Cloud CLI) più adatti al tuo caso d'uso.
gcloud privateca pools add-iam-policy-binding CA_POOL_ID --location LOCATION --role roles/privateca.workloadCertificateRequester --member "principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/*"
Sostituisci quanto segue:
- PROJECT_NUMBER: il numero del progetto in cui hai creato il pool di identità del workload.
Creare un account di servizio che rappresenti un'identità di terze parti
La procedura seguente presuppone che un account di servizio rappresenti una terza parte. Questa sezione mostra come utilizzare l'endpoint IAM
GenerateIdToken
per recuperare un'identità di terze parti sotto forma di
un token OIDC. A seconda del caso d'uso, potresti dover seguire procedure diverse per ottenere il token di identità di terze parti che preferisci.
gcloud iam service-accounts create SERVICE_ACCOUNT
Sostituisci quanto segue:
- SERVICE_ACCOUNT: l'ID dell'account di servizio che rappresenta l'identità di terze parti.
Emettere un certificato che attesta l'identità di terze parti
Prima di iniziare, assicurati di disporre del ruolo IAM Creatore token account di servizio
(roles/iam.serviceAccountTokenCreator
). Questo ruolo IAM è necessario per chiamare l'API GenerateIdToken
.
Per ottenere un certificato che attesti l'identità di terze parti:
Ottieni un token di identità di terze parti dal tuo provider di identità di terze parti.
curl
export ID_TOKEN=`curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json;print(json.load(sys.stdin)['token'])"`
Sostituisci quanto segue:
- PROJECT_ID: l'ID progetto Google Cloud del progetto in cui vuoi creare le risorse.
Librerie client
Per accedere al token di terze parti in modo programmatico, puoi ottenere un token da una credenziale basata su file o da una credenziale basata su URL. Per saperne di più, consulta Eseguire l'autenticazione utilizzando le librerie client, gcloud CLI o Terraform. In questo tutorial seguiamo un flusso di lavoro delle credenziali dell'origine file.
Carica la credenziale in un percorso leggibile dal richiedente del certificato:
curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json; print(json.load(sys.stdin)['token']) > /tmp/oidc_token.txt
Sostituisci quanto segue:
- PROJECT_ID: l'ID del progetto in cui vuoi creare le risorse.
Scambia il token di terze parti con un token OAuth federato utilizzando l'endpoint STS
token
:curl
export STS_TOKEN=`curl -L -X POST 'https://sts.googleapis.com/v1/token' -H 'Content-Type: application/json' \ -d '{ "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange", "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID", "requested_token_type": "urn:ietf:params:oauth:token-type:access_token", "scope": "https://www.googleapis.com/auth/cloud-platform", "subject_token": "'$ID_TOKEN'", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt" }' | python3 -c "import sys;import json; print(json.load(sys.stdin)['access_token'])"`
Librerie client
- Crea un file di configurazione delle credenziali denominato
oidc_token.txt
che il codice di richiesta del certificato possa leggere per eseguire uno scambio di token.
gcloud iam workload-identity-pools create-cred-config projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID --output-file=/tmp/cred_config.json --credential-source-file=/tmp/oidc_token.txt
- Leggi il file
oidc_token.txt
per impostare il meccanismo di autorizzazione nella biblioteca del client:
python
import json from google.auth import identity_pool with open('/tmp/cred_config.json', 'r') as f: json_config_info = json.loads(f.read()) credentials = identity_pool.Credentials.from_info(json_config_info) scoped_credentials = credentials.with_scopes( ['https://www.googleapis.com/auth/cloud-platform'])
- Crea un file di configurazione delle credenziali denominato
Invia una richiesta al servizio CA con la modalità di richiesta dell'oggetto
REFLECTED_SPIFFE
:curl
(Facoltativo) Se non hai un CSR, creane uno eseguendo il seguente comando.
export TUTORIAL_CSR=$(openssl req -newkey rsa:2048 -nodes -subj / -keyout tutorial_do_not_use.key)
Richiedi un certificato con la CSR, una durata e una modalità di richiesta del soggetto riflessa:
curl -H "Authorization: Bearer $(echo $STS_TOKEN)" https://privateca.googleapis.com/v1/projects/PROJECT_NUMBER/locations/LOCATION/caPools/CA_POOL_ID/certificates\?alt\=json -X POST -H "Content-Type: application/json" -H 'Accept: application/json' --data '{"lifetime": "100s", "pemCsr": "'$TUTORIAL_CSR'", "subjectMode": "REFLECTED_SPIFFE"}'
Librerie client
Per inoltrare il token proprietario al servizio CA, devi creare un client con credenziali. Puoi quindi utilizzare questo client con credenziali per effettuare richieste di certificato:
Avvia un client CA Service con credenziali:
python
caServiceClient = privateca_v1.CertificateAuthorityServiceClient(credentials=scoped_credentials)
Richiedi un certificato.
Python
Per autenticarti al servizio CA, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Verifica il certificato. Il certificato deve avere un oggetto contenente un singolo URI SAN. Il SAN che attesta un'identità è nel seguente formato:
spiffe://IDENTITY_POOL_ID.PROJECT_NUMBER.global.workload.id.goog/subject/<oidc_subject_number>
Sostituisci:
- IDENTITY_POOL_ID: l'identificatore univoco del pool di identità del workload.
- PROJECT_NUMBER: il numero del progetto in cui hai creato il pool di identità del workload.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse del servizio CA che hai creato seguendo questo documento, esegui le seguenti operazioni utilizzando Google Cloud CLI:
Elimina la CA che hai creato.
Disabilita la CA:
gcloud privateca roots disable CA_ID --pool CA_POOL_ID --location LOCATION
Sostituisci:
- CA_ID: l'identificatore univoco della CA.
- CA_POOL_ID: l'identificatore univoco del pool di CA.
- LOCATION: la posizione del pool di CA.
Elimina la CA:
gcloud privateca roots delete CA_ID --pool CA_POOL_ID --location LOCATION --ignore-active-certificates
Sostituisci:
- CA_ID: l'identificatore univoco della CA.
- CA_POOL_ID: l'identificatore univoco del pool di CA.
- LOCATION: la posizione del pool di CA.
Elimina il pool di CA che hai creato.
gcloud privateca pools delete CA_POOL_ID --location LOCATION
Sostituisci:
- CA_POOL_ID: l'identificatore univoco del pool di CA.
- LOCATION: la posizione del pool di CA.
Per ulteriori informazioni sul comando
gcloud privateca pools delete
, consulta gcloud privateca pools delete.Elimina il pool di identità del workload che hai creato:
gcloud iam workload-identity-pools delete IDENTITY_POOL_ID --location global
Sostituisci:
- IDENTITY_POOL_ID: l'identificatore univoco del pool di identità del workload.
Elimina l'account di servizio che hai creato:
gcloud iam service-accounts delete SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com
Sostituisci:
- SERVICE_ACCOUNT: l'identificatore univoco del pool di identità del workload.
- PROJECT_ID: il progetto proprietario dell'account di servizio.
Il ruolo IAM CA Service Workload Certificate Requester (privateca.workloadCertificateRequester
) limita l'oggetto del certificato emesso solo all'identità del richiedente. Assicurati che agli utenti o ai carichi di lavoro che utilizzano la funzionalità di riflessione dell'identità venga concesso solo il ruolo IAM CA Service Workload Certificate Requester (privateca.workloadCertificateRequester
). Per rispettare il principio del privilegio minimo, puoi evitare di concedere il ruolo IAM Richiedente certificato servizio CA (privateca.certificateRequester
).
Passaggi successivi
- Scopri i vari controlli delle norme che ti consentono di controllare le proprietà del certificato richiesto oltre a un'identità riflessa.
- Scopri come configurare e gestire vari controlli dei criteri.