Risolvere i problemi di sicurezza in Cloud Service Mesh
Questa sezione illustra i problemi comuni di Cloud Service Mesh con le API Istio e come risolverli. Se hai bisogno di ulteriore assistenza, consulta Ricevere assistenza.
In Cloud Service Mesh, l'autorità di certificazione Cloud Service Mesh o Istiod emette certificati per i carichi di lavoro su tutti i cluster del mesh. I criteri di autenticazione (ad esempio mTLS) e di autorizzazione (ad esempio allow/deny) vengono inviati a ogni cluster. Questi criteri determinano quali carichi di lavoro possono comunicare e in che modo.
Problemi di TLS
Le sezioni seguenti spiegano come risolvere i problemi relativi a TLS in Cloud Service Mesh.
Gli esempi in questa sezione utilizzano la variabile ${CTX}
, che è il nome del contesto nel file di configurazione Kubernetes predefinito che utilizzi per accedere al cluster. Imposta la variabile ${CTX}
come nell'esempio seguente:
export CTX=gke_PROJECT_ID_CLUSTER_LOCATION_CLUSTER_NAME
Verificare l'applicazione forzata di TLS
Verifica che le richieste in testo non siano consentite per un servizio, quando il servizio richiede connessioni TLS:
kubectl exec SOURCE_POD -n SOURCE_NAMESPACE -c \ SOURCE_CONTAINER -- curl -v DESTINATION_URL
Supponendo che il servizio richieda connessioni TLS, la richiesta in testo normale precedente dovrebbe non riuscire, generando un output simile al seguente:
curl: (56) Recv failure: Connection reset by peer command terminated with exit code 56
Controllare i certificati mTLS
Quando mTLS è abilitato, controlla il certificato mTLS del workload visualizzando
l'intestazione X-Forwarded-Client-Cert
. Per farlo, segui questi passaggi:
Esegui il deployment del servizio di esempio
httpbin
, che può visualizzare le intestazioni ricevute.Usa
curl
per visualizzare l'intestazioneX-Forwarded-Client-Cert
:kubectl exec --context=${CTX} SOURCE_POD -n SOURCE_NAMESPACE -c \ SOURCE_CONTAINER -- curl http://httpbin.sample:8000/headers -s | \ grep X-Forwarded-Client-Cert
L'intestazione
X-Forwarded-Client-Cert
mostra le informazioni sui certificati mTLS, come nell'esempio seguente:X-Forwarded-Client-Cert": "By=spiffe://lt-multicluster-t2-5-15-2020.svc.id.goog/ns/sample/sa/httpbin;Hash=0781d68adfdab85b08b6758ed502f352464e81166f065cc6acde9433337b4494;Subject=\"OU=istio_v1_cloud_workload,O=Google LLC,L=Mountain View,ST=California,C=US\";URI=spiffe://lt-multicluster-t2-5-15-2020.svc.id.goog/ns/sample/sa/sleep
In alternativa, utilizza
openssl
nel sidecar per visualizzare l'intera catena di certificati:kubectl debug --image istio/base --target istio-proxy -it --context=${CTX} SOURCE_POD \ -n SOURCE_NAMESPACE -- openssl s_client -alpn istio -showcerts -connect httpbin.sample:8000
L'output mostrerà la catena di certificati. Se utilizzi la CA Mesh, verifica che il CN del certificato radice contenga
istio_v1_cloud_workload_root-signer-...
. Se utilizzi Istiod come autorità di certificazione, verifica che il certificato radice sia impostato conO = <var>YOUR_TRUST_DOMAIN</var>
.
Errori TLS bad certificate
nei log di Istiod
Se nei log vengono visualizzati errori bad certificate
di handshake TLS, è possibile che Istiod non riesca a stabilire una connessione TLS a un servizio.
Puoi utilizzare la stringa di espressione regolare TLS handshake error.*bad certificate
per trovare questi errori nei log.
In genere questi errori sono informativi e temporanei. Tuttavia, se persistono, potrebbero indicare un problema nel sistema.
Verifica che
istio-sidecar-injector
MutatingWebhookConfiguration
abbia un bundle CA.Il webhook di iniezione del sidecar (utilizzato per l'iniezione automatica del sidecar) richiede un bundle CA per stabilire connessioni sicure con il server API e Istiod. Questo bundle CA viene applicato alla configurazione da istiod, ma a volte può essere sovrascritto (ad esempio, se si applica di nuovo la configurazione del webhook).
Verifica la presenza del bundle CA:
kubectl get mutatingwebhookconfiguration -l app=sidecar-injector -o=jsonpath='{.items[0].webhooks[0].clientConfig.caBundle}'
Se l'output non è vuoto, il bundle CA è configurato. Se il bundle CA è mancante, riavvia
istiod
per eseguire nuovamente la scansione dell'webhook e reinstallare il bundle CA.
Log di rifiuto delle policy di autorizzazione
Per informazioni sul logging dei rifiuti dei criteri di autorizzazione, consulta Logging dei rifiuti.
I criteri di autorizzazione non vengono applicati
Se noti sintomi che indicano che i criteri di autorizzazione non vengono applicati, utilizza il seguente comando per verificarli:
kubectl exec --context=${CTX} -it SOURCE_POD -n SOURCE_NAMESPACE \ -c SOURCE_CONTAINER -- curl DESTINATION_URL
Nell'output, i messaggi access denied
indicano che i criteri di autorizzazione vengono applicati correttamente, ad esempio:
RBAC: access denied
Se confermi che i criteri di autorizzazione non vengono applicati, nega l'accesso al
nome spazio. L'esempio seguente nega l'accesso allo spazio dei nomi denominato authz-ns
:
kubectl apply --context=${CTX} -f - <<EOF apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: deny-authz-ns namespace: authz-ns spec: {} EOF
Errore "customresourcedefinitions.apiextensions.k8s.io is forbidden" nei log di Istiod
Potresti visualizzare errori simili ai seguenti:
error failed to list CRDs: customresourcedefinitions.apiextensions.k8s.io is forbidden: User "system:serviceaccount:istio-system:istiod-service-account" cannot list resource "customresourcedefinitions" in API group "apiextensions.k8s.io" at the cluster scope
Puoi utilizzare la stringa di espressione regolare /error.*cannot list resource/
per trovare questi errori nei log.
Questo errore può verificarsi quando il deployment di Istiod non dispone dell'associazione IAM corretta o non dispone di autorizzazioni RBAC sufficienti per leggere una risorsa personalizzata.
Verifica se nel tuo account manca un'associazione IAM. Innanzitutto, assicurati di avere impostato correttamente le credenziali e le autorizzazioni. Quindi, verifica che l'associazione IAM sia presente utilizzando il seguente comando. In questo esempio, PROJECT_ID è l'output di
gcloud config get-value project
e PROJECT_NUMBER è l'output digcloud projects list --filter="project_id=${PROJECT_ID}" --format="value(project_number)"
:gcloud projects add-iam-policy-binding ${PROJECT_ID} --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-meshdataplane.iam.gserviceaccount.com" --role "roles/meshdataplane.serviceAgent"
Verifica che le regole RBAC siano installate correttamente.
Se le regole RBAC non sono presenti, esegui nuovamente
asmcli install
per ricrearle.Se le regole RBAC sono presenti e gli errori persistono, verifica che
ClusterRoleBindings
eRoleBindings
stiano collegando le regole RBAC all'account di servizio Kubernetes corretto. Verifica inoltre che il deployment di istiod utilizzi l'account di servizio specificato.
serverca
errori di elaborazione nei log di Istiod
Potresti visualizzare errori simili ai seguenti:
Authentication failed: Authenticator ClientCertAuthenticator at index 0 got error
Puoi utilizzare la stringa di espressione regolare /serverca.*Authentication failed:.*JWT/
per trovare questi errori nei log.
Questo errore può verificarsi quando l'emittente JWT non è configurato correttamente, un client utilizza un token scaduto o un altro problema di sicurezza impedisce a una connessione di autenticarsi correttamente su istiod.