Neste tutorial, vai saber o que é a autorização e como ativá-la com a Cloud Service Mesh numa aplicação de exemplo para saber como ativar políticas de autorização para os seus microsserviços.
Cria um AuthorizationPolicy
para DENY
aceder a um microsserviço e, em seguida, cria um AuthorizationPolicy
para ALLOW
aceder especificamente a um microsserviço.
O que é a autorização?
A autenticação valida uma identidade. Este serviço é quem diz ser? A autorização valida a autorização. Este serviço tem permissão para o fazer?
A identidade é fundamental para esta ideia. Com a malha de serviços na nuvem, a AuthorizationPolicies
permite que a comunicação de carga de trabalho para carga de trabalho na sua malha seja controlada para melhorar a segurança e o acesso.
Numa arquitetura de microsserviços, em que as chamadas são feitas através de limites de rede, as regras de firewall tradicionais baseadas em IP não são frequentemente adequadas para proteger o acesso entre cargas de trabalho. Com o Cloud Service Mesh, pode definir regras de autorização para:
- Controlar o acesso a cargas de trabalho na sua malha, seja de carga de trabalho para carga de trabalho ou de utilizador final para carga de trabalho
- Defina políticas de forma ampla ou detalhada, consoante as suas necessidades. Para ver uma explicação detalhada sobre a configuração de políticas e práticas recomendadas, consulte o artigo Autorização com a malha de serviços na nuvem.
Custos
Este tutorial usa os seguintes componentes faturáveis do Google Cloud:
Quando terminar este tutorial, pode evitar custos contínuos eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.
Antes de começar
Certifique-se de que a faturação está ativada para o seu projeto.
Aprovisione o Cloud Service Mesh gerido num cluster do GKE. Existem vários métodos de configuração suportados:
Clone o repositório:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples
Implemente um gateway de entrada
Defina o contexto atual de
kubectl
para o cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Crie um espaço de nomes para o gateway de entrada:
kubectl create namespace asm-ingress
Ative o espaço de nomes para injeção. Os passos dependem do tipo de Cloud Service Mesh (gerido ou no cluster):
Gerido
Aplique a etiqueta de revisão
asm-managed
ao espaço de nomes:kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=asm-managed --overwrite
Esta etiqueta corresponde ao canal de lançamento gerido atual do Cloud Service Mesh para a versão do Cloud Service Mesh.
No cluster
Use o seguinte comando para localizar a etiqueta de revisão em
istiod
:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
Aplique a etiqueta de revisão ao espaço de nomes. No comando seguinte,
REVISION
é o valor da etiqueta de revisãoistiod
que anotou no passo anterior.kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION --overwrite
Implemente o gateway de exemplo no repositório
anthos-service-mesh-samples
:kubectl apply -n asm-ingress \ -f docs/shared/asm-ingress-gateway
Resultado esperado:
serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
Implemente a aplicação de exemplo Online Boutique
Se ainda não o fez, defina o contexto atual de
kubectl
para o cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Crie o espaço de nomes para a aplicação de exemplo:
kubectl create namespace onlineboutique
Etiquete o espaço de nomes
onlineboutique
para injetar automaticamente proxies do Envoy. Siga os passos para ativar a injeção automática de sidecar.Implemente a app de exemplo, o
VirtualService
para o front-end e as contas de serviço para as cargas de trabalho. Para este tutorial, vai implementar a Online Boutique, uma app de demonstração de microsserviços.kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yaml kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
Veja os seus serviços
Veja os pods no espaço de nomes
onlineboutique
:kubectl get pods -n onlineboutique
Resultado esperado:
NAME READY STATUS RESTARTS AGE adservice-85598d856b-m84m6 2/2 Running 0 2m7s cartservice-c77f6b866-m67vd 2/2 Running 0 2m8s checkoutservice-654c47f4b6-hqtqr 2/2 Running 0 2m10s currencyservice-59bc889674-jhk8z 2/2 Running 0 2m8s emailservice-5b9fff7cb8-8nqwz 2/2 Running 0 2m10s frontend-77b88cc7cb-mr4rp 2/2 Running 0 2m9s loadgenerator-6958f5bc8b-55q7w 2/2 Running 0 2m8s paymentservice-68dd9755bb-2jmb7 2/2 Running 0 2m9s productcatalogservice-84f95c95ff-c5kl6 2/2 Running 0 114s recommendationservice-64dc9dfbc8-xfs2t 2/2 Running 0 2m9s redis-cart-5b569cd47-cc2qd 2/2 Running 0 2m7s shippingservice-5488d5b6cb-lfhtt 2/2 Running 0 2m7s
Todos os pods da sua aplicação devem estar em funcionamento, com um
2/2
na colunaREADY
. Isto indica que os pods têm um proxy sidecar do Envoy injetado com êxito. Se não for apresentado2/2
após alguns minutos, visite o guia de resolução de problemas.Obtenha o IP externo e defina-o para uma variável:
kubectl get services -n asm-ingress export FRONTEND_IP=$(kubectl --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )
Vê um resultado semelhante ao seguinte:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE asm-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
Visite o endereço
EXTERNAL-IP
no seu navegador de Internet. Deve ver a loja Online Boutique no seu navegador.
Autorização DenyAll para uma carga de trabalho
Esta secção adiciona um AuthorizationPolicy
para recusar todo o tráfego recebido para o serviço de moeda.
AuthorizationPolicies
funciona transformando AuthorizationPolicies
em configurações legíveis pelo Envoy e aplicando as configurações aos seus proxies sidecar. Isto permite que o proxy Envoy autorize ou recuse pedidos recebidos a um serviço.
Aplique um
AuthorizationPolicy
aocurrencyservice
. Repare na correspondência na etiquetacurrencyservice
no ficheiro YAML.kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutique
Experimente aceder ao
EXTERNAL-IP
da sua gateway para ver a Online Boutique no navegador de Internet. Deve ver um erro de autorização (500 Internal Service Error) decurrency service
.
Observe os registos do proxy sidecar
Para ver o que está a ocorrer no proxy sidecar, pode rever os registos no pod.
Obtenha o nome do seu dispositivo
currencyservice
:CURRENCY_POD=$(kubectl get pod -n onlineboutique |grep currency|awk '{print $1}')
Defina o proxy Envoy para permitir registos ao nível do rastreio. Por predefinição, as chamadas de autorização bloqueadas não são registadas:
kubectl exec -it $CURRENCY_POD -n onlineboutique -c istio-proxy -- curl -X POST "http://localhost:15000/logging?level=trace"
Resultado esperado:
active loggers: admin: trace alternate_protocols_cache: trace ... tracing: trace upstream: trace udp: trace wasm: trace
Use
curl
para enviar tráfego para o seuEXTERNAL_IP
para gerar registos:for i in {0..10}; do curl -s -I $FRONTEND_IP ; done
Veja os registos relacionados com o controlo de acesso baseado em funções (CABF) no seu istio-proxy:
kubectl logs -n onlineboutique $CURRENCY_POD -c istio-proxy | grep -m5 rbac
Resultado esperado:
2022-07-08T14:19:20.442920Z debug envoy rbac checking request: requestedServerName: outbound_.7000_._.currencyservice.onlineboutique.svc.cluster.local, sourceIP: 10.8.8.5:34080, directRemoteIP: 10.8.8.5:34080, remoteIP: 10.8.8.5:34080,localAddress: 10.8.0.6:7000, ssl: uriSanPeerCertificate: spiffe://christineskim-tf-asm.svc.id.goog/ns/onlineboutique/sa/default, dnsSanPeerCertificate: , subjectPeerCertificate: OU=istio_v1_cloud_workload,O=Google LLC,L=Mountain View,ST=California,C=US, headers: ':method', 'POST' 2022-07-08T14:19:20.442944Z debug envoy rbac enforced denied, matched policy none 2022-07-08T14:19:20.442965Z debug envoy http [C73987][S13078781800499437460] Sending local reply with details rbac_access_denied_matched_policy[none] ```
Deve ver uma mensagem enforced denied
nos registos a indicar que
currencyservice
está definido para bloquear pedidos de entrada.
Permita o acesso restrito
Em vez de uma política DENYALL
, pode definir o acesso para ser permitido para determinadas cargas de trabalho. Isto é relevante numa arquitetura de microsserviços em que quer garantir que apenas os serviços autorizados podem comunicar entre si.
Nesta secção, vai conceder ao serviço frontend
e ao serviço checkout
a capacidade de comunicar com o serviço currency
.
- No ficheiro abaixo, veja que um
source.principal
específico(cliente) está na lista de autorizações para aceder acurrencyservice
:
Aplique a política:
kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutique
- Visite
EXTERNAL-IP
no seu navegador de Internet. Agora, deve conseguir aceder à boutique online.
Limpar
Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.
Para evitar incorrer em encargos contínuos na sua Google Cloud conta pelos recursos usados neste tutorial, pode eliminar o projeto ou eliminar os recursos individuais.
Elimine o projeto
No Cloud Shell, elimine o projeto:
gcloud projects delete PROJECT_ID
Elimine os recursos
Se quiser manter o cluster e remover o exemplo da loja online:
Elimine os espaços de nomes da aplicação:
kubectl delete namespace onlineboutique
Resultado esperado:
namespace "onlineboutique" deleted
Elimine o espaço de nomes do gateway de entrada:
kubectl delete namespace asm-ingress
Resultado esperado:
amespace "asm-ingress" deleted
Se quiser evitar cobranças adicionais, elimine o cluster:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
O que se segue?
- Para um guia geral sobre a configuração de políticas
PeerAuthentication
, consulte o artigo Configurar a segurança de transporte. - Melhore a postura de segurança do seu cluster e aplicação com este tutorial sobre como reforçar a segurança da sua app com o Cloud Service Mesh, o Config Sync e o Policy Controller.
- Explore o painel de controlo de segurança da sua rede de malha com a opção Monitorizar segurança da rede de malha.
- Analise detalhadamente as políticas de autorização com o artigo Configure as funcionalidades avançadas da política de autorização.
- Familiarize-se com as práticas recomendadas de segurança da malha de serviços na nuvem.