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.
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 EOFResposta esperada:
peerauthentication.security.istio.io/AUTH_POLICY_NAME created
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 EOFResposta 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:
- Do lado do servidor (
PeerAuthentication): verifique se a carga de trabalho de destino aceita tráfego de texto simples usando o modoPERMISSIVE. Se a malha ou o namespace usar a políticaPERMISSIVEpadrão, não será necessário criar um recursoPeerAuthentication. Se você aplicou o mTLSSTRICTem toda a malha ou em todo o namespace, aplique um conjunto de políticasPeerAuthenticationespecífico da carga de trabalho ou da porta definido comoPERMISSIVE. - Do lado do cliente (
DestinationRule): configure um recursoDestinationRulecomtls.mode: DISABLEpara 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
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 modoPeerAuthenticationcomoPERMISSIVE: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 EOFPara permitir texto simples apenas em uma porta de carga de trabalho específica (por exemplo, ao migrar de
portLevelMtls), definaportLevelMtls:spec: selector: matchLabels: app: WORKLOAD mtls: mode: STRICT portLevelMtls: WORKLOAD_PORT: mode: PERMISSIVEConfigure um
DestinationRulepara 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 EOFPara desativar o mTLS apenas para uma porta de serviço específica, use
portLevelSettingsnoDestinationRule: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