In Anthos Service Mesh 1.5 e versioni successive, il TLS automatico (mTLS automatico) è abilitato per impostazione predefinita. Con mTLS automatico, un proxy sidecar client rileva automaticamente se il server ha un file collaterale. Il client collaterale invia mTLS ai carichi di lavoro con sidecar e invia testo non crittografato ai carichi di lavoro senza sidecar. Tuttavia, tieni presente che i servizi accettano sia il traffico in testo non crittografato che il traffico mTLS. Quando inserisci i proxy sidecar nei tuoi pod, ti consigliamo anche di configurare i tuoi servizi in modo che accettino solo il traffico mTLS.
Con Anthos Service Mesh, puoi applicare mTLS, al di fuori del codice dell'applicazione, applicando un singolo file YAML. Anthos Service Mesh ti offre la flessibilità di applicare un criterio di autenticazione all'intero mesh di servizi, a uno spazio dei nomi o a un singolo carico di lavoro.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Al termine di questo tutorial, puoi evitare i costi continui eliminando le risorse che hai creato. Per ulteriori informazioni, consulta Pulizia.
Prima di iniziare
Verifica che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare che la fatturazione sia abilitata per il tuo progetto.
Installa Anthos Service Mesh su un cluster GKE ed esegui il deployment di un gateway in entrata. Se devi configurare un cluster per questo tutorial, consulta la guida rapida di Anthos Service Mesh, che illustra i seguenti passaggi:
- Creazione di un cluster GKE.
- Installazione di Anthos Service Mesh con il piano di controllo nel cluster.
- Deployment di un gateway in entrata.
- Deployment dell'applicazione di esempio Online Boutique dal repository
anthos-service-mesh-packages
, che viene modificato dal set originale di manifest nel repositorymicroservices-demo
. Seguendo le best practice, il deployment di ogni servizio viene eseguito in uno spazio dei nomi separato con un account di servizio univoco.
Accedi a Boutique online
Imposta il contesto attuale per
kubectl
sul cluster in cui hai eseguito il deployment di Boutique Online:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Elenca i servizi nello spazio dei nomi
frontend
:kubectl get services -n frontend
Nota che
frontend-external
è unLoadBalancer
e ha un indirizzo IP esterno. L'applicazione di esempio include un servizio che è un bilanciatore del carico per poterne eseguire il deployment su GKE senza Anthos Service Mesh.Visita l'applicazione nel browser utilizzando l'indirizzo IP esterno del servizio
frontend-external
:http://FRONTEND_EXTERNAL_IP/
Anthos Service Mesh ti offre la possibilità di eseguire il deployment di un gateway in entrata. Puoi anche accedere alla Boutique online utilizzando l'indirizzo IP esterno del gateway in entrata. Ottieni l'IP esterno del gateway. Sostituisci i segnaposto con le seguenti informazioni:
- GATEWAY_SERVICE_NAME : il nome del servizio gateway in entrata. Se hai eseguito il deployment del gateway di esempio senza modifiche o se hai eseguito il deployment del gateway in entrata predefinito, il nome è
istio-ingressgateway
. - GATEWAY_NAMESPACE: lo spazio dei nomi in cui hai eseguito il deployment
del gateway in entrata. Se hai eseguito il deployment del gateway in entrata predefinito, lo spazio dei nomi è
istio-system
.
kubectl get service GATEWAY_NAME -n GATEWAY_NAMESPACE
- GATEWAY_SERVICE_NAME : il nome del servizio gateway in entrata. Se hai eseguito il deployment del gateway di esempio senza modifiche o se hai eseguito il deployment del gateway in entrata predefinito, il nome è
Apri un'altra scheda nel browser e visita l'applicazione utilizzando l'indirizzo IP esterno del gateway in entrata:
http://INGRESS_GATEWAY_EXTERNAL_IP/
Esegui questo comando per
curl
il serviziofrontend
con HTTP normale da un altro pod. Poiché i servizi si trovano in spazi dei nomi diversi, devi curl il nome DNS del serviziofrontend
.kubectl exec \ $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \ -c istio-proxy -n product-catalog -- \ curl http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
La tua richiesta ha esito positivo con lo stato
200
, perché per impostazione predefinita sono accettati sia il traffico TLS sia il traffico in testo non crittografato.
Abilita TLS reciproco per spazio dei nomi
Puoi forzare l'applicazione di mTLS applicando un criterio PeerAuthentication
con kubectl
.
Salva il seguente criterio di autenticazione come
mtls-namespace.yaml
.cat <<EOF > mtls-namespace.yaml apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "namespace-policy" spec: mtls: mode: STRICT EOF
La riga
mode: STRICT
nel codice YAML configura i servizi in modo che accettino solo mTLS. Per impostazione predefinita,mode
èPERMISSIVE
, che configura i servizi per accettare sia il testo non crittografato che mTLS.Applica il criterio di autenticazione per configurare tutti i servizi di Boutique online in modo che accettino solo mTLS:
for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl apply -n $ns -f mtls-namespace.yaml done
Output previsto:
peerauthentication.security.istio.io/namespace-policy created peerauthentication.security.istio.io/namespace-policy created peerauthentication.security.istio.io/namespace-policy created peerauthentication.security.istio.io/namespace-policy created peerauthentication.security.istio.io/namespace-policy created peerauthentication.security.istio.io/namespace-policy created peerauthentication.security.istio.io/namespace-policy created peerauthentication.security.istio.io/namespace-policy created peerauthentication.security.istio.io/namespace-policy created peerauthentication.security.istio.io/namespace-policy created peerauthentication.security.istio.io/namespace-policy created
Vai alla scheda del browser che consente di accedere a Online Boutique utilizzando l'indirizzo IP esterno del servizio
frontend-external
:http://FRONTEND_EXTERNAL_IP/
Aggiorna la pagina. Il browser visualizza il seguente errore:
Se aggiorni la pagina, il testo non crittografato viene inviato al servizio
frontend
. A causa delSTRICT
criterio di autenticazione, il proxy sidecar blocca la richiesta al servizio.Vai alla scheda del browser che consente di accedere a Online Boutique utilizzando l'indirizzo IP esterno di
istio-ingressgateway
e aggiorna la pagina, che viene visualizzata correttamente. Quando accedi a Online Boutique utilizzando il gateway in entrata, la richiesta segue il percorso seguente:Flusso di autenticazione mTLS:
- Il browser invia una richiesta HTTP in testo non crittografato al server.
- Il container proxy del gateway in entrata intercetta la richiesta.
- Il proxy del gateway in entrata esegue un handshake TLS con il proxy lato server (il servizio di frontend in questo esempio). Questo handshake include uno scambio di certificati. Questi certificati sono precaricati nei container proxy da Anthos Service Mesh.
- Il proxy del gateway in entrata esegue un controllo della denominazione sicura sul certificato del server, verificando che il server sia in esecuzione da un'identità autorizzata.
- Il gateway in entrata e i proxy server stabiliscono una connessione TLS reciproca, mentre il proxy del server inoltra la richiesta al contenitore dell'applicazione server (il servizio frontend).
Esegui questo comando per
curl
il serviziofrontend
con HTTP normale da un altro pod.kubectl exec \ $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \ -c istio-proxy -n product-catalog -- \ curl http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
La tua richiesta non va a buon fine perché tutti i servizi di Boutique Online sono impostati su
STRICT
mTLS e il proxy sidecar blocca la richiesta al servizio.Output previsto:
000 command terminated with exit code 56
Visualizza lo stato di mTLS
Puoi visualizzare lo stato delle funzionalità di sicurezza di Anthos, inclusi i criteri di autenticazione, nella console Google Cloud.
Nella console Google Cloud, vai alla pagina Sicurezza di GKE Enterprise.
Seleziona il progetto Google Cloud dall'elenco a discesa nella barra dei menu.
Il riepilogo dei criteri mostra lo stato della sicurezza delle applicazioni, incluso mTLS.
Fai clic su Controllo dei criteri per visualizzare gli stati dei criteri dei carichi di lavoro per ciascun cluster e spazio dei nomi. La scheda Stato mTLS offre una panoramica. L'elenco Carichi di lavoro mostra lo stato mTLS di ciascun carico di lavoro.
Trovare ed eliminare i criteri di autenticazione
Per un elenco di tutti i criteri
PeerAuthentication
nel mesh di servizi:kubectl get peerauthentication --all-namespaces
L'output è simile al seguente:
NAMESPACE NAME MODE AGE ad namespace-policy STRICT 17m cart namespace-policy STRICT 17m checkout namespace-policy STRICT 17m currency namespace-policy STRICT 17m email namespace-policy STRICT 17m frontend namespace-policy STRICT 17m loadgenerator namespace-policy STRICT 17m payment namespace-policy STRICT 17m product-catalog namespace-policy STRICT 17m recommendation namespace-policy STRICT 17m shipping namespace-policy STRICT 17m
Elimina il criterio di autenticazione da tutti gli spazi dei nomi di Boutique online:
for ns in ad cart checkout currency email frontend loadgenerator payment \ product-catalog recommendation shipping; do kubectl delete peerauthentication -n $ns namespace-policy done;
Output previsto:
peerauthentication.security.istio.io "namespace-policy" deleted peerauthentication.security.istio.io "namespace-policy" deleted peerauthentication.security.istio.io "namespace-policy" deleted peerauthentication.security.istio.io "namespace-policy" deleted peerauthentication.security.istio.io "namespace-policy" deleted peerauthentication.security.istio.io "namespace-policy" deleted peerauthentication.security.istio.io "namespace-policy" deleted peerauthentication.security.istio.io "namespace-policy" deleted peerauthentication.security.istio.io "namespace-policy" deleted peerauthentication.security.istio.io "namespace-policy" deleted peerauthentication.security.istio.io "namespace-policy" deleted
Accedi alla Boutique online utilizzando l'indirizzo IP esterno del servizio
frontend-external
e aggiorna la pagina. La pagina viene visualizzata come previsto.Esegui questo comando per
curl
il serviziofrontend
con HTTP normale da un altro pod.kubectl exec \ $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \ -c istio-proxy -n product-catalog -- \ curl http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
La tua richiesta ha esito positivo con lo stato
200
, perché per impostazione predefinita sono accettati sia il traffico TLS sia il traffico in testo non crittografato.
Se nella console Google Cloud la pagina che mostra l'elenco Carichi di lavoro aggiorni la pagina, lo stato mTLS è Permissive
.
Abilita TLS reciproco per carico di lavoro
Per impostare un criterio PeerAuthentication
per un carico di lavoro specifico, devi configurare la sezione selector
e specificare le etichette che corrispondono al carico di lavoro desiderato.
Tuttavia, Anthos Service Mesh non può aggregare i criteri a livello di carico di lavoro per il traffico mTLS in uscita verso un servizio. Per gestire tale comportamento,
devi configurare una regola di destinazione.
Applica un criterio di autenticazione a un carico di lavoro specifico. Osserva come il seguente criterio utilizza etichette e selettori per scegliere come target il deployment
frontend
specifico.cat <<EOF | kubectl apply -n frontend -f - apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "frontend" namespace: "frontend" spec: selector: matchLabels: app: frontend mtls: mode: STRICT EOF
Output previsto:
peerauthentication.security.istio.io/frontend created
Configura una regola di destinazione corrispondente.
cat <<EOF | kubectl apply -n frontend -f - apiVersion: "networking.istio.io/v1alpha3" kind: "DestinationRule" metadata: name: "frontend" spec: host: "frontend.demo.svc.cluster.local" trafficPolicy: tls: mode: ISTIO_MUTUAL EOF
Output previsto:
destinationrule.networking.istio.io/frontend created
Accedi alla Boutique online utilizzando l'indirizzo IP esterno del servizio
frontend-external
e aggiorna la pagina. La pagina non viene visualizzata perché il criteriofrontend service
è impostato su mTLSSTRICT
e il proxy sidecar blocca la richiesta.Esegui questo comando per
curl
il serviziofrontend
con HTTP normale da un altro pod.kubectl exec \ $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \ -c istio-proxy -n product-catalog -- \ curl http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
La tua richiesta ha esito negativo con codice di stato
56
.Se nella console Google Cloud aggiorni la pagina che mostra l'elenco Carichi di lavoro, lo stato mTLS per il servizio
frontend
èStrict
e tutti gli altri servizi sono impostati suPermissive
.Elimina il criterio di autenticazione:
kubectl delete peerauthentication -n frontend frontend
Output previsto:
peerauthentication.security.istio.io "frontend" deleted
Elimina la regola di destinazione:
kubectl delete destinationrule -n frontend frontend
Output previsto:
destinationrule.networking.istio.io "frontend" deleted
Applicazione di mTLS a livello di mesh
Per impedire a tutti i servizi nel mesh di accettare il traffico di testo non crittografato, imposta un criterio PeerAuthentication
a livello di mesh con la modalità mTLS impostata su STRICT
.
Il criterio PeerAuthentication
a livello di mesh non deve avere un selettore e deve essere applicato nello spazio dei nomi principale, istio-system
. Quando esegui il deployment del criterio, il piano di controllo esegue automaticamente il provisioning dei certificati TLS in modo che i carichi di lavoro possano autenticarsi l'uno con l'altro.
Applica mTLS a livello di mesh:
kubectl apply -f - <<EOF apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "mesh-wide" namespace: "istio-system" spec: mtls: mode: STRICT EOF
Output previsto:
peerauthentication.security.istio.io/mesh-wide created
Accedi alla Boutique online utilizzando l'indirizzo IP esterno del servizio
frontend-external
e aggiorna la pagina. La pagina non viene visualizzata.Esegui questo comando per
curl
il serviziofrontend
con HTTP normale da un altro pod.kubectl exec \ $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \ -c istio-proxy -n product-catalog -- \ curl http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
La tua richiesta ha esito negativo con codice di stato
56
.Elimina il criterio
mesh-wide
:kubectl delete peerauthentication -n istio-system mesh-wide
Output previsto:
peerauthentication.security.istio.io "mesh-wide" deleted
Se aggiorni la pagina nella console Google Cloud, vedrai che i dettagli
mTLS
per tutti i servizi ora mostranoPermissive
.
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 addebiti aggiuntivi, elimina il cluster:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Se vuoi mantenere il cluster e rimuovere l'esempio di Boutique online:
- Elimina gli spazi dei nomi dell'applicazione:
kubectl delete -f online-boutique/kubernetes-manifests/namespaces
Output previsto:
namespace "ad" deleted namespace "cart" deleted namespace "checkout" deleted namespace "currency" deleted namespace "email" deleted namespace "frontend" deleted namespace "loadgenerator" deleted namespace "payment" deleted namespace "product-catalog" deleted namespace "recommendation" deleted namespace "shipping" deleted
- Elimina le voci di servizio:
kubectl delete -f online-boutique/istio-manifests/allow-egress-googleapis.yaml
Output previsto:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
Passaggi successivi
- Per una guida generale sulla configurazione dei criteri
PeerAuthentication
, consulta Configurazione della sicurezza del trasporto.