Questo documento spiega come configurare le identità dei carichi di lavoro gestiti per Google Kubernetes Engine (GKE) nei cluster gestiti dai fleet GKE. Inoltre, spiega come eseguire il deployment di un carico di lavoro e verificarne l'identità e il certificato.
La configurazione e l'utilizzo delle identità dei carichi di lavoro gestite per GKE prevede i seguenti passaggi:
Autorizza le identità per i carichi di lavoro gestite a richiedere certificati dal pool di CA.
Esegui il deployment dei carichi di lavoro con identità del carico di lavoro gestite.
Pool di identità del workload gestito da Google
Quando aggiungi i tuoi cluster ai parchi risorse GKE, questi ultimi creano automaticamente un pool di identità dei carichi di lavoro gestito da Google che funge da radice del tuo dominio attendibile. Il pool di identità per i carichi di lavoro gestito da Google presenta i seguenti vincoli:
Google gestisce completamente il pool, pertanto non puoi creare risorse secondarie, come ambiti, identità o provider di identità.
Il pool può essere utilizzato solo per i carichi di lavoro GKE. Non puoi aggiungere altri tipi di carichi di lavoro, come le VM Compute Engine, al pool.
Tutti i cluster del pool sono soggetti al modello di identità dello spazio dei nomi Kubernetes standard. Ciò significa che tutti i cluster del pool sono equiparati ai cluster con privilegi. I carichi di lavoro eseguiti su uno dei cluster del pool possono utilizzare qualsiasi identità al suo interno.
Configurazione per più progetti
Le risorseGoogle Cloud che utilizzi in questo documento, come i cluster GKE, la CA radice e le CA secondarie, possono esistere in progetti separati. Quando fai riferimento a queste risorse, utilizza il flag --project
per specificare il progetto corretto per ogni risorsa.
Prima di iniziare
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
Scopri di più sulle identità dei carichi di lavoro gestiti.
Assicurati di aver creato un cluster GKE.
Aggiungi i tuoi cluster ai parchi risorse GKE. Se il cluster è un cluster Autopilot, ometti
--enable-workload-identity
. Fleets crea automaticamente un pool di identità del workload gestito da Google che funge da dominio attendibile.Abilita i parchi risorse GKE eseguendo il seguente comando:
gcloud container clusters update CLUSTER_NAME \ --enable-workload-identity \ --enable-fleet \ --fleet-project=PROJECT_ID
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del cluster GKE che vuoi registrare nel parco GKEPROJECT_ID
: l'ID progetto che ospita il parco risorse GKE
Enable the IAM and Certificate Authority Service APIs:
gcloud services enable cloudresourcemanager.googleapis.com
iam.googleapis.com privateca.googleapis.com Configura Google Cloud CLI in modo da utilizzare il progetto di fatturazione e quota.
gcloud config set billing/quota_project PROJECT_ID
Sostituisci PROJECT_ID con l'ID del progetto del parco risorse.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per creare identità del workload gestite e eseguire il provisioning dei certificati di identità del workload gestite, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
Per creare e configurare le identità di carico di lavoro gestite:
Amministratore del pool di identità di carico di lavoro IAM (
roles/iam.workloadIdentityPoolAdmin
) -
Per creare e configurare i pool di CA:
Amministratore servizio CA (
roles/privateca.admin
)
Per ulteriori informazioni 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.
Configurare il servizio CA per emettere certificati per le identità per i carichi di lavoro gestiti
Per configurare le identità dei carichi di lavoro gestiti per GKE, devi prima configurare un'autorità di certificazione (CA) e una o più CA secondarie. Questa configurazione è nota come gerarchia CA.
Puoi utilizzare i pool di servizi CA per configurare questa gerarchia. Con questa gerarchia, il pool di CA secondarie emette i certificati di identità del carico di lavoro X.509 per i tuoi carichi di lavoro.
Configura il pool di CA radice
Per creare il pool di CA radice:
Crea il pool di CA radice nel livello Enterprise utilizzando gcloud privateca pools create
.
Questo livello è destinato all'emissione di certificati a lungo termine e a basso volume.
gcloud privateca pools create ROOT_CA_POOL_ID \ --location=REGION \ --project=CA_PROJECT_ID \ --tier=enterprise
Sostituisci quanto segue:
ROOT_CA_POOL_ID
: un ID univoco per il pool di CA principale. L'ID può contenere fino a 64 caratteri e deve contenere solo caratteri alfanumerici minuscoli e maiuscoli, trattini bassi o trattini. L'ID pool deve essere univoco all'interno della regione.REGION
: la regione in cui si trova il pool di CA radice.CA_PROJECT_ID
: l'ID progetto in cui vuoi creare la CA radice.
Per scoprire di più su pool di CA, livelli e regioni, consulta Creare pool di CA.
Configura la CA radice
Crea una CA radice nel pool di CA radice utilizzando gcloud privateca roots create
.
Potrebbe esserti chiesto di attivare la CA radice se è l'unica CA nel pool di CA radice.
Per creare una CA principale, esegui il seguente comando:
gcloud privateca roots create ROOT_CA_ID \ --pool=ROOT_CA_POOL_ID \ --subject="CN=ROOT_CA_CN, O=ROOT_CA_ORGANIZATION" \ --key-algorithm="KEY_ALGORITHM" \ --max-chain-length=1 \ --location=REGION \ --project=CA_PROJECT_ID \ --auto-enable
Sostituisci quanto segue:
ROOT_CA_ID
: un nome univoco per la CA radice. Il nome della CA può avere una lunghezza massima di 64 caratteri e deve contenere solo caratteri alfanumerici minuscoli e maiuscoli, trattini bassi o trattini. Il nome della CA deve essere univoco all'interno della regione.ROOT_CA_POOL_ID
: l'ID del pool di CA radice.ROOT_CA_CN
: il nome comune della CA radice.ROOT_CA_ORGANIZATION
: l'organizzazione della CA principale.KEY_ALGORITHM
: l'algoritmo chiave, ad esempioec-p256-sha256
REGION
: la regione in cui si trova il pool di CA radice.CA_PROJECT_ID
: l'ID progetto in cui hai creato la CA radice.
Per ulteriori informazioni sui campi subject
per la CA, consulta Soggetto.
Se vuoi, puoi creare altre CA radice nel pool di CA radice. Questa operazione può essere utile per la rotazione delle CA principali.
Configura le CA subordinate
Se vuoi, puoi configurare le CA secondarie. La configurazione delle CA subordinate può essere utile per:
Più scenari di rilascio di certificati: se hai più scenari di rilascio di certificati, puoi creare una CA subordinata per ogni scenario.
Miglior bilanciamento del carico: l'aggiunta di più CA subordinate in un pool di CA consente di bilanciare meglio il carico delle richieste di certificato.
Per creare un pool di CA subordinate e una CA subordinata:
Crea il pool di CA subordinate nel livello DevOps, pensato per l'emissione di certificati di breve durata e ad alto volume.
gcloud privateca pools create SUBORDINATE_CA_POOL_ID \ --location=REGION \ --project=CA_PROJECT_ID \ --tier=devops
Sostituisci quanto segue:
SUBORDINATE_CA_POOL_ID
: un ID univoco per il pool di CA secondario. L'ID può contenere fino a 64 caratteri e deve contenere solo caratteri alfanumerici minuscoli e maiuscoli, trattini bassi o trattini. L'ID pool deve essere univoco all'interno della regione.REGION
: la regione in cui creare il pool di CA subordinate.CA_PROJECT_ID
: l'ID del progetto in cui hai creato la CA subordinata.
Per ulteriori informazioni, vedi Creare pool di CA.
Crea una CA subordinata nel pool di CA subordinate. Non modificare la modalità di emissione basata sulla configurazione predefinita.
gcloud privateca subordinates create SUBORDINATE_CA_ID \ --pool=SUBORDINATE_CA_POOL_ID \ --location=REGION \ --issuer-pool=ROOT_CA_POOL_ID \ --issuer-location=REGION \ --subject="CN=SUBORDINATE_CA_CN, O=SUBORDINATE_CA_ORGANIZATION" \ --key-algorithm="KEY_ALGORITHM" \ --use-preset-profile=subordinate_mtls_pathlen_0 \ --project=CA_PROJECT_ID \ --auto-enable
Sostituisci quanto segue:
SUBORDINATE_CA_ID
: un nome univoco per la CA subordinata. Il nome può contenere fino a 64 caratteri e deve contenere solo caratteri alfanumerici minuscoli e maiuscoli, trattini bassi o trattini. Il nome del pool deve essere univoco all'interno della regione.SUBORDINATE_CA_POOL_ID
: il nome del pool di CA secondario.REGION
: la regione in cui si trova il pool di CA secondario.ROOT_CA_POOL_ID
: l'ID del pool di CA radice.REGION
: la regione del pool di CA radice.SUBORDINATE_CA_CN
: il nome comune della CA subordinata.SUBORDINATE_CA_ORGANIZATION
: il nome dell'organizzazione che emette la CA subordinata.KEY_ALGORITHM
: l'algoritmo chiave, ad esempioec-p256-sha256
CA_PROJECT_ID
: l'ID del progetto in cui hai creato la CA subordinata.
Per ulteriori informazioni sui campi
subject
per la CA, consulta Soggetto.
Crea un file di configurazione dell'emissione dei certificati
Per associare le CA ai pool di identità per i carichi di lavoro, è necessario disporre di una configurazione di emissione dei certificati. Se vuoi che i tuoi carichi di lavoro si autentichino in più domini di attendibilità, puoi anche aggiornare il pool con le configurazioni di attendibilità.
Per configurare la configurazione dell'emissione dei certificati, crea un file di configurazione dell'emissione dei certificati. Il formato del file è simile a quanto segue:
{ "inlineCertificateIssuanceConfig": { "caPools": { "REGION1": "projects/CA_PROJECT_NUMBER1/locations/REGION1/caPools/SUBORDINATE_CA_POOL_ID1", "REGION2": "projects/CA_PROJECT_NUMBER2/locations/REGION2/caPools/SUBORDINATE_CA_POOL_ID2" }, "lifetime": "DURATION", "rotationWindowPercentage": ROTATION_WINDOW_PERCENTAGE, "keyAlgorithm": "ALGORITHM" } }
Sostituisci quanto segue:
REGION
: le regioni in cui si trovano le CA.CA_PROJECT_NUMBER
: il numero del progetto in cui hai creato il pool di CA secondario. Per ottenere il numero di progetto dal progetto CA_PROJECT_ID, esegui il seguente comando:gcloud projects describe CA_PROJECT_ID --format="value(projectNumber)"
SUBORDINATE_CA_POOL_ID
: il nome del pool di CA secondario.ALGORITHM
: facoltativo. L'algoritmo di crittografia utilizzato per generare la chiave privata. I valori validi sonoECDSA_P256
(predefinito),ECDSA_P384
,RSA_2048
,RSA_3072
,RSA_4096
.DURATION
: facoltativo. La durata di validità del certificato end-entity, in secondi. Il valore deve essere compreso tra 86400 (1 giorno) e 2592000 (30 giorni). Se non specificato, viene utilizzato il valore predefinito 86400 (1 giorno). La validità effettiva del certificato emesso dipende anche dall'autorità di certificazione emittente, in quanto può limitare la durata del certificato emesso.ROTATION_WINDOW_PERCENTAGE
: facoltativo. La percentuale della durata del certificato in cui viene attivato un rinnovo. Il valore deve essere compreso tra 50 e 80. Il valore predefinito è 50.
Crea il file di configurazione dell'attendibilità
Per impostazione predefinita, i carichi di lavoro all'interno dello stesso dominio attendibile possono autenticarsi reciprocamente utilizzando le identità dei carichi di lavoro gestiti. Se vuoi che i carichi di lavoro che si trovano in domini di attendibilità diversi si autentichino reciprocamente, devi dichiarare esplicitamente la relazione di attendibilità nel pool di identità dei carichi di lavoro.
Per farlo, crea un file di configurazione attendibile
contenente un inlineTrustConfig
che fornisce i certificati per ogni dominio.
Il file di configurazione dell'attendibilità contiene un insieme di trust anchor che l'identità del carico di lavoro gestito utilizza per convalidare i certificati peer. Il file di configurazione dell'attendibilità mappa il dominio attendibilità SPIFFE ai certificati CA.
Per creare il file di configurazione della attendibilità:
-
Scarica i certificati.
gcloud privateca pools get-ca-certs ROOT_CA_POOL_ID \ --output-file=CERTIFICATE_PATH \ --location=REGION
Sostituisci quanto segue:
-
ROOT_CA_POOL_ID
: l'ID del pool di CA radice -
CERTIFICATE_PATH
: il percorso in cui generare il certificato con codifica PEM -
REGION
: la regione del pool di CA radice
-
-
Crea un file denominato che contenga la configurazione di attendibilità in linea, con certificati in formato PEM. Il file sarà simile al seguente:
{ "inlineTrustConfig": { "additionalTrustBundles": { "TRUST_DOMAIN_NAME1": { "trustAnchors": [ { "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL1\n-----END CERTIFICATE-----" }, { "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL2\n-----END CERTIFICATE-----" } ] }, "TRUSTED_DOMAIN_NAME2": { "trustAnchors": [ { "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL3\n-----END CERTIFICATE-----" }, { "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL4\n-----END CERTIFICATE-----" } ] } } } }
Sostituisci quanto segue:
-
TRUST_DOMAIN_NAME
: il nome di dominio attendibile, nel seguente formato:PROJECT_ID.svc.id.goog
-
CERTIFICATE_MATERIAL
: un insieme di certificati CA in formato PEM considerati attendibili per l'emissione di certificati nel dominio attendibile.
-
Associa le CA al pool di identità del workload
Dopo aver creato la gerarchia delle CA e le configurazioni di emissione dei certificati per ogni CA, devi associare le CA al pool di identità del workload. Per associare una CA al pool di identità per i carichi di lavoro, aggiorna il pool con la configurazione di emissione dei certificati della CA. Poi, puoi verificare che il pool sia stato aggiornato.
Aggiorna il pool di identità del workload
Per aggiornare il pool, esegui il seguente comando:
gcloud iam workload-identity-pools update TRUST_DOMAIN_NAME \ --location="global" \ --inline-certificate-issuance-config-file=CIC_JSON_FILE_PATH \ --inline-trust-config-file=TC_JSON_FILE_PATH \ --project=PROJECT_ID
Sostituisci quanto segue:
TRUST_DOMAIN_NAME
: il nome del dominio attendibile, formato come segue:PROJECT_ID.svc.id.goog
CIC_JSON_FILE_PATH
: il percorso del file di configurazione per l'emissione dei certificati (cic.json
) in formato JSON che hai creato in precedenza.TC_JSON_FILE_PATH
: facoltativo. Il percorso del file di configurazione della attendibilità (tc.json
) in formato JSON che hai creato in precedenza. Se i carichi di lavoro si autenticano in domini attendibili diversi, devi specificare questo file. In caso contrario, puoi omettere--inline-trust-config
.
Verificare che il pool di identità per i carichi di lavoro sia stato aggiornato
Per verificare che il pool di identità del carico di lavoro sia stato aggiornato insieme alla configurazione di emissione dei certificati e alla configurazione della attendibilità, esegui il seguente comando:
gcloud iam workload-identity-pools describe TRUST_DOMAIN_NAME \ --location="global" \ --project=PROJECT_ID
Sostituisci TRUST_DOMAIN_NAME
con il nome di dominio attendibile
che hai utilizzato per aggiornare il pool di identità del workload in precedenza
in questo documento.
L'output del comando è simile al seguente:
inlineCertificateIssuanceConfig: caPools: REGION1: projects/PROJECT_NUMBER1/locations/REGION1/caPools/SUBORDINATE_CA_POOL_ID1, REGION2: projects/PROJECT_NUMBER2/locations/REGION2/caPools/SUBORDINATE_CA_POOL_ID2 keyAlgorithm: ALGORITHM lifetime: DURATION rotationWindowPercentage: ROTATION_WINDOW_PERCENTAGE inlineTrustConfig: additionalTrustBundles: example.com: trustAnchors: - pemCertificate: |- -----BEGIN CERTIFICATE----- CERTIFICATE_MATERIAL1 -----END CERTIFICATE----- - pemCertificate: |- -----BEGIN CERTIFICATE----- CERTIFICATE_MATERIAL2 -----END CERTIFICATE----- myorg.com: trustAnchors: - pemCertificate: |- -----BEGIN CERTIFICATE----- CERTIFICATE_MATERIAL3 -----END CERTIFICATE----- - pemCertificate: |- -----BEGIN CERTIFICATE----- CERTIFICATE_MATERIAL4 -----END CERTIFICATE----- name: PROJECT_ID.svc.id.goog state: ACTIVE
Se inlineCertificateIssuanceConfig
o inlineTrustConfig
non è presente nell'output del comando, verifica di aver configurato correttamente
la CLI gcloud in modo da utilizzare il progetto corretto per la fatturazione e la quota.
Potresti dover eseguire l'aggiornamento a una versione più recente della CLI gcloud.
Autorizza le identità per i carichi di lavoro gestite a richiedere certificati dal pool CA
Dopo aver associato le CA al pool di identità per i carichi di lavoro, devi autorizzare le identità per i carichi di lavoro gestite a richiedere certificati dal pool di CA. Per autorizzare queste identità:
Concedi al dominio attendibile il ruolo IAM CA Service Workload Certificate Requester (
roles/privateca.workloadCertificateRequester
) su ogni pool di CA secondarie. Il seguente comandogcloud privateca pools add-iam-policy-binding
consente al dominio attendibile di richiedere certificati dalle catene di certificati del servizio CA.gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \ --location=REGION \ --role=roles/privateca.workloadCertificateRequester \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog" \ --project=CA_PROJECT_ID
Sostituisci quanto segue:
SUBORDINATE_CA_POOL_ID
: l'ID del pool di CA secondario.REGION
: la regione del pool di CA secondarie.PROJECT_NUMBER
: il numero del progetto che contiene il pool di identità di carico di lavoro GKE.Per ottenere
PROJECT_NUMBER
daPROJECT_ID
, esegui il seguente comando:gcloud projects describe PROJECT_ID --format="value(projectNumber)"
PROJECT_ID
: l'ID del progetto host del parco risorse GKE.CA_PROJECT_ID
: l'ID del progetto in cui hai creato la CA subordinata.
Concedi il ruolo CA Service Pool Reader (
roles/privateca.poolReader
) ai pool di CA secondari per l'identità del carico di lavoro gestito. In questo modo, l'identità del carico di lavoro gestito viene autorizzata a ottenere i certificati X.509 firmati dalle catene di certificati della CA.gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \ --location=REGION \ --role=roles/privateca.poolReader \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog" \ --project=CA_PROJECT_ID
Sostituisci quanto segue:
SUBORDINATE_CA_POOL_ID
: l'ID del pool di CA subordinato.REGION
: la regione del pool di CA secondarie.PROJECT_NUMBER
: il numero del progetto che contiene il pool di identità del workload GKE.PROJECT_ID
: l'ID del progetto host del parco risorse GKE.CA_PROJECT_ID
: l'ID del progetto in cui hai creato la CA subordinata.
Esegui il deployment dei carichi di lavoro con identità del carico di lavoro gestite
Dopo aver configurato i pool di CA per emettere certificati per le identità di workload gestite, puoi eseguire il deployment di workload con identità di workload gestite.
Questa sezione mostra come eseguire il deployment di un carico di lavoro di test con un'identità di carico di lavoro gestito. Per farlo, esegui il deployment di un pod, controlla che le credenziali siano state generate e visualizza il certificato e l'ID SPIFFE.
Esegui il deployment di un pod
Per eseguire il deployment di un pod di test nel cluster:
Recupera le credenziali del cluster.
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CLUSTER_ZONE \ --project=CLUSTER_PROJECT_ID
Crea lo spazio dei nomi Kubernetes.
kubectl create namespace KUBERNETES_NAMESPACE
Esegui il deployment di un PodSpec di test.
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: namespace: KUBERNETES_NAMESPACE name: example-pod spec: containers: - name: main image: debian command: ['sleep', 'infinity'] volumeMounts: - name: fleet-spiffe-credentials mountPath: /var/run/secrets/workload-spiffe-credentials readOnly: true nodeSelector: iam.gke.io/gke-metadata-server-enabled: "true" volumes: - name: fleet-spiffe-credentials csi: driver: podcertificate.gke.io volumeAttributes: signerName: spiffe.gke.io/fleet-svid trustDomain: fleet-project/svc.id.goog EOF
Elenca le credenziali del carico di lavoro
Per elencare le credenziali del carico di lavoro, esegui il seguente comando. La creazione delle credenziali può richiedere alcuni minuti.
kubectl exec -it example-pod -n KUBERNETES_NAMESPACE -- ls /var/run/secrets/workload-spiffe-credentials
Dovresti vedere l'output seguente:
ca_certificates.pem
certificates.pem
private_key.pem
trust_bundles.json
Visualizza il certificato
Per visualizzare il certificato:
Esporta il certificato in un file del certificato.
kubectl exec -it example-pod --namespace=KUBERNETES_NAMESPACE -- cat /var/run/secrets/workload-spiffe-credentials/certificates.pem | openssl x509 -noout -text > certfile
Visualizza il file del certificato.
cat certfile
Nel certificato, nell'attributo
X509v3 Subject Alternative Name
, vedrai l'ID SPIFFE, con il seguente formato:spiffe://PROJECT_ID.svc.id.goog/ns/KUBERNETES_NAMESPACE/sa/default
default
si riferisce all'account di servizio Kubernetes predefinito.
Testa l'autenticazione da workload a workload
Per testare l'autenticazione da workload a workload, consulta Testare l'autenticazione mTLS utilizzando Go.
Il codice di esempio nel repository crea carichi di lavoro client e server. Puoi verificare l'autenticazione reciproca tra i carichi di lavoro utilizzando i certificati che hai generato in precedenza in questo documento.
Passaggi successivi
- Risolvi i problemi relativi all'identità per i carichi di lavoro gestiti per GKE.
- Scopri di più sulla creazione di pool di CA.
Provalo
Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $ di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
Inizia gratuitamente