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.

  1. 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
    EOF
    

    Output previsto:

    peerauthentication.security.istio.io/AUTH_POLICY_NAME created
  2. 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
    EOF
    

    Output 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:

  1. 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 policy PERMISSIVE predefinita, non è necessario creare una risorsa PeerAuthentication. Se hai applicato mTLS STRICT a livello di mesh o di spazio dei nomi, applica una policy PeerAuthentication specifica per il workload o per la porta impostata su PERMISSIVE.
  2. Lato client (DestinationRule): configura una risorsa DestinationRule con tls.mode: DISABLE in 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

  1. 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à PeerAuthentication su PERMISSIVE:

    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
    EOF
    

    Per consentire il testo non crittografato solo su una porta del workload specifica (ad esempio, durante la migrazione da portLevelMtls), imposta invece portLevelMtls:

    spec:
      selector:
        matchLabels:
          app: WORKLOAD
      mtls:
        mode: STRICT
      portLevelMtls:
        WORKLOAD_PORT:
          mode: PERMISSIVE
    
  2. Configura un DestinationRule per 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
    EOF
    

    Per disattivare mTLS solo per una porta di servizio specifica, utilizza portLevelSettings in DestinationRule:

    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

Passaggi successivi