Configura la sicurezza dei servizi con Envoy e le API di bilanciamento del carico (legacy)
Segui le istruzioni riportate in questa guida per configurare l'autenticazione e l'autorizzazione per i servizi di cui è stato eseguito il deployment con Cloud Service Mesh e i proxy Envoy utilizzando le API di bilanciamento del carico. Se utilizzi le API di routing dei servizi, leggi Configurazione della sicurezza del servizio con Envoy.
Per informazioni complete, consulta Sicurezza del servizio Cloud Service Mesh con le API di bilanciamento del carico.
Questo documento riguarda le configurazioni che utilizzano le API di bilanciamento del carico. Si tratta di un documento precedente.
Requisiti
Prima di configurare la sicurezza del servizio per Cloud Service Mesh con Envoy, assicurati che la configurazione soddisfi i seguenti prerequisiti:
Usa Envoy versione 1.20.0 o successiva per l'API xDS v3.
Puoi soddisfare tutti i requisiti per il deployment di Cloud Service Mesh. Per informazioni complete su questi requisiti, consulta Prepararsi a configurare Cloud Service Mesh con Envoy.
Disponi di autorizzazioni sufficienti per creare o aggiornare Cloud Service Mesh e Risorse mesh di servizi Google Cloud per utilizzare la sicurezza del servizio, come descritto in Prepararsi a configurare Cloud Service Mesh con Envoy.
Preparati per la configurazione
Le seguenti sezioni descrivono le attività da completare prima di configurare Servizio di sicurezza Cloud Service Mesh. Le seguenti attività sono:
- Aggiornamento di Google Cloud CLI
- Impostazione delle variabili
- Abilitazione delle API richieste per il funzionamento di Cloud Service Mesh con Certificate Authority Service
Aggiorna lo strumento a riga di comando gcloud
Per aggiornare Google Cloud CLI, esegui quanto segue sulla tua macchina locale:
gcloud components update
Imposta le variabili
Imposta le seguenti variabili in modo da poter copiare e incollare il codice in modo mentre lavori nell'esempio in questo documento. Utilizza quanto segue e i relativi valori.
- PROJECT_ID: sostituisci l'ID del progetto.
- CLUSTER_NAME: sostituisci il nome del cluster che vuoi utilizzare, ad esempio
secure-td-cluster
. - ZONE: sostituisci la zona in cui si trova il cluster. in cui si trova il cluster.
- GKE_CLUSTER_URL: sostitutivo
https://container.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/clusters/CLUSTER_NAME
- WORKLOAD_POOL: sostitutivo
PROJECT_ID.svc.id.goog
- K8S_NAMESPACE: sostituisci
default
. - DEMO_CLIENT_KSA: sostituisci il nome del cliente l'account di servizio Kubernetes.
- DEMO_SERVER_KSA: sostituisci il nome del server l'account di servizio Kubernetes.
PROJNUM: sostituisci il numero del progetto, che puoi determinare dalla console Google Cloud o con questo comando:
gcloud projects describe PROJECT_ID --format="value(projectNumber)"
SA_GKE: sostituisci
service-PROJNUM@container-engine-robot.iam.gserviceaccount.com
CLUSTER_VERSION: sostituisci la versione più recente disponibile. Puoi trovarlo nelle note di rilascio del canale rapido. La versione minima richiesta è 1.21.4-gke.1801. Questo è il cluster GKE del cluster da usare in questo esempio.
Imposta i valori qui:
# Substitute your project ID PROJECT_ID=PROJECT_ID # GKE cluster name and zone for this example. CLUSTER_NAME=CLUSTER_NAME ZONE=ZONE # GKE cluster URL derived from the above GKE_CLUSTER_URL="https://container.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/clusters/CLUSTER_NAME" # Workload pool to be used with the GKE cluster WORKLOAD_POOL="PROJECT_ID.svc.id.goog" # Kubernetes namespace to run client and server demo. K8S_NAMESPACE=K8S_NAMESPACE DEMO_CLIENT_KSA=DEMO_CLIENT_KSA DEMO_SERVER_KSA=DEMO_SERVER_KSA # Compute other values # Project number for your project PROJNUM=PROJNUM CLUSTER_VERSION=CLUSTER_VERSION SA_GKE=service-PROJNUM@container-engine-robot.iam.gserviceaccount.com
Abilita le API
Utilizza la gcloud services enable
per abilitare tutte le API necessarie per configurare Cloud Service Mesh
con Certificate Authority Service.
gcloud services enable \ container.googleapis.com \ cloudresourcemanager.googleapis.com \ compute.googleapis.com \ trafficdirector.googleapis.com \ networkservices.googleapis.com \ networksecurity.googleapis.com \ privateca.googleapis.com \ gkehub.googleapis.com
Crea o aggiorna un cluster GKE
La sicurezza del servizio Cloud Service Mesh dipende dall'integrazione di CA Service con GKE. Il cluster GKE deve soddisfare i seguenti requisiti, oltre ai requisiti per la configurazione:
- Utilizza una versione minima del cluster 1.21.4-gke.1801. Se hai bisogno di funzionalità che sono presenti in una versione successiva, puoi ottenere questa versione dal canale di rilascio rapido.
- Il cluster GKE deve essere abilitato e configurato con mesh come descritto in Creazione di autorità di certificazione per emettere certificati.
Crea un nuovo cluster che utilizzi la federazione delle identità per i carichi di lavoro per GKE. Se stai aggiornando un cluster esistente, vai al passaggio successivo. Il valore che assegni a
--tags
deve corrispondere al nome trasmesso al flag--target-tags
per il Comandofirewall-rules create
nella sezione Configurazione di Cloud Service Mesh con i componenti di Cloud Load Balancing.# Create a GKE cluster with GKE managed mesh certificates. gcloud container clusters create CLUSTER_NAME \ --release-channel=rapid \ --scopes=cloud-platform \ --image-type=cos_containerd \ --machine-type=e2-standard-2 \ --zone=ZONE \ --workload-pool=PROJECT_ID.svc.id.goog \ --enable-mesh-certificates \ --cluster-version=CLUSTER_VERSION \ --enable-ip-alias \ --tags=allow-health-checks \ --workload-metadata=GKE_METADATA
La creazione del cluster potrebbe richiedere diversi minuti.
Se utilizzi un cluster esistente, attiva la federazione delle identità per i carichi di lavoro per GKE e Certificati mesh GKE. Assicurati che il cluster sia stato creato con il flag
--enable-ip-alias
, che non può essere usato conupdate
.gcloud container clusters update CLUSTER_NAME \ --enable-mesh-certificates
Esegui il comando seguente per impostare il nuovo cluster come cluster predefinito per i comandi
kubectl
:gcloud container clusters get-credentials CLUSTER_NAME \ --zone ZONE
Deployment in un ambiente multi-cluster
Se esegui il deployment in un ambiente multi-cluster, segui la procedura generale descritta in questa sezione. Queste istruzioni presuppongono che i pod client sono in esecuzione in un cluster e i pod server sono in esecuzione in un altro cluster.
Crea o aggiorna i cluster utilizzando le istruzioni nella precedente .
Acquisisci gli intervalli di indirizzi IP dei pod per ogni cluster utilizzando quanto segue :
gcloud compute firewall-rules list \ --filter="name~gke-{CLUSTER_NAME}-[0-9a-z]*-all" \ --format="value(sourceRanges)"
Ad esempio, per i cluster denominati
cluster-a
ecluster-b
, i comandi restituiranno risultati come i seguenti:cluster-a, pod CIDR: 10.4.0.0/14, node network tag: gke-cluster-a-9cd18751-node cluster-b, pod CIDR: 10.8.0.0/14, node network tag: gke-cluster-b-acd14479-node
Creare regole firewall VPC che consentono ai cluster di comunicare tra loro. Ad esempio, il comando seguente crea un regola firewall che consente agli indirizzi IP del pod
cluster-a
di comunicare concluster-b
nodi:gcloud compute firewall-rules create per-cluster-a-pods \ --allow="tcp,udp,icmp,esp,ah,sctp" \ --target-tags="gke-cluster-b-acd14479-node"
Il comando seguente crea una regola firewall che consente all'
cluster-b
indirizzi IP dei pod per comunicare concluster-a
nodi:gcloud compute firewall-rules create per-cluster-b-pods \ --allow="tcp,udp,icmp,esp,ah,sctp" \ --target-tags="gke-cluster-a-9cd18751-node"
Registra i cluster in un parco risorse
Registra il cluster che hai creato o aggiornato in Creazione di un cluster GKE con un parco risorse. La registrazione del cluster semplifica la configurazione dei cluster più progetti.
Tieni presente che il completamento di ciascun passaggio può richiedere fino a dieci minuti.
Registra il cluster nel parco risorse:
gcloud container fleet memberships register CLUSTER_NAME \ --gke-cluster=ZONE/CLUSTER_NAME \ --enable-workload-identity --install-connect-agent \ --manifest-output-file=MANIFEST-FILE_NAME
Sostituisci le variabili in questo modo:
- CLUSTER_NAME: il nome del cluster.
- ZONE: la zona del tuo cluster.
- MANIFEST-FILE_NAME: il percorso in cui questi comandi generano il manifest per la registrazione.
Se la procedura di registrazione va a buon fine, viene visualizzato un messaggio simile al seguente:
Finished registering the cluster CLUSTER_NAME with the fleet.
Applica il file manifest generato al cluster:
kubectl apply -f MANIFEST-FILE_NAME
Quando la procedura di richiesta ha esito positivo, vengono visualizzati messaggi come il seguenti:
namespace/gke-connect created serviceaccount/connect-agent-sa created podsecuritypolicy.policy/gkeconnect-psp created role.rbac.authorization.k8s.io/gkeconnect-psp:role created rolebinding.rbac.authorization.k8s.io/gkeconnect-psp:rolebinding created role.rbac.authorization.k8s.io/agent-updater created rolebinding.rbac.authorization.k8s.io/agent-updater created role.rbac.authorization.k8s.io/gke-connect-agent-20210416-01-00 created clusterrole.rbac.authorization.k8s.io/gke-connect-impersonation-20210416-01-00 created clusterrolebinding.rbac.authorization.k8s.io/gke-connect-impersonation-20210416-01-00 created clusterrolebinding.rbac.authorization.k8s.io/gke-connect-feature-authorizer-20210416-01-00 created rolebinding.rbac.authorization.k8s.io/gke-connect-agent-20210416-01-00 created role.rbac.authorization.k8s.io/gke-connect-namespace-getter created rolebinding.rbac.authorization.k8s.io/gke-connect-namespace-getter created secret/http-proxy created deployment.apps/gke-connect-agent-20210416-01-00 created service/gke-connect-monitoring created secret/creds-gcp create
Recupera la risorsa appartenenza dal cluster:
kubectl get memberships membership -o yaml
L'output deve includere il pool Workload Identity assegnato dal parco risorse, dove PROJECT_ID è l'ID progetto:
workload_identity_pool: PROJECT_ID.svc.id.goog
Ciò significa che il cluster è stato registrato correttamente.
Creare autorità di certificazione per emettere certificati
Per emettere certificati ai pod, crea un pool di CA Service e le seguenti autorità di certificazione (CA):
- CA radice. Si tratta della radice di attendibilità per tutti i certificati mesh emessi. Puoi utilizzare una CA radice esistente, se ne hai una. Crea la CA radice nel livello
enterprise
, progettato per l'emissione di certificati di lunga durata e a basso volume. - CA subordinata. Questa CA emette certificati per i carichi di lavoro. Crea la CA subordinata nella regione in cui è dipiegato il cluster. Crea la CA subordinata nel livello
devops
, progettato per l'emissione di certificati di breve durata e ad alto volume.
La creazione di una CA subordinata è facoltativa, ma consigliamo vivamente di crearne una anziché utilizzare la tua CA radice per emettere i certificati mesh GKE. Se decidi di utilizzare la CA radice per emettere i certificati mesh, assicurati che la modalità di emissione basata sulla configurazione predefinita rimanga consentita.
La CA secondaria può trovarsi in una regione diversa dal cluster, ma ti consigliamo vivamente di crearla nella stessa regione del cluster per ottimizzare le prestazioni. Tuttavia, puoi creare le CA principali e secondarie in regioni diverse senza alcun impatto sul rendimento o sulla disponibilità.
Queste regioni sono supportate per il servizio CA:
Nome regione | Descrizione regione |
---|---|
asia-east1 |
Taiwan |
asia-east2 |
Hong Kong |
asia-northeast1 |
Tokyo |
asia-northeast2 |
Osaka |
asia-northeast3 |
Seul |
asia-south1 |
Mumbai |
asia-south2 |
Delhi |
asia-southeast1 |
Singapore |
asia-southeast2 |
Giacarta |
australia-southeast1 |
Sydney |
australia-southeast2 |
Melbourne |
europe-central2 |
Varsavia |
europe-north1 |
Finlandia |
europe-southwest1 |
Madrid |
europe-west1 |
Belgio |
europe-west2 |
Londra |
europe-west3 |
Francoforte |
europe-west4 |
Paesi Bassi |
europe-west6 |
Zurigo |
europe-west8 |
Milano |
europe-west9 |
Parigi |
europe-west10 |
Berlino |
europe-west12 |
Torino |
me-central1 |
Doha |
me-central2 |
Dammam |
me-west1 |
Tel Aviv |
northamerica-northeast1 |
Montréal |
northamerica-northeast2 |
Toronto |
southamerica-east1 |
San Paolo |
southamerica-west1 |
Santiago |
us-central1 |
Iowa |
us-east1 |
Carolina del Sud |
us-east4 |
Virginia del Nord |
us-east5 |
Columbus |
us-south1 |
Dallas |
us-west1 |
Oregon |
us-west2 |
Los Angeles |
us-west3 |
Salt Lake City |
us-west4 |
Las Vegas |
L'elenco delle località supportate può essere controllato anche eseguendo il seguente comando:
gcloud privateca locations list
Concedi
roles/privateca.caManager
IAM a singoli utenti che creano un pool di CA e una CA. Tieni presente che per MEMBER, il formato corretto èuser:userid@example.com
. Se la persona in questione è l'attuale puoi ottenere l'ID utente corrente con il comando shell$(gcloud auth list --filter=status:ACTIVE --format="value(account)")
.gcloud projects add-iam-policy-binding PROJECT_ID \ --member=MEMBER \ --role=roles/privateca.caManager
Concedi il ruolo
role/privateca.admin
per CA Service ai privati che devono modificare i criteri IAM, doveMEMBER
è persona che ha bisogno di questo accesso, in particolare individui che eseguono i passaggi che seguono per concedere leprivateca.auditor
Ruoliprivateca.certificateManager
:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=MEMBER \ --role=roles/privateca.admin
Crea il pool di servizi della CA radice.
gcloud privateca pools create ROOT_CA_POOL_NAME \ --location ROOT_CA_POOL_LOCATION \ --tier enterprise
Crea una CA radice.
gcloud privateca roots create ROOT_CA_NAME --pool ROOT_CA_POOL_NAME \ --subject "CN=ROOT_CA_NAME, O=ROOT_CA_ORGANIZATION" \ --key-algorithm="ec-p256-sha256" \ --max-chain-length=1 \ --location ROOT_CA_POOL_LOCATION
Per questa configurazione di dimostrazione, utilizza i seguenti valori per le variabili:
- ROOT_CA_POOL_NAME=td_sec_pool
- ROOT_CA_NAME=pkcs2-ca
- ROOT_CA_POOL_LOCATION=us-east1
- ROOT_CA_ORGANIZATION="TestCorpLLC"
Crea il pool secondario e la CA secondaria. Assicurati che la modalità di emissione basata sulla configurazione predefinita rimanga consentita.
gcloud privateca pools create SUBORDINATE_CA_POOL_NAME \ --location SUBORDINATE_CA_POOL_LOCATION \ --tier devops
gcloud privateca subordinates create SUBORDINATE_CA_NAME \ --pool SUBORDINATE_CA_POOL_NAME \ --location SUBORDINATE_CA_POOL_LOCATION \ --issuer-pool ROOT_CA_POOL_NAME \ --issuer-location ROOT_CA_POOL_LOCATION \ --subject "CN=SUBORDINATE_CA_NAME, O=SUBORDINATE_CA_ORGANIZATION" \ --key-algorithm "ec-p256-sha256" \ --use-preset-profile subordinate_mtls_pathlen_0
Per la configurazione di questa dimostrazione, utilizza i seguenti valori per le variabili:
- SUBORDINATE_CA_POOL_NAME="td-ca-pool"
- SUBORDINATE_CA_POOL_LOCATION=us-east1
- SUBORDINATE_CA_NAME="td-ca"
- SUBORDINATE_CA_ORGANIZATION="TestCorpLLC"
- ROOT_CA_POOL_NAME=td_sec_pool
- ROOT_CA_POOL_LOCATION=us-east1
Concedi il ruolo IAM
privateca.auditor
per il pool di CA radice a consenti l'accesso dall'account di servizio GKE:gcloud privateca pools add-iam-policy-binding ROOT_CA_POOL_NAME \ --location ROOT_CA_POOL_LOCATION \ --role roles/privateca.auditor \ --member="serviceAccount:service-PROJNUM@container-engine-robot.iam.gserviceaccount.com"
Concedi a IAM
privateca.certificateManager
ruolo per il pool di CA subordinato al fine di consentire l'accesso da GKE account di servizio:gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_NAME \ --location SUBORDINATE_CA_POOL_LOCATION \ --role roles/privateca.certificateManager \ --member="serviceAccount:service-PROJNUM@container-engine-robot.iam.gserviceaccount.com"
Salva la seguente configurazione YAML
WorkloadCertificateConfig
per indicare al tuo cluster come emettere i certificati del mesh:apiVersion: security.cloud.google.com/v1 kind: WorkloadCertificateConfig metadata: name: default spec: # Required. The CA service that issues your certificates. certificateAuthorityConfig: certificateAuthorityServiceConfig: endpointURI: ISSUING_CA_POOL_URI # Required. The key algorithm to use. Choice of RSA or ECDSA. # # To maximize compatibility with various TLS stacks, your workloads # should use keys of the same family as your root and subordinate CAs. # # To use RSA, specify configuration such as: # keyAlgorithm: # rsa: # modulusSize: 4096 # # Currently, the only supported ECDSA curves are "P256" and "P384", and the only # supported RSA modulus sizes are 2048, 3072 and 4096. keyAlgorithm: rsa: modulusSize: 4096 # Optional. Validity duration of issued certificates, in seconds. # # Defaults to 86400 (1 day) if not specified. validityDurationSeconds: 86400 # Optional. Try to start rotating the certificate once this # percentage of validityDurationSeconds is remaining. # # Defaults to 50 if not specified. rotationWindowPercentage: 50
Sostituisci quanto segue:
- L'ID del progetto in cui viene eseguito il cluster:
PROJECT_ID
- L'URI completo della CA che emette i certificati mesh (ISSUING_CA_POOL_URI).
Può essere la tua CA subordinata (consigliato) o la tua CA principale. Il formato è:
//privateca.googleapis.com/projects/PROJECT_ID/locations/SUBORDINATE_CA_POOL_LOCATION/caPools/SUBORDINATE_CA_POOL_NAME
- L'ID del progetto in cui viene eseguito il cluster:
Salva la seguente configurazione YAML
TrustConfig
per indicare al cluster come per considerare attendibili i certificati emessi:apiVersion: security.cloud.google.com/v1 kind: TrustConfig metadata: name: default spec: # You must include a trustStores entry for the trust domain that # your cluster is enrolled in. trustStores: - trustDomain: PROJECT_ID.svc.id.goog # Trust identities in this trustDomain if they appear in a certificate # that chains up to this root CA. trustAnchors: - certificateAuthorityServiceURI: ROOT_CA_POOL_URI
Sostituisci quanto segue:
- L'ID del progetto in cui viene eseguito il cluster:
PROJECT_ID
- L'URI completo del pool di CA principale (ROOT_CA_POOL_URI).
Il formato è:
//privateca.googleapis.com/projects/PROJECT_ID/locations/ROOT_CA_POOL_LOCATION/caPools/ROOT_CA_POOL_NAME
- L'ID del progetto in cui viene eseguito il cluster:
Applica le configurazioni al cluster:
kubectl apply -f WorkloadCertificateConfig.yaml kubectl apply -f TrustConfig.yaml
Configurare Identity and Access Management
Per creare le risorse necessarie per la configurazione, devi disporre del ruolo compute.NetworkAdmin
. Questo ruolo contiene tutte le autorizzazioni necessarie
creare, aggiornare, eliminare, elencare e utilizzare (ovvero, ci si riferisce a questo
risorse) le risorse richieste. Se sei il proprietario-editor del progetto,
disponi automaticamente di questo ruolo.
Tieni presente che networksecurity.googleapis.com.clientTlsPolicies.use
e
networksecurity.googleapis.com.serverTlsPolicies.use
non vengono applicate in modo forzato
fare riferimento a queste risorse nel servizio di backend e nel proxy HTTPS di destinazione
Google Cloud.
Se queste autorizzazioni verranno applicate in futuro e utilizzi
ruolo compute.NetworkAdmin
, non noterai problemi durante questo controllo
in modo forzato.
Se utilizzi ruoli personalizzati e questo controllo viene applicato in futuro, devi assicurarti di includere la rispettiva autorizzazione .use
. Altrimenti, in futuro,
potresti scoprire che il tuo ruolo personalizzato non dispone delle autorizzazioni necessarie
fare riferimento a clientTlsPolicy
o serverTlsPolicy
del servizio di backend oppure
proxy HTTPS di destinazione.
Le istruzioni riportate di seguito consentono all'account di servizio predefinito di accedere all'API Cloud Service Mesh Security e di creare gli account di servizio Kubernetes.
Configura IAM per consentire all'account di servizio predefinito di accedere all'API di sicurezza Cloud Service Mesh.
GSA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \ --filter='displayName:Compute Engine default service account') gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:${GSA_EMAIL} \ --role roles/trafficdirector.client
Configurare gli account di servizio Kubernetes. I deployment di client e server Nelle sezioni seguenti vengono usati i Kname del server e del client Kubernetes account di servizio.
kubectl create serviceaccount --namespace K8S_NAMESPACE DEMO_SERVER_KSA kubectl create serviceaccount --namespace K8S_NAMESPACE DEMO_CLIENT_KSA
Consenti agli account di servizio Kubernetes di impersonare Compute Engine predefinito un account di servizio creando un'associazione di criteri IAM tra i due. Questo consente all'account di servizio Kubernetes di agire come Account di servizio Compute Engine.
gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[K8S_NAMESPACE/DEMO_SERVER_KSA]" ${GSA_EMAIL} gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[K8S_NAMESPACE/DEMO_CLIENT_KSA]" ${GSA_EMAIL}
Aggiungi annotazioni agli account di servizio Kubernetes per associarli all'account di servizio Compute Engine predefinito.
kubectl annotate --namespace K8S_NAMESPACE \ serviceaccount DEMO_SERVER_KSA \ iam.gke.io/gcp-service-account=${GSA_EMAIL} kubectl annotate --namespace K8S_NAMESPACE \ serviceaccount DEMO_CLIENT_KSA \ iam.gke.io/gcp-service-account=${GSA_EMAIL}
Configurare Cloud Service Mesh
Segui le istruzioni riportate di seguito per installare l'iniettore sidecar, configurare un servizio di test e completare altre attività di implementazione.
Installa l'injector sidecar di Envoy nel cluster
Segui le istruzioni riportate in entrambe le sezioni seguenti della configurazione di Cloud Service Mesh per i pod GKE con l'iniezione automatica di Envoy per eseguire il deployment e attivare l'iniezione di sidecar Envoy nel cluster:
Assicurati di completare entrambe le istruzioni prima di configurare di prova del prodotto.
Configurare un servizio di prova
Dopo aver installato l'iniettore collaterale di Envoy, utilizza queste istruzioni per configurare un servizio di test per il tuo deployment.
wget -q -O - https://storage.googleapis.com/traffic-director/security/ga/service_sample.yaml | sed -e s/DEMO_SERVER_KSA_PLACEHOLDER/DEMO_SERVER_KSA/g > service_sample.yaml kubectl apply -f service_sample.yaml
Il file service_sample.yaml
contiene il podspec per il server demo
un'applicazione. Esistono alcune annotazioni specifiche di Cloud Service Mesh
sicurezza.
Metadati proxy Cloud Service Mesh
Podspec specifica l'annotazione proxyMetadata
:
spec: ... annotations: cloud.google.com/proxyMetadata: '{"app": "payments"}' ...
Quando il pod viene inizializzato, il proxy sidecar recupera questa annotazione e la trasmette a Cloud Service Mesh. Cloud Service Mesh può quindi utilizzare queste informazioni per inviare nuovamente la configurazione filtrata:
- Più avanti in questa guida, tieni presente che il criterio endpoint specifica un'associazione di endpoint.
- Il corrispettivo per gli endpoint specifica che solo i client che presentano un'etichetta con nome
app
e valorepayments
ricevono la configurazione filtrata.
Utilizzare certificati e chiavi mesh firmati dal servizio CA
Podspec specifica l'annotazione enableManagedCerts
:
spec: ... annotations: ... cloud.google.com/enableManagedCerts: "true" ...
Quando il pod viene inizializzato, i certificati e le chiavi firmati dal servizio CA vengono montati automaticamente sul file system del proxy sidecar locale.
Configurazione della porta di intercettazione del traffico in entrata
Il file podspec specifica l'annotazione includeInboundPorts
:
spec: ... annotations: ... cloud.google.com/includeInboundPorts: "8000" ...
Questa è la porta su cui l'applicazione server è in ascolto per le connessioni. Quando del pod viene inizializzato, il proxy sidecar raccoglie questa annotazione e trasmette in Cloud Service Mesh. Cloud Service Mesh può quindi utilizzare queste informazioni per inviare nuovamente la configurazione filtrata che intercetta tutto il traffico in entrata su questa porta e può applicare criteri di sicurezza.
La porta del controllo di integrità deve essere diversa dalla porta dell'applicazione. In caso contrario, alle connessioni in arrivo alla porta di controllo dell'integrità verranno applicati gli stessi criteri di sicurezza, il che potrebbe comportare il rifiuto delle connessioni e il conseguente erroneo scambio del server per non integro.
Configurare i servizi GKE con i NEG
I servizi GKE devono essere esposti tramite gruppi di endpoint di rete
(NEG) in modo da poterli configurare come backend di un backend Cloud Service Mesh
completamente gestito di Google Cloud. Il pacchetto service_sample.yaml
fornito in questa guida alla configurazione utilizza
il nome NEG service-test-neg
nella seguente annotazione:
... metadata: annotations: cloud.google.com/neg: '{"exposed_ports": {"80":{"name": "service-test-neg"}}}' spec: ports: - port: 80 name: service-test protocol: TCP targetPort: 8000
Non è necessario modificare il file service_sample.yaml
.
Salvataggio del nome del NEG
Salva il nome del NEG nella variabile NEG_NAME:
NEG_NAME="service-test-neg"
Eseguire il deployment di un'applicazione client in GKE
Esegui questo comando per avviare un client dimostrativo con un proxy Envoy come file collaterale, di cui hai bisogno per dimostrare le funzionalità di sicurezza.
wget -q -O - https://storage.googleapis.com/traffic-director/security/ga/client_sample.yaml | sed -e s/DEMO_CLIENT_KSA_PLACEHOLDER/DEMO_CLIENT_KSA/g > client_sample.yaml kubectl apply -f client_sample.yaml
Il podspec del client include solo l'annotazione enableManagedCerts
. Questo è
necessaria per montare i volumi necessari per il mesh gestito da GKE
e chiavi firmati dall'istanza di servizio CA.
Configurazione delle risorse Google Cloud di Cloud Service Mesh
Segui i passaggi descritti in Configurare Cloud Service Mesh con i componenti di bilanciamento del carico di Cloud. Assicurati di verificare che il traffico dal client di esempio sia instradato al servizio di esempio.
La configurazione di Cloud Service Mesh è stata completata e ora puoi configurarla di autenticazione e autorizzazione.
Configura la sicurezza service-to-service
Utilizza le istruzioni nelle sezioni seguenti per configurare l'attributo service-to-service sicurezza.
Attiva mTLS nella rete mesh
Per configurare mTLS nel tuo mesh, devi proteggere il traffico in uscita verso il servizio di backend e il traffico in entrata verso l'endpoint.
Formato per i riferimenti alle norme
Tieni presente il seguente formato obbligatorio per fare riferimento a TLS del server, TLS del client e ai criteri di autorizzazione:
projects/PROJECT_ID/locations/global/[serverTlsPolicies|clientTlsPolicies|authorizationPolicies]/[server-tls-policy|client-mtls-policy|authz-policy]
Ad esempio:
projects/PROJECT_ID/locations/global/serverTlsPolicies/server-tls-policy
projects/PROJECT_ID/locations/global/clientTlsPolicies/client-mtls-policy
projects/PROJECT_ID/locations/global/authorizationPolicies/authz-policy
Proteggere il traffico in uscita verso il servizio di backend
Per proteggere il traffico in uscita, crea innanzitutto un criterio TLS del client che svolga quanto segue:
- Usa
google_cloud_private_spiffe
come plug-in perclientCertificate
, quale programma Envoy per utilizzare i certificati mesh gestiti da GKE. come identità client. - Usa
google_cloud_private_spiffe
come plug-in perserverValidationCa
quale programma Envoy per utilizzare i certificati mesh gestiti da GKE. per la convalida del server.
Successivamente, devi collegare il criterio TLS del client al servizio di backend. In questo modo seguenti:
- Applica il criterio di autenticazione del criterio TLS del client alle connessioni in uscita agli endpoint del servizio di backend.
- SAN (Subject Alternative Name) indica al client di affermare l'esatto e l'identità del server a cui si connette.
Crea il criterio TLS del client in un file
client-mtls-policy.yaml
:name: "client-mtls-policy" clientCertificate: certificateProviderInstance: pluginInstance: google_cloud_private_spiffe serverValidationCa: - certificateProviderInstance: pluginInstance: google_cloud_private_spiffe
Importa il criterio TLS del client:
gcloud network-security client-tls-policies import client-mtls-policy \ --source=client-mtls-policy.yaml --location=global
Collega il criterio TLS del client al servizio di backend. Questa operazione applica mTLS autenticazione su tutte le richieste in uscita dal client a questo backend completamente gestito di Google Cloud.
gcloud compute backend-services export td-gke-service \ --global --destination=demo-backend-service.yaml
Aggiungi le seguenti righe a
demo-backend-service.yaml
:securitySettings: clientTlsPolicy: projects/PROJECT_ID/locations/global/clientTlsPolicies/client-mtls-policy subjectAltNames: - "spiffe://PROJECT_ID.svc.id.goog/ns/K8S_NAMESPACE/sa/DEMO_SERVER_KSA"
Importa i valori:
gcloud compute backend-services import td-gke-service \ --global --source=demo-backend-service.yaml
Facoltativamente, esegui questo comando per verificare se la richiesta non riesce. Si tratta di un errore previsto, perché il client si aspetta i certificati dall'endpoint, ma l'endpoint non è programmato con un criterio di sicurezza.
# Get the name of the Podrunning Busybox. BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}') # Command to execute that tests connectivity to the service service-test. TEST_CMD="wget -q -O - service-test; echo" # Execute the test command on the pod. kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"
Verrà visualizzato un output come il seguente:
wget: server returned error: HTTP/1.1 503 Service Unavailable
Proteggere il traffico in entrata verso l'endpoint
Per proteggere il traffico in entrata, crea innanzitutto un criterio TLS del server che svolga quanto segue:
- Usa
google_cloud_private_spiffe
come plug-in perserverCertificate
, quale programma Envoy per utilizzare i certificati mesh gestiti da GKE. come identità del server. - Usa
google_cloud_private_spiffe
come plug-in perclientValidationCa
, quale programma Envoy per utilizzare i certificati mesh gestiti da GKE. per la convalida del client.
Salva i valori dei criteri TLS del server in un file denominato
server-mtls-policy.yaml
.name: "server-mtls-policy" serverCertificate: certificateProviderInstance: pluginInstance: google_cloud_private_spiffe mtlsPolicy: clientValidationCa: - certificateProviderInstance: pluginInstance: google_cloud_private_spiffe
Crea il criterio TLS del server:
gcloud network-security server-tls-policies import server-mtls-policy \ --source=server-mtls-policy.yaml --location=global
Crea un file denominato
ep_mtls.yaml
contenente il corrispettivo dell'endpoint e alliga il criterio TLS del server.endpointMatcher: metadataLabelMatcher: metadataLabelMatchCriteria: MATCH_ALL metadataLabels: - labelName: app labelValue: payments name: "ep" serverTlsPolicy: projects/PROJECT_ID/locations/global/serverTlsPolicies/server-mtls-policy type: SIDECAR_PROXY
Importa il matcher degli endpoint.
gcloud network-services endpoint-policies import ep \ --source=ep_mtls.yaml --location=global
Convalida la configurazione
Esegui questo comando curl
. Se la richiesta viene completata correttamente, viene visualizzato x-forwarded-client-cert
nell'output. L'intestazione viene stampata solo quando la connessione è mTLS.
# Get the name of the Podrunning Busybox. BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}') # Command to execute that tests connectivity to the service service-test. TEST_CMD="wget -q -O - service-test; echo" # Execute the test command on the pod. kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"
Verrà visualizzato un output simile al seguente:
GET /get HTTP/1.1 Host: service-test content-length: 0 x-envoy-internal: true accept: */* x-forwarded-for: 10.48.0.6 x-envoy-expected-rq-timeout-ms: 15000 user-agent: curl/7.35.0 x-forwarded-proto: http x-request-id: redacted x-forwarded-client-cert: By=spiffe://PROJECT_ID.svc.id.goog/ns/K8S_NAMESPACE/sa/DEMO_SERVER_KSA;Hash=Redacted;Subject="Redacted;URI=spiffe://PROJECT_ID.svc.id.goog/ns/K8S_NAMESPACE/sa/DEMO_CLIENT_KSA
Tieni presente che l'intestazione x-forwarded-client-cert
viene inserita da Envoy lato server e contiene la propria identità (server) e l'identità del client di origine. Poiché vediamo sia le identità del client sia quelle del server, questo è un indicatore di una connessione mTLS.
Configurare l'accesso a livello di servizio con un criterio di autorizzazione
Queste istruzioni creano un criterio di autorizzazione che consente le richieste
vengono inviati dall'account DEMO_CLIENT_KSA
in cui il nome host è
service-test
, la porta è 8000
e il metodo HTTP è GET
. Prima di creare i criteri di autorizzazione, leggi l'avviso in Limitare l'accesso utilizzando l'autorizzazione.
Crea un criterio di autorizzazione creando un file denominato
authz-policy.yaml
.action: ALLOW name: authz-policy rules: - sources: - principals: - spiffe://PROJECT_ID.svc.id.goog/ns/K8S_NAMESPACE/sa/DEMO_CLIENT_KSA destinations: - hosts: - service-test ports: - 8000 methods: - GET
Importa il criterio:
gcloud network-security authorization-policies import authz-policy \ --source=authz-policy.yaml \ --location=global
Aggiorna il criterio dell'endpoint in modo che faccia riferimento al nuovo criterio di autorizzazione aggiungendo quanto segue al file
ep_mtls.yaml
:authorizationPolicy: projects/PROJECT_ID/locations/global/authorizationPolicies/authz-policy
Il criterio dell'endpoint ora specifica che sia mTLS sia il protocollo deve essere applicato in modo forzato alle richieste in entrata ai pod il cui sidecar Envoy i proxy presentano l'etichetta
app:payments
.Importa il criterio:
gcloud network-services endpoint-policies import ep \ --source=ep_mtls.yaml --location=global
Convalida la configurazione
Esegui questi comandi per convalidare la configurazione.
# Get the name of the Podrunning Busybox. BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}') # Command to execute that tests connectivity to the service service-test. # This is a valid request and will be allowed. TEST_CMD="wget -q -O - service-test; echo" # Execute the test command on the pod. kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"
L'output previsto è simile al seguente:
GET /get HTTP/1.1 Host: service-test content-length: 0 x-envoy-internal: true accept: */* x-forwarded-for: redacted x-envoy-expected-rq-timeout-ms: 15000 user-agent: curl/7.35.0 x-forwarded-proto: http x-request-id: redacted x-forwarded-client-cert: By=spiffe://PROJECT_ID.svc.id.goog/ns/K8S_NAMESPACE/sa/DEMO_SERVER_KSA;Hash=Redacted;Subject="Redacted;URI=spiffe://PROJECT_ID.svc.id.goog/ns/K8S_NAMESPACE/sa/DEMO_CLIENT_KSA
Esegui i seguenti comandi per verificare se il criterio di autorizzazione rifiuta correttamente le richieste non valide:
# Failure case # Command to execute that tests connectivity to the service service-test. # This is an invalid request and server will reject because the server # authorization policy only allows GET requests. TEST_CMD="wget -q -O - service-test --post-data='' ; echo" # Execute the test command on the pod. kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"
L'output previsto è simile al seguente:
<RBAC: access denied HTTP/1.1 403 Forbidden>
Configura la sicurezza del gateway in entrata
Questa sezione presuppone che tu abbia completato la sezione sulla sicurezza tra servizi, tra cui la configurazione del cluster GKE con l'auto-injector del sidecar, creando un'autorità di certificazione e la creazione di un criterio endpoint.
In questa sezione eseguirai il deployment di un proxy Envoy come gateway in entrata che termina Connessioni TLS e autorizza le richieste dai client interni di un cluster.
Per configurare un gateway di ingresso per terminare TLS:
- Esegui il deployment di un servizio Kubernetes raggiungibile utilizzando un indirizzo IP interno del cluster.
- Il deployment è costituito da un proxy Envoy autonomo esposto come servizio Kubernetes e connesso a Cloud Service Mesh.
- Crea un criterio TLS del server per terminare TLS.
- Crea un criterio di autorizzazione per autorizzare le richieste in entrata.
Esegui il deployment di un servizio gateway in entrata in GKE
Esegui questo comando per eseguire il deployment del servizio gateway in entrata GKE:
wget -q -O - https://storage.googleapis.com/traffic-director/security/ga/gateway_sample_xdsv3.yaml | sed -e s/PROJECT_NUMBER_PLACEHOLDER/PROJNUM/g | sed -e s/NETWORK_PLACEHOLDER/default/g | sed -e s/DEMO_CLIENT_KSA_PLACEHOLDER/DEMO_CLIENT_KSA/g > gateway_sample.yaml kubectl apply -f gateway_sample.yaml
Il file gateway_sample.yaml
è la specifica del gateway di ingresso. Le sezioni seguenti descrivono alcune aggiunte alle specifiche.
Disattivazione dell'inserimento collaterale di Cloud Service Mesh
La specifica gateway_sample.yaml
esegue il deployment di un proxy Envoy come unico container. Nella
passaggi precedenti, Envoy è stato inserito come file collaterale di un container di applicazioni. A
evitare che più Envoy gestiscono le richieste, puoi disattivare l'inserimento collaterale
per questo servizio Kubernetes usando la seguente istruzione:
sidecar.istio.io/inject: "false"
Monta il volume corretto
La specifica gateway_sample.yaml
monta il volume gke-workload-certificates
.
Questo volume viene utilizzato anche per il deployment di sidecar, ma viene aggiunto automaticamente dall'iniettore sidecar quando vede l'annotazionecloud.google.com/enableManagedCerts: "true"
. gke-workload-certificates
contiene i certificati e le chiavi SPIFFE gestiti da GKE firmati
di CA Service che hai configurato.
Impostare l'indirizzo IP interno del cluster
Configura il gateway in entrata con un servizio di tipo ClusterInternal
. In questo modo viene creato un nome host DNS risolvibile internamente per mesh-gateway
. Quando un
client invia una richiesta a mesh-gateway:443
, Kubernetes
indirizza immediatamente la richiesta alla porta8080
del deployment di Envoy del gateway di ingresso.
Abilita TLS su un gateway in entrata
Utilizza queste istruzioni per abilitare TLS su un gateway in entrata.
Crea una risorsa di criterio TLS del server per terminare le connessioni TLS, con il in un file denominato
server-tls-policy.yaml
:description: tls server policy name: server-tls-policy serverCertificate: certificateProviderInstance: pluginInstance: google_cloud_private_spiffe
Importa il criterio TLS del server:
gcloud network-security server-tls-policies import server-tls-policy \ --source=server-tls-policy.yaml --location=global
Crea una nuova mappa URL che indirizzi tutte le richieste al servizio di backend
td-gke-service
. Il gateway in entrata gestisce le richieste in entrata e le invia ai pod appartenente al servizio di backendtd-gke-service
.gcloud compute url-maps create td-gke-ig-url-map \ --default-service=td-gke-service
Crea un nuovo proxy HTTPS di destinazione nel file
td-gke-https-proxy.yaml
e collega la mappa URL e il criterio TLS del server creati in precedenza. Questa operazione configura il gateway in entrata proxy Envoy e terminare il traffico TLS in entrata.kind: compute#targetHttpsProxy name: td-gke-https-proxy proxyBind: true urlMap: https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/urlMaps/td-gke-ig-url-map serverTlsPolicy: projects/PROJECT_ID/locations/global/serverTlsPolicies/server-tls-policy
Importa il criterio:
gcloud compute target-https-proxies import td-gke-https-proxy \ --global --source=td-gke-https-proxy.yaml
Crea una nuova regola di forwarding e collega il proxy HTTPS di destinazione. Questo configura il proxy Envoy per rimanere in ascolto sulla porta 8080 e applicare il routing e criteri di sicurezza definiti in
td-gke-https-proxy
.gcloud compute forwarding-rules create td-gke-gateway-forwarding-rule --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED --address=0.0.0.0 \ --target-https-proxy=td-gke-https-proxy --ports 8080 \ --network default
Facoltativamente, aggiorna i criteri di autorizzazione nei backend per consentire le richieste se sono soddisfatte tutte le seguenti condizioni:
- Richieste inviate da
DEMO_CLIENT_KSA
. Il deployment del gateway di ingresso utilizza l'account di servizioDEMO_CLIENT_KSA
. - Richieste con host
mesh-gateway
oservice-test
- Porta:
8000
Non è necessario eseguire questi comandi, a meno che non abbia configurato un criterio di autorizzazione per i tuoi backend. Se non è presente un criterio di autorizzazione nell'endpoint o non contiene la corrispondenza dell'host o dell'entità di origine le richieste sono consentite senza questo passaggio. Aggiungi questi valori a
authz-policy.yaml
.action: ALLOW name: authz-policy rules: - sources: - principals: - spiffe://PROJECT_ID.svc.id.goog/ns/K8S_NAMESPACE/sa/DEMO_CLIENT_KSA destinations: - hosts: - service-test - mesh-gateway ports: - 8000 methods: - GET
- Richieste inviate da
Importa il criterio:
gcloud network-security authorization-policies import authz-policy \ --source=authz-policy.yaml \ --location=global
Convalida il deployment del gateway in entrata
Utilizzi un nuovo contenitore denominato debug
per inviare richieste al gateway di ingresso per convalidare il deployment.
Nella specifica seguente, l'annotazione "sidecar.istio.io/inject":"false"
impedisce all'iniettore di sidecar di Cloud Service Mesh di iniettare automaticamente un proxy sidecar. Non esiste un file collaterale che aiuti il container debug
nel routing delle richieste.
Il contenitore deve connettersi al gateway di ingresso per il routing.
La specifica include il flag --no-check-certificate
, che ignora la convalida del
certificato del server. Il container debug
non dispone del certificato
certificati di convalida dell'autorità necessari per convalidare i certificati firmati da
Servizio CA utilizzato dal gateway in entrata per la terminazione
TLS.
In un ambiente di produzione, ti consigliamo di scaricare il servizio CA
certificato di convalida e montarlo o installarlo
il cliente. Dopo aver installato il certificato di convalida, rimuovi l'opzione --no-check-certificate
del comando wget
.
Esegui questo comando:
kubectl run -i --tty --rm debug --image=busybox --restart=Never --overrides='{ "metadata": {"annotations": { "sidecar.istio.io/inject":"false" } } }' -- /bin/sh -c "wget --no-check-certificate -qS -O - https://mesh-gateway; echo"
Vedrai un output simile a questo:
GET / HTTP/1.1 Host: 10.68.7.132 x-forwarded-client-cert: By=spiffe://PROJECT_ID.svc.id.goog/ns/K8S_NAMESPACE/sa/DEMO_SERVER_KSA;Hash=Redacted;Subject="Redacted;URI=spiffe://PROJECT_ID.svc.id.goog/ns/K8S_NAMESPACE/sa/DEMO_CLIENT_KSA x-envoy-expected-rq-timeout-ms: 15000 x-envoy-internal: true x-request-id: 5ae429e7-0e18-4bd9-bb79-4e4149cf8fef x-forwarded-for: 10.64.0.53 x-forwarded-proto: https content-length: 0 user-agent: Wget
Esegui il seguente comando di test negativo:
# Negative test # Expect this to fail because gateway expects TLS. kubectl run -i --tty --rm debug --image=busybox --restart=Never --overrides='{ "metadata": {"annotations": { "sidecar.istio.io/inject":"false" } } }' -- /bin/sh -c "wget --no-check-certificate -qS -O - http://mesh-gateway:443/headers; echo"
Viene visualizzato un output simile al seguente:
wget: error getting response: Connection reset by peer
Esegui il seguente comando di test negativo:
# Negative test. # AuthorizationPolicy applied on the endpoints expect a GET request. Otherwise # the request is denied authorization. kubectl run -i --tty --rm debug --image=busybox --restart=Never --overrides='{ "metadata": {"annotations": { "sidecar.istio.io/inject":"false" } } }' -- /bin/sh -c "wget --no-check-certificate -qS -O - https://mesh-gateway --post-data=''; echo"
Verrà visualizzato un output simile al seguente:
HTTP/1.1 403 Forbidden wget: server returned error: HTTP/1.1 403 Forbidden
Configurazione di un criterio di autorizzazione per il gateway in entrata
Il criterio di autorizzazione configurato qui consente al gateway in entrata di consentire le richieste nel mesh quando sono soddisfatte tutte le seguenti condizioni:
- Host:
mesh-gateway
- Porta:
8080
- path:
*
- Metodo HTTP GET
Crea un criterio di autorizzazione nel file
authz-gateway-policy.yaml
:action: ALLOW name: authz-gateway-policy rules: - destinations: - hosts: - mesh-gateway ports: - 8080 methods: - GET
Importa i valori nel file:
gcloud network-security authorization-policies import authz-gateway-policy \ --source=authz-gateway-policy.yaml --location=global
Modifica il file
td-gke-https-proxy.yaml
aggiungendo quanto segue:authorizationPolicy: projects/PROJECT_ID/locations/global/authorizationPolicies/authz-gateway-policy
Importa di nuovo il file td-gke-https-proxy.yaml:
gcloud compute target-https-proxies import td-gke-https-proxy \ --global --source=td-gke-https-proxy.yaml
Convalida il deployment
Esegui questo comando per convalidare il deployment.
# On your localhost. kubectl run -i --tty --rm debug --image=busybox --restart=Never --overrides='{ "metadata": {"annotations": { "sidecar.istio.io/inject":"false" } } }' -- /bin/sh -c "wget --no-check-certificate -qS -O - https://mesh-gateway; echo"
Viene visualizzato un output simile al seguente:
GET / HTTP/1.1 Host: 35.196.50.2 x-forwarded-client-cert: By=spiffe://PROJECT_ID.svc.id.goog/ns/K8S_NAMESPACE/sa/DEMO_SERVER_KSA;Hash=Redacted;Subject="Redacted;URI=spiffe://PROJECT_ID.svc.id.goog/ns/K8S_NAMESPACE/sa/DEMO_CLIENT_KSA x-envoy-expected-rq-timeout-ms: 15000 user-agent: curl/7.72.0 x-forwarded-proto: https content-length: 0 x-envoy-internal: true x-request-id: 98bec135-6df8-4082-8edc-b2c23609295a accept: */* x-forwarded-for: 10.142.0.7
Esegui il seguente comando di test negativo:
# Negative test. Expect failure because only POST method is allowed by \ # authz-gateway-policy kubectl run -i --tty --rm debug --image=busybox --restart=Never --overrides='{ "metadata": {"annotations": { "sidecar.istio.io/inject":"false" } } }' -- /bin/sh -c "wget --no-check-certificate -qS -O - https://mesh-gateway/ --post-data=''; echo"
Viene visualizzato un output simile al seguente:
wget: server returned error: HTTP/1.1 403 Forbidden
Elimina il deployment
Facoltativamente, puoi eseguire questi comandi per eliminare il deployment che hai creato utilizzando questa guida.
Per eliminare il cluster, esegui questo comando:
gcloud container clusters delete CLUSTER_NAME --zone ZONE --quiet
Per eliminare le risorse che hai creato, esegui questi comandi:
gcloud compute forwarding-rules delete td-gke-forwarding-rule --global --quiet gcloud compute forwarding-rules delete td-gke-gateway-forwarding-rule --global \ --quiet gcloud compute target-http-proxies delete td-gke-proxy --quiet gcloud compute target-https-proxies delete td-gke-https-proxy --quiet gcloud compute url-maps delete td-gke-url-map --quiet gcloud compute url-maps delete td-gke-ig-url-map --quiet gcloud compute backend-services delete td-gke-service --global --quiet cloud compute network-endpoint-groups delete service-test-neg --zone ZONE --quiet gcloud compute firewall-rules delete fw-allow-health-checks --quiet gcloud compute health-checks delete td-gke-health-check --quiet gcloud network-services endpoint-policies delete ep \ --location=global --quiet gcloud network-security authorization-policies delete authz-gateway-policy \ --location=global --quiet gcloud network-security authorization-policies delete authz-policy \ --location=global --quiet gcloud network-security client-tls-policies delete client-mtls-policy \ --location=global --quiet gcloud network-security server-tls-policies delete server-tls-policy \ --location=global --quiet gcloud network-security server-tls-policies delete server-mtls-policy \ --location=global --quiet
Limitazioni
La sicurezza del servizio Cloud Service Mesh è supportata solo con con GKE. Non puoi eseguire il deployment della sicurezza dei servizi con Compute Engine.
Risoluzione dei problemi
Questa sezione contiene informazioni su come risolvere i problemi riscontrati durante la configurazione del servizio di sicurezza.
Errori di connessione
Se la connessione non riesce con un errore upstream connect
o disconnect/reset
before headers
, esamina i log di Envoy, dove potresti visualizzare uno dei seguenti messaggi di log:
gRPC config stream closed: 5, Requested entity was not found
gRPC config stream closed: 2, no credential token is found
Se vedi questi errori nel log di Envoy, è probabile che il servizio
il token dell'account è stato montato in modo errato o sta utilizzando un altro audience
, oppure
entrambi.
Per ulteriori informazioni, consulta Messaggi di errore nei log di Envoy che indicano un problema di configurazione.
Pod non creati
Per risolvere questo problema, consulta Risoluzione dei problemi dei deployment automatici per i pod GKE.
Envoy non si autentica con Cloud Service Mesh
Quando Envoy (envoy-proxy
) si connette a Cloud Service Mesh per recuperare xDS
utilizza la federazione delle identità per i carichi di lavoro per GKE e la VM
account di servizio predefinito (a meno che non sia stato modificato il bootstrap). Se l'autenticazione non va a buon fine, Envoy non entra nello stato di disponibilità.
Impossibile creare un cluster con --workload-identity-certificate-authority flag
Se vedi questo errore, assicurati di utilizzare la versione più recente di Google Cloud CLI:
gcloud components update
I pod rimangono in stato di attesa
Se i pod rimangono in uno stato in attesa durante la procedura di configurazione, aumenta le risorse di CPU e memoria per i pod nella specifica di deployment.
Impossibile creare il cluster con il flag --enable-mesh-certificates
Assicurati di eseguire l'ultima versione di gcloud CLI:
gcloud components update
Tieni presente che il flag --enable-mesh-certificates
funziona solo con gcloud beta
.
I pod non si avviano
I pod che utilizzano i certificati mesh GKE potrebbero non avviarsi se il provisioning dei certificati non funziona. Ciò può accadere in situazioni come le seguenti:
WorkloadCertificateConfig
oTrustConfig
è configurato in modo errato o manca.- I CSR non vengono approvati.
Puoi verificare se il provisioning del certificato non è andato a buon fine controllando il pod eventi.
Controlla lo stato del tuo pod:
kubectl get pod -n POD_NAMESPACE POD_NAME
Sostituisci quanto segue:
POD_NAMESPACE
: lo spazio dei nomi del pod.POD_NAME
: il nome del pod.
Controlla gli eventi recenti per il tuo pod:
kubectl describe pod -n POD_NAMESPACE POD_NAME
Se il provisioning del certificato non riesce, verrà visualizzato un evento con
Type=Warning
,Reason=FailedMount
,From=kubelet
e un campoMessage
che inizia conMountVolume.SetUp failed for volume "gke-workload-certificates"
. Il campoMessage
contiene informazioni sulla risoluzione dei problemi.Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedMount 13s (x7 over 46s) kubelet MountVolume.SetUp failed for volume "gke-workload-certificates" : rpc error: code = Internal desc = unable to mount volume: store.CreateVolume, err: unable to create volume "csi-4d540ed59ef937fbb41a9bf5380a5a534edb3eedf037fe64be36bab0abf45c9c": caPEM is nil (check active WorkloadCertificateConfig)
Consulta i seguenti passaggi per la risoluzione dei problemi se i pod non si avviano a causa di oggetti configurati in modo errato o di CSR rifiutate.
WorkloadCertificateConfig
o TrustConfig
è configurato in modo errato
Assicurati di aver creato i campi WorkloadCertificateConfig
e TrustConfig
correttamente gli oggetti. Puoi diagnosticare gli errori di configurazione su una di queste opzioni
utilizzando kubectl
.
Recupera lo stato attuale.
Per
WorkloadCertificateConfig
:kubectl get WorkloadCertificateConfig default -o yaml
Per
TrustConfig
:kubectl get TrustConfig default -o yaml
Controlla l'output dello stato. Un oggetto valido avrà una condizione
type: Ready
estatus: "True"
.status: conditions: - lastTransitionTime: "2021-03-04T22:24:11Z" message: WorkloadCertificateConfig is ready observedGeneration: 1 reason: ConfigReady status: "True" type: Ready
Per gli oggetti non validi, viene invece visualizzato
status: "False"
. Lereason
e Il campomessage
contiene ulteriori dettagli sulla risoluzione dei problemi.
I CSR non sono approvati
Se si verifica un problema durante la procedura di approvazione del CSR, puoi controllare i dettagli dell'errore nelle condizioni type: Approved
e type: Issued
del CSR.
Elenca i CSR pertinenti utilizzando
kubectl
:kubectl get csr \ --field-selector='spec.signerName=spiffe.gke.io/spiffe-leaf-signer'
Scegli un CSR che sia
Approved
e nonIssued
oppure non siaApproved
.Visualizza i dettagli della CSR selezionata utilizzando kubectl:
kubectl get csr CSR_NAME -o yaml
Sostituisci
CSR_NAME
con il nome del CSR che hai scelto.
Un CSR valido ha una condizione con type: Approved
e status: "True"
e un
certificato valido nel campo status.certificate
:
status:
certificate: <base64-encoded data>
conditions:
- lastTransitionTime: "2021-03-04T21:58:46Z"
lastUpdateTime: "2021-03-04T21:58:46Z"
message: Approved CSR because it is a valid SPIFFE SVID for the correct identity.
reason: AutoApproved
status: "True"
type: Approved
Le informazioni per la risoluzione dei problemi relativi ai CSR non validi vengono visualizzate nei campi message
e
reason
.
Le applicazioni non possono utilizzare le credenziali mTLS emesse
Verifica che il certificato non sia scaduto:
cat /var/run/secrets/workload-spiffe-credentials/certificates.pem | openssl x509 -text -noout | grep "Not After"
Verifica che il tipo di chiave utilizzato sia supportato dalla tua applicazione.
cat /var/run/secrets/workload-spiffe-credentials/certificates.pem | openssl x509 -text -noout | grep "Public Key Algorithm" -A 3
Verifica che l'autorità di certificazione emittente utilizzi la stessa famiglia di chiavi della chiave del certificato.
Visualizza lo stato dell'istanza del servizio CA (Anteprima):
gcloud privateca ISSUING_CA_TYPE describe ISSUING_CA_NAME \ --location ISSUING_CA_LOCATION
Sostituisci quanto segue:
ISSUING_CA_TYPE
: il tipo di CA emittente, che deve esseresubordinates
oroots
.ISSUING_CA_NAME
: il nome della CA emittente.ISSUING_CA_LOCATION
: la regione della CA emittente.
Verifica che
keySpec.algorithm
nell'output sia lo stesso algoritmo chiave che hai definito nel manifest YAMLWorkloadCertificateConfig
. L'output è il seguente:config: ... subjectConfig: commonName: td-sub-ca subject: organization: TestOrgLLC subjectAltName: {} createTime: '2021-05-04T05:37:58.329293525Z' issuingOptions: includeCaCertUrl: true keySpec: algorithm: RSA_PKCS1_2048_SHA256 ...
I certificati vengono rifiutati
- Verifica che l'applicazione peer utilizzi lo stesso bundle di attendibilità per verificare il certificato.
Verifica che il certificato non sia scaduto:
cat /var/run/secrets/workload-spiffe-credentials/certificates.pem | openssl x509 -text -noout | grep "Not After"
Verifica che il codice client, se non utilizza l'API di ricaricamento delle credenziali gRPC Go, aggiorni periodicamente le credenziali dal file system.
Verifica che i tuoi carichi di lavoro si trovino nello stesso dominio attendibile della CA. I certificati del mesh GKE supportano la comunicazione tra i carichi di lavoro in un singolo dominio attendibile.