Configurar a segurança de transporte

É possível proteger o tráfego entre serviços no Cloud Service Mesh com as APIs do Istio aplicando o protocolo mTLS estrito. Nas cargas de trabalho do Kubernetes, o mTLS automático é ativado por padrão: os proxies sidecar do cliente enviam automaticamente o tráfego mTLS para sidecars, mas os serviços de destino ainda aceitam solicitações de texto simples e criptografadas.

As políticas PeerAuthentication permitem restringir os serviços para aceitar apenas mTLS. É possível aplicar uma política em toda a malha, a um namespace específico ou a uma carga de trabalho individual. Para campos compatíveis em todas as plataformas, consulte Recursos compatíveis (plano de controle gerenciado), Suporte à API no Cloud Service Mesh gerenciado e Recursos compatíveis (plano de controle no cluster).

Ativar o TLS mútuo por namespace

Para ativar o mTLS para todas as cargas de trabalho em um namespace específico, use uma política de autenticação em todo o namespace. Especifique o namespace a que ele se aplica em metadata.

kubectl apply -f - <<EOF
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
  name: "AUTH_POLICY_NAME"
  namespace: "NAMESPACE"
spec:
  mtls:
    mode: STRICT
EOF

Resposta esperada:

peerauthentication.security.istio.io/AUTH_POLICY_NAME created

Ativar o TLS mútuo por carga de trabalho

Para definir uma política PeerAuthentication para uma carga de trabalho específica, configure a seção selector e especifique os rótulos que correspondem à carga de trabalho de destino. No entanto, o Cloud Service Mesh não pode agregar políticas no nível da carga de trabalho para o tráfego mTLS de saída para um serviço. É preciso configurar uma regra de destino para gerenciar esse comportamento.

  1. Aplique uma política de autenticação a uma carga de trabalho específica no seu namespace:

    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
    

    Resposta esperada:

    peerauthentication.security.istio.io/AUTH_POLICY_NAME created
  2. Configure uma regra de destino correspondente:

    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
    

    Resposta esperada:

    destinationrule.networking.istio.io/DEST_RULE_NAME created

Aplique o mTLS em toda a malha

Para impedir que todos os serviços na malha aceitem tráfego de texto simples, defina uma política PeerAuthentication para toda a malha com o modo mTLS definido como STRICT (o padrão é PERMISSIVE). para criar um anexo da VLAN de monitoramento. A política PeerAuthentication em toda a malha não pode ter um seletor e precisa ser aplicada no namespace raiz, istio-system. Quando você implanta a política, o plano de controle provisiona automaticamente certificados TLS para que as cargas de trabalho possam ser autenticadas entre si.

Para aplicar o mTLS em toda a malha:

kubectl apply -f - <<EOF
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
  name: "AUTH_POLICY_NAME"
  namespace: "istio-system"
spec:
  mtls:
    mode: STRICT
EOF

Saída esperada:

peerauthentication.security.istio.io/AUTH_POLICY_NAME created

Desativar mTLS

O Cloud Service Mesh gerenciado com o plano de controle TRAFFIC_DIRECTOR não é compatível com o modo DISABLE em recursos PeerAuthentication (mtls.mode: DISABLE ou portLevelMtls.mode: DISABLE).

Para enviar tráfego de texto simples para um serviço ou porta específica no Cloud Service Mesh gerenciado, configure os proxies do lado do servidor e do lado do cliente:

  1. Do lado do servidor (PeerAuthentication): verifique se a carga de trabalho de destino aceita tráfego de texto simples usando o modo PERMISSIVE. Se a malha ou o namespace usar a política PERMISSIVE padrão, não será necessário criar um recurso PeerAuthentication. Se você aplicou o mTLS STRICT em toda a malha ou em todo o namespace, aplique um conjunto de políticas PeerAuthentication específico da carga de trabalho ou da porta definido como PERMISSIVE.
  2. Do lado do cliente (DestinationRule): configure um recurso DestinationRule com tls.mode: DISABLE para que os proxies sidecar do cliente enviem tráfego de texto simples ao chamar esse serviço ou porta.

OBSERVAÇÃO: como o proxy do lado do servidor usa o modo PERMISSIVE em vez de DISABLE, a carga de trabalho de destino ainda aceita o tráfego mTLS de qualquer cliente não coberto pelo DestinationRule. Para garantir que todos os clientes da malha enviem texto simples, crie o DestinationRule no namespace do serviço de destino (ou istio-system) sem restringir exportTo.

Exemplo: desativar o mTLS para um serviço

  1. Se a malha ou o namespace aplicar mTLS STRICT, permita que a carga de trabalho de destino (ou porta específica) aceite tráfego de texto simples definindo o modo PeerAuthentication como 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
    

    Para permitir texto simples apenas em uma porta de carga de trabalho específica (por exemplo, ao migrar de portLevelMtls), defina portLevelMtls:

    spec:
      selector:
        matchLabels:
          app: WORKLOAD
      mtls:
        mode: STRICT
      portLevelMtls:
        WORKLOAD_PORT:
          mode: PERMISSIVE
    
  2. Configure um DestinationRule para instruir os proxies do cliente a enviar tráfego de texto simples para o serviço de destino:

    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
    

    Para desativar o mTLS apenas para uma porta de serviço específica, use portLevelSettings no DestinationRule:

    spec:
      host: "SERVICE_NAME.NAMESPACE.svc.cluster.local"
      trafficPolicy:
        portLevelSettings:
        - port:
            number: SERVICE_PORT
          tls:
            mode: DISABLE
    

Encontrar e excluir políticas do PeerAuthentication

Para uma lista de todas as políticas PeerAuthentication na malha de serviço:

kubectl get peerauthentication --all-namespaces

Se houver uma política PeerAuthentication em vigor, exclua-a com kubectl delete:

kubectl delete peerauthentication -n NAMESPACE AUTH_POLICY_NAME

A seguir