In questo tutorial imparerai che cos'è l'autorizzazione e come abilitarla
con Cloud Service Mesh su un'applicazione di esempio per scoprire come abilitare
di autorizzazione ai microservizi. Creerai un
AuthorizationPolicy
per accedere a DENY
a un microservizio, quindi crea un
AuthorizationPolicy
per ALLOW
accesso specifico a un microservizio.
Che cos'è l'autorizzazione?
L'autenticazione verifica un'identità: questo servizio è chi dice di essere?
L'autorizzazione verifica l'autorizzazione: questo servizio è autorizzato a farlo?
L'identità è fondamentale per questa idea. Con Cloud Service Mesh,AuthorizationPolicies
puoi controllare le comunicazioni da carico di lavoro a carico di lavoro nel tuo mesh per migliorare la sicurezza e l'accesso.
In un'architettura di microservizi, in cui le chiamate vengono effettuate oltre i confini della rete, Le regole firewall basate su IP spesso non sono adeguate per proteggere l'accesso carichi di lavoro con scale out impegnativi. Con Cloud Service Mesh, puoi impostare regole di autorizzazione per:
- Controlla l'accesso ai carichi di lavoro all'interno del tuo mesh, da carico di lavoro a carico di lavoro o da utente finale a carico di lavoro
- Definisci i criteri in modo ampio o granulare, a seconda delle tue esigenze.
Per una spiegazione dettagliata sulla configurazione di criteri e best practice, consulta Autorizzazione con Cloud Service Mesh.
Costi
Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:
Al termine del tutorial, puoi evitare i costi continui eliminando le risorse che hai creato. Per maggiori informazioni, vedi Pulizia.
Prima di iniziare
Assicurati che la fatturazione sia abilitata per il tuo progetto.
Esegui il provisioning di Cloud Service Mesh su un cluster GKE. Esistono diversi metodi di configurazione supportati:
Clona il repository:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples
Esegui il deployment di un gateway in entrata
Imposta il contesto attuale per
kubectl
sul cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Crea uno spazio dei nomi per il gateway in entrata:
kubectl create namespace asm-ingress
Abilita lo spazio dei nomi per l'inserimento. I passaggi dipendono dall'implementazione del piano di controllo.
Gestito (TD)
Applica l'etichetta di inserimento predefinita allo spazio dei nomi:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
Gestito (Istiod)
Consigliato: esegui questo comando per applicare l'etichetta di inserimento predefinita allo spazio dei nomi:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
Se sei già un utente con il piano di controllo Istiod gestito: consigliamo di utilizzare l'iniezione predefinita, ma è supportata anche l'iniezione basata su revisione. Segui queste istruzioni:
Esegui il comando seguente per individuare i canali di rilascio disponibili:
kubectl -n istio-system get controlplanerevision
L'output è simile al seguente:
NAME AGE asm-managed-rapid 6d7h
Nell'output, il valore sotto la colonna
NAME
è l'etichetta di revisione che corrisponde al canale di rilascio disponibile per la versione di Cloud Service Mesh.Applica l'etichetta di revisione allo spazio dei nomi:
kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Nel cluster
Consigliato: esegui questo comando per applicare l'etichetta di inserimento predefinita allo spazio dei nomi:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
Ti consigliamo di utilizzare l'inserimento predefinito, ma è supportato anche l'inserimento basato sulle revisioni: segui le istruzioni riportate di seguito:
Usa questo comando per individuare l'etichetta di revisione su
istiod
:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
Applica l'etichetta di revisione allo spazio dei nomi. Nel seguente comando,
REVISION_LABEL
è il valore dell'etichetta della revisioneistiod
che hai annotato nel passaggio precedente.kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Esegui il deployment del gateway di esempio nel repository
anthos-service-mesh-samples
:kubectl apply -n asm-ingress \ -f docs/shared/asm-ingress-gateway
Output previsto:
serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
Deployment dell'applicazione di esempio Online Boutique
Se non l'hai ancora fatto, imposta il contesto corrente per
kubectl
sul cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Crea lo spazio dei nomi per l'applicazione di esempio:
kubectl create namespace onlineboutique
Etichetta lo spazio dei nomi
onlineboutique
per inserire automaticamente i proxy Envoy. Segui i passaggi per attivare l'inserimento automatico del file collaterale.Esegui il deployment dell'app di esempio, di
VirtualService
per il frontend e degli account di servizio per i carichi di lavoro. Per questo tutorial, eseguirai il deployment di Online Boutique, un'app demo basata su microservizi.kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yaml kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
Visualizza i tuoi servizi
Visualizza i pod nello spazio dei nomi
onlineboutique
:kubectl get pods -n onlineboutique
Output previsto:
NAME READY STATUS RESTARTS AGE adservice-85598d856b-m84m6 2/2 Running 0 2m7s cartservice-c77f6b866-m67vd 2/2 Running 0 2m8s checkoutservice-654c47f4b6-hqtqr 2/2 Running 0 2m10s currencyservice-59bc889674-jhk8z 2/2 Running 0 2m8s emailservice-5b9fff7cb8-8nqwz 2/2 Running 0 2m10s frontend-77b88cc7cb-mr4rp 2/2 Running 0 2m9s loadgenerator-6958f5bc8b-55q7w 2/2 Running 0 2m8s paymentservice-68dd9755bb-2jmb7 2/2 Running 0 2m9s productcatalogservice-84f95c95ff-c5kl6 2/2 Running 0 114s recommendationservice-64dc9dfbc8-xfs2t 2/2 Running 0 2m9s redis-cart-5b569cd47-cc2qd 2/2 Running 0 2m7s shippingservice-5488d5b6cb-lfhtt 2/2 Running 0 2m7s
Tutti i pod per l'applicazione devono essere attivi e in esecuzione, con un valore
2/2
nella colonnaREADY
. Ciò indica che nei pod è stato inserito correttamente un proxy sidecar Envoy. Se dopo un paio di minuti non viene visualizzato2/2
, consulta la Guida alla risoluzione dei problemi.Ottieni l'IP esterno e impostalo su una variabile:
kubectl get services -n asm-ingress export FRONTEND_IP=$(kubectl --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )
Verrà visualizzato un output simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE asm-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
Visita l'indirizzo
EXTERNAL-IP
nel browser web. Dovresti vedere il negozio Online Boutique nel browser.
Nega tutte le autorizzazioni per un carico di lavoro
Questa sezione aggiunge un AuthorizationPolicy
per negare tutto il traffico in entrata al servizio di valute. AuthorizationPolicies
di lavoro trasformando
AuthorizationPolicies
in configurazioni leggibili da Envoy e l'applicazione delle configurazioni a
dai proxy collaterali. In questo modo, il proxy Envoy può autorizzare o negare le richieste in arrivo a un servizio.
Applica un
AuthorizationPolicy
acurrencyservice
. Osserva la corrispondenza nell'etichettacurrencyservice
del file YAML.kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutique
Prova ad accedere all'
EXTERNAL-IP
del gateway per visualizzare Boutique online sul web del browser. Dovresti visualizzare un errore di autorizzazione (errore di servizio interno 500) dacurrency service
.
Osserva i log del proxy sidecar
Per vedere cosa sta succedendo nel proxy sidecar, puoi esaminare i log nel pod.
Ottieni il nome del tuo pod
currencyservice
:CURRENCY_POD=$(kubectl get pod -n onlineboutique |grep currency|awk '{print $1}')
Imposta il proxy Envoy in modo da consentire i log del livello di traccia. Per impostazione predefinita, le chiamate di autorizzazione bloccate non vengono registrate:
kubectl debug --image istio/base --target istio-proxy -it $CURRENCY_POD -n onlineboutique -- curl -X POST "http://localhost:15000/logging?level=trace"
Output previsto:
none {:.devsite-disable-click-to-copy} active loggers: admin: trace alternate_protocols_cache: trace ... tracing: trace upstream: trace udp: trace wasm: trace
Utilizza
curl
per inviare il traffico al tuoEXTERNAL_IP
per generare i log:for i in {0..10}; do curl -s -I $FRONTEND_IP ; done
Visualizza i log relativi al controllo degli accessi basato sui ruoli (RBAC) in istio-proxy:
kubectl logs -n onlineboutique $CURRENCY_POD -c istio-proxy | grep -m5 rbac
Output previsto:
2022-07-08T14:19:20.442920Z debug envoy rbac checking request: requestedServerName: outbound_.7000_._.currencyservice.onlineboutique.svc.cluster.local, sourceIP: 10.8.8.5:34080, directRemoteIP: 10.8.8.5:34080, remoteIP: 10.8.8.5:34080,localAddress: 10.8.0.6:7000, ssl: uriSanPeerCertificate: spiffe://christineskim-tf-asm.svc.id.goog/ns/onlineboutique/sa/default, dnsSanPeerCertificate: , subjectPeerCertificate: OU=istio_v1_cloud_workload,O=Google LLC,L=Mountain View,ST=California,C=US, headers: ':method', 'POST' 2022-07-08T14:19:20.442944Z debug envoy rbac enforced denied, matched policy none 2022-07-08T14:19:20.442965Z debug envoy http [C73987][S13078781800499437460] Sending local reply with details rbac_access_denied_matched_policy[none] ```
Nei log dovresti vedere un messaggio enforced denied
che indica che currencyservice
è impostato per bloccare le richieste in entrata.
Consenti accesso limitato
Anziché un criterio DENYALL
, puoi impostare l'accesso in modo che sia consentito per determinate
carichi di lavoro con scale out impegnativi. Questo sarà rilevante in un'architettura di microservizi in cui vuoi assicurarti che solo i servizi autorizzati possano comunicare tra loro.
In questa sezione, attiverai la capacità dei servizi frontend
e checkout
di comunicare con il servizio currency
.
- Nel seguente file, verifica che un
source.principal
(client) specifico sia autorizzato ad accedere acurrencyservice
:
Applica il criterio:
kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutique
Visita
EXTERNAL-IP
nel tuo browser web. Ora dovresti essere in grado di accedere alla boutique online.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Per evitare che al tuo account Google Cloud vengano addebitati costi continui per le risorse usate in questo tutorial, puoi elimina il progetto o elimina delle singole risorse.
Elimina il progetto
In Cloud Shell, elimina il progetto:
gcloud projects delete PROJECT_ID
Elimina le risorse
Se vuoi conservare il cluster e rimuovere l'esempio di Boutique online:
Elimina gli spazi dei nomi dell'applicazione:
kubectl delete namespace onlineboutique
Risultato previsto:
namespace "onlineboutique" deleted
Elimina lo spazio dei nomi Ingress Gateway:
kubectl delete namespace asm-ingress
Risultato previsto:
amespace "asm-ingress" deleted
Se vuoi evitare addebiti aggiuntivi, elimina il cluster:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Passaggi successivi
- Per una guida generale sulla configurazione dei criteri
PeerAuthentication
, consulta Configurare la sicurezza del trasporto. - Esplora la dashboard di sicurezza della tua rete mesh con Monitorare la sicurezza del mesh.
- Approfondimento sui criteri di autorizzazione con Configurare le funzionalità avanzate dei criteri di autorizzazione.
- Acquisisci familiarità con le best practice per la sicurezza di Cloud Service Mesh.