Risoluzione dei problemi di sicurezza in Anthos Service Mesh
Questa sezione illustra i problemi comuni di Anthos Service Mesh e come risolverli. Se hai bisogno di ulteriore aiuto, vedi Ricevere assistenza.
In Anthos Service Mesh, Mesh CA o Istiod rilascia certificati ai carichi di lavoro in tutti i cluster del mesh. L'autenticazione (ad esempio mTLS) e i criteri di autorizzazione (ad es. autorizzazione/nega) vengono inviati tramite push a ciascun cluster. Questi criteri determinano quali carichi di lavoro possono comunicare e come.
Problemi relativi a TLS
Le sezioni seguenti spiegano come risolvere i problemi relativi a TLS in Anthos Service Mesh.
Gli esempi in questa sezione utilizzano la variabile ${CTX}
, che è il nome contesto nel file di configurazione predefinito di Kubernetes che utilizzi per accedere al cluster. Imposta la variabile ${CTX}
come nell'esempio seguente:
export CTX=gke_PROJECT_ID_CLUSTER_LOCATION_CLUSTER_NAME
Verifica l'applicazione forzata di TLS
Verifica che le richieste in testo normale 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 precedente richiesta in testo normale non dovrebbe andare a buon fine, 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 carico di lavoro visualizzando l'intestazione X-Forwarded-Client-Cert
. Per eseguire questa operazione, procedi nel seguente modo:
Esegui il deployment del servizio di esempio
httpbin
, che può visualizzare le intestazioni che riceve.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 dei 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
sul file collaterale per visualizzare l'intera catena di certificati:kubectl exec --context=${CTX} SOURCE_POD -n SOURCE_NAMESPACE -c istio-proxy \ openssl s_client -alpn istio -showcerts -connect httpbin.sample:8000
L'output mostrerà la catena di certificati. Se utilizzi Mesh CA, verifica che il nome comune del certificato radice contenga
istio_v1_cloud_workload_root-signer-...
. Se utilizzi Istiod come autorità di certificazione, verifica che il certificato radice sia impostato suO = <var>YOUR_TRUST_DOMAIN</var>
.
Errori di TLS bad certificate
nei log Istiod
Se vedi errori bad certificate
di handshake TLS nei log, è 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 tuo sistema.
Verifica che il tuo
istio-sidecar-injector
MutatingWebhookConfiguration
abbia un bundle CA.Il webhook iniettore sidecar (utilizzato per l'inserimento automatico di file collaterali) richiede un bundle di CA per stabilire connessioni sicure con il server API e Istiod. Questo bundle di CA viene applicato alla configurazione da istiod, ma a volte può essere sovrascritto (ad esempio, se applichi 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 non è presente, riavvia
istiod
affinché esegua una nuova scansione del webhook e reinstalli il bundle della CA.
Logging dei rifiuti dei criteri di autorizzazione
Per informazioni sul logging dei criteri di autorizzazione, consulta Logging dei rifiuti.
I criteri di autorizzazione non vengono applicati
Se si verificano 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 sono
applicati correttamente, come segue:
RBAC: access denied
Se confermi che i criteri di autorizzazione non sono applicati, nega l'accesso allo spazio dei nomi. 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 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 Istiod non ha l'associazione IAM corretta o non ha autorizzazioni RBAC sufficienti per leggere una risorsa personalizzata.
Verifica se manca un'associazione IAM nel tuo account. Innanzitutto, assicurati di aver impostato correttamente le credenziali e le autorizzazioni. Quindi, verifica che l'associazione IAM sia presente utilizzando il comando seguente. In questo esempio, PROJECT_ID è l'output di
gcloud config get-value project
, mentre 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 mancano le regole RBAC, esegui nuovamente
asmcli install
per ricrearle.Se le regole RBAC sono presenti e gli errori persistono, verifica che
ClusterRoleBindings
eRoleBindings
colleghino le regole RBAC all'account di servizio Kubernetes corretto. Inoltre, verifica che il deployment di Istio utilizzi l'account di servizio specificato.
serverca
errore di processo nei log 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 è configurata correttamente, un client utilizza un token scaduto o qualche altro problema di sicurezza impedisce la corretta autenticazione di una connessione a Istio.