In Cloud Service Mesh 1.5 e versioni successive, la funzionalità auto mutual TLS (auto mTLS) è abilitata per impostazione predefinita. Con mTLS automatico, un proxy sidecar lato client rileva automaticamente se il server ha un sidecar. Il sidecar client invia mTLS ai workload con sidecar e invia testo normale ai workload senza sidecar. Tieni presente, tuttavia, che i servizi accettano sia il traffico in testo normale che mTLS. Quando inserisci proxy sidecar nei tuoi pod, ti consigliamo di configurare i servizi in modo che accettino solo il traffico mTLS.
Con Cloud Service Mesh, puoi applicare mTLS, al di fuori del codice dell'applicazione, applicando un singolo file YAML. Cloud Service Mesh ti offre la flessibilità di applicare una norma di autenticazione all'interomesh di servizih, 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 in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Al termine di questo tutorial, puoi evitare costi continui eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Prima di iniziare
Assicurati che la fatturazione sia attivata per il tuo progetto.
Esegui il provisioning di Cloud Service Mesh su un cluster GKE. Esistono vari 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
Attiva lo spazio dei nomi per l'inserimento. I passaggi dipendono dall'implementazione del control plane.
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 un utente esistente con il piano di controllo Istiod gestito: ti consigliamo di utilizzare l'inserimento predefinito, ma è supportato anche l'inserimento basato sulla revisione. Segui queste istruzioni:
Esegui questo comando 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 nella colonna
NAME
è l'etichetta della revisione corrispondente 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
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 attuale 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'iniezione automatica di sidecar.Esegui il deployment dell'app di esempio, di
VirtualService
per il frontend e dei service account per i workload. Per questo tutorial, eseguirai il deployment di Online Boutique, un'app demo di microservizi.kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yaml kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
Visualizzare 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 la tua applicazione devono essere in esecuzione, con un
2/2
nella colonnaREADY
. Ciò indica che il proxy sidecar Envoy è stato inserito correttamente nei pod. 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}' \ )
Vedi 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.
Crea un pod TestCurl
Crea un pod TestCurl per inviare traffico in testo normale per i test.
apiVersion: v1
kind: Pod
metadata:
name: testcurl
namespace: default
annotations:
sidecar.istio.io/inject: "false"
spec:
containers:
- name: curl
image: curlimages/curl
command: ["sleep", "600"]
Accedere a Online Boutique
Imposta il contesto attuale per
kubectl
sul cluster in cui hai eseguito il deployment di Online Boutique: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
Tieni presente che
frontend-external
è unLoadBalancer
e ha un indirizzo IP esterno. L'applicazione di esempio include un servizio che è un bilanciatore del carico in modo che possa essere eseguito il deployment su GKE senza Cloud Service Mesh.Visita l'applicazione nel browser utilizzando l'indirizzo IP esterno del servizio
frontend-external
:http://FRONTEND_EXTERNAL_IP/
Cloud Service Mesh ti offre la possibilità di eseguire il deployment di un gateway in entrata. Puoi accedere a Online Boutique anche utilizzando l'indirizzo IP esterno del gateway ingress. Ottieni l'IP esterno del gateway. Sostituisci i segnaposto con le seguenti informazioni:
- GATEWAY_SERVICE_NAME : il nome del servizio del gateway in entrata. Se hai eseguito il deployment del gateway di esempio senza modifiche o se hai eseguito il deployment del gateway di ingresso 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 del gateway in entrata. Se hai eseguito il deployment del gateway di esempio senza modifiche o se hai eseguito il deployment del gateway di ingresso predefinito, il nome è
Apri un'altra scheda del browser e visita l'applicazione utilizzando l'indirizzo IP esterno del gateway Ingress:
http://INGRESS_GATEWAY_EXTERNAL_IP/
Esegui questo comando per
curl
il serviziofrontend
con HTTP semplice da un altro pod. Poiché i servizi si trovano in spazi dei nomi diversi, devi eseguire il comando curl sul nome DNS del serviziofrontend
.kubectl debug --image istio/base --target istio-proxy -it \ $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \ -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, vengono accettati sia il traffico TLS sia quello in testo normale.
Abilita mutual TLS per spazio dei nomi
Applichi mTLS applicando un criterio PeerAuthentication
con kubectl
.
Salva la seguente policy 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
nella configurazione YAML configura i servizi in modo che accettino solo mTLS. Per impostazione predefinita,mode
èPERMISSIVE
, che configura i servizi in modo che accettino sia testo non criptato sia mTLS.Applica il criterio di autenticazione per configurare tutti i servizi Online Boutique 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 accede a Online Boutique utilizzando l'indirizzo IP esterno del servizio
frontend-external
:http://FRONTEND_EXTERNAL_IP/
Aggiorna la pagina. Il browser mostra il seguente errore:
L'aggiornamento della pagina comporta l'invio di testo normale al servizio
frontend
. A causa del criterio di autenticazioneSTRICT
, il proxy sidecar blocca la richiesta al servizio.Vai alla scheda del browser che accede 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 questo percorso:Flusso di autenticazione mTLS:
- Il browser invia una richiesta HTTP in testo normale 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 frontend in questo esempio). Questo handshake include uno scambio di certificati. Questi certificati vengono precaricati nei container proxy da Cloud Service Mesh.
- Il proxy del gateway in entrata esegue un controllo sicuro dei nomi sul certificato del server, verificando che un'identità autorizzata stia eseguendo il server.
- Il gateway in entrata e i proxy del server stabiliscono una connessione TLS reciproca e il proxy del server inoltra la richiesta al contenitore dell'applicazione server (il servizio frontend).
Esegui questo comando per
curl
il serviziofrontend
con HTTP semplice da un altro pod.kubectl exec testcurl -n default -- 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é inviamo traffico in testo normale dal workload senza sidecar in cui viene applicata la norma STRICT
peerAuthentication
.
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 Online Boutique:
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 a Online Boutique 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 semplice da un altro pod.kubectl debug --image istio/base --target istio-proxy -it \ $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \ -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, vengono accettati sia il traffico TLS sia quello in testo normale.
Se aggiorni la pagina nella Google Cloud console che mostra l'elenco
Carichi di lavoro, ora viene visualizzato lo stato mTLS Permissive
.
Abilitare TLS reciproco per workload
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, Cloud Service Mesh non può aggregare le policy a livello di workload per il traffico mTLS in uscita verso un servizio. Per gestire questo comportamento, devi configurare una regola di destinazione.
Applica un criterio di autenticazione a un workload specifico. Nota come le norme seguenti utilizzano etichette e selettori per scegliere come target lo specifico
frontend
deployment.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 a Online Boutique utilizzando l'indirizzo IP esterno del servizio
frontend-external
e aggiorna la pagina. La pagina non viene visualizzata perchéfrontend service
è impostato su mTLSSTRICT
e il proxy sidecar blocca la richiesta.Esegui questo comando per
curl
il serviziofrontend
con HTTP semplice da un altro pod.kubectl exec testcurl -n default -- 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é inviamo traffico in testo normale dal workload senza sidecar in cui viene applicata la norma STRICT
peerAuthentication
.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 in testo normale, imposta
un criterio PeerAuthentication
a livello di mesh con la modalità mTLS impostata su STRICT
.
La policy PeerAuthentication
a livello di mesh non deve avere un selettore e deve essere
applicata nello spazio dei nomi radice, istio-system
. Quando implementi il criterio, il
control plane esegue automaticamente il provisioning dei certificati TLS in modo che i carichi di lavoro possano
autenticarsi a vicenda.
Applica mTLS a tutto il 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 a Online Boutique 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 semplice da un altro pod.kubectl exec testcurl -n default -- 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é inviamo traffico in testo normale dal workload senza sidecar in cui viene applicata la norma STRICT
peerAuthentication
.Elimina la policy
mesh-wide
:kubectl delete peerauthentication -n istio-system mesh-wide
Output previsto:
peerauthentication.security.istio.io "mesh-wide" deleted
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.
Se vuoi 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 Online Boutique:
- 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 del 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 alla configurazione dei criteri
PeerAuthentication
, vedi Configurazione della sicurezza del trasporto.