Configura la sicurezza del trasporto
Puoi proteggere il traffico tra servizi in Cloud Service Mesh con le API Istio applicando il mutual TLS (mTLS) rigoroso. Nei workload Kubernetes, auto mTLS è abilitato per impostazione predefinita: i proxy sidecar client inviano automaticamente il traffico mTLS ai sidecar, ma i servizi di destinazione accettano comunque richieste sia in testo non crittografato che criptate.
Le policy PeerAuthentication ti consentono di limitare i servizi in modo che accettino solo mTLS. Puoi applicare una policy a livello di mesh, a uno spazio dei nomi specifico o a un singolo workload.
Per i campi supportati su tutte le piattaforme, consulta Funzionalità supportate (control plane gestito), Supporto delle API in Cloud Service Mesh gestito e Funzionalità supportate (control plane in-cluster).
Abilita mutual TLS per spazio dei nomi
Per abilitare mTLS per tutti i workload all'interno di uno spazio dei nomi specifico, utilizza una policy di autenticazione a livello di spazio dei nomi. Specifica lo spazio dei nomi a cui si applica in metadata.
kubectl apply -f - <<EOF
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
name: "AUTH_POLICY_NAME"
namespace: "NAMESPACE"
spec:
mtls:
mode: STRICT
EOF
Output previsto:
peerauthentication.security.istio.io/AUTH_POLICY_NAME created
Abilita mutual TLS per workload
Per impostare una policy PeerAuthentication per un workload specifico, devi configurare
la sezione selector e specificare le etichette che corrispondono al workload target.
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 una policy di autenticazione a un workload specifico nel tuo spazio dei nomi:
cat <<EOF | kubectl apply -n NAMESPACE -f - apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "AUTH_POLICY_NAME" namespace: "NAMESPACE" spec: selector: matchLabels: app: WORKLOAD mtls: mode: STRICT EOFOutput previsto:
peerauthentication.security.istio.io/AUTH_POLICY_NAME created
Configura una regola di destinazione corrispondente:
cat <<EOF | kubectl apply -n NAMESPACE -f - apiVersion: "networking.istio.io/v1beta1" kind: "DestinationRule" metadata: name: "DEST_RULE_NAME" spec: host: "WORKLOAD.NAMESPACE.svc.cluster.local" trafficPolicy: tls: mode: ISTIO_MUTUAL EOFOutput previsto:
destinationrule.networking.istio.io/DEST_RULE_NAME created
Applica mTLS a livello di mesh
Per impedire a tutti i servizi nel mesh di accettare il traffico in testo normale, imposta una policy PeerAuthentication a livello di mesh con la modalità mTLS impostata su STRICT (il valore predefinito è PERMISSIVE). La policy PeerAuthentication a livello di mesh non deve avere un selettore e deve essere applicata nello spazio dei nomi radice, istio-system. Quando esegui il deployment della policy, il control plane esegue automaticamente il provisioning dei certificati TLS in modo che i workload possano autenticarsi a vicenda.
Per applicare mTLS a livello di mesh:
kubectl apply -f - <<EOF
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
name: "AUTH_POLICY_NAME"
namespace: "istio-system"
spec:
mtls:
mode: STRICT
EOF
Output previsto:
peerauthentication.security.istio.io/AUTH_POLICY_NAME created
Disabilita mTLS
Cloud Service Mesh gestito con il control plane TRAFFIC_DIRECTOR non supporta la modalità DISABLE nelle risorse PeerAuthentication (mtls.mode: DISABLE o portLevelMtls.mode: DISABLE).
Per inviare traffico in testo non crittografato a un servizio o a una porta specifici in Cloud Service Mesh gestito, configura i proxy lato server e lato client:
- Lato server (
PeerAuthentication): assicurati che il workload di destinazione accetti il traffico in testo non crittografato utilizzando la modalitàPERMISSIVE. Se il mesh o lo spazio dei nomi utilizza la policyPERMISSIVEpredefinita, non è necessario creare una risorsaPeerAuthentication. Se hai applicato mTLSSTRICTa livello di mesh o di spazio dei nomi, applica una policyPeerAuthenticationspecifica per il workload o per la porta impostata suPERMISSIVE. - Lato client (
DestinationRule): configura una risorsaDestinationRulecontls.mode: DISABLEin modo che i proxy sidecar lato client inviino traffico in testo non crittografato quando chiamano il servizio o la porta.
NOTA: poiché il proxy lato server utilizza la modalità PERMISSIVE anziché DISABLE,
il workload di destinazione accetta comunque il traffico mTLS da qualsiasi client non coperto
da DestinationRule. Per assicurarti che tutti i client mesh inviino testo non crittografato, crea DestinationRule nello spazio dei nomi del servizio di destinazione (o istio-system) senza limitare exportTo.
Esempio: disattiva mTLS per un servizio
Se il mesh o lo spazio dei nomi applica mTLS
STRICT, consenti al workload di destinazione (o alla porta specifica) di accettare il traffico in testo non crittografato impostando la modalitàPeerAuthenticationsuPERMISSIVE:cat <<EOF | kubectl apply -n NAMESPACE -f - apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "AUTH_POLICY_NAME" namespace: "NAMESPACE" spec: selector: matchLabels: app: WORKLOAD mtls: mode: PERMISSIVE EOFPer consentire il testo non crittografato solo su una porta del workload specifica (ad esempio, durante la migrazione da
portLevelMtls), imposta inveceportLevelMtls:spec: selector: matchLabels: app: WORKLOAD mtls: mode: STRICT portLevelMtls: WORKLOAD_PORT: mode: PERMISSIVEConfigura un
DestinationRuleper indicare ai proxy client di inviare traffico in testo non crittografato al servizio di destinazione:cat <<EOF | kubectl apply -n NAMESPACE -f - apiVersion: "networking.istio.io/v1beta1" kind: "DestinationRule" metadata: name: "DEST_RULE_NAME" namespace: "NAMESPACE" spec: host: "SERVICE_NAME.NAMESPACE.svc.cluster.local" trafficPolicy: tls: mode: DISABLE EOFPer disattivare mTLS solo per una porta di servizio specifica, utilizza
portLevelSettingsinDestinationRule:spec: host: "SERVICE_NAME.NAMESPACE.svc.cluster.local" trafficPolicy: portLevelSettings: - port: number: SERVICE_PORT tls: mode: DISABLE
Trova ed elimina le policy PeerAuthentication
Per un elenco di tutte le policy PeerAuthentication nel mesh di servizi:
kubectl get peerauthentication --all-namespaces
Se è applicata una policy PeerAuthentication, puoi eliminarla con
kubectl delete:
kubectl delete peerauthentication -n NAMESPACE AUTH_POLICY_NAME