En este instructivo, aprenderás qué es la autorización y cómo habilitarla
con Cloud Service Mesh en una aplicación de ejemplo para aprender a habilitar
políticas de autorización en tus microservicios. Crearás una
AuthorizationPolicy para DENY el acceso a un microservicio y, luego, una
AuthorizationPolicy para ALLOW el acceso específico a un microservicio.
¿Qué es la autorización?
La autenticación verifica una identidad: ¿este servicio es quien dice ser?
La autorización verifica el permiso: ¿este servicio tiene permitido hacer eso?
La identidad es fundamental para esta idea. Con Cloud Service Mesh,
AuthorizationPolicies permite que se controle la comunicación entre cargas de trabajo en tu
malla para mejorar la seguridad y el acceso.
En una arquitectura de microservicios, en la que las llamadas se realizan a través de los límites de la red, las reglas de firewall basadas en IP no suelen ser adecuadas para proteger el acceso entre las cargas de trabajo. Con Cloud Service Mesh, puedes establecer reglas de autorización para lo siguiente:
- Controla el acceso a las cargas de trabajo dentro de la malla, ya sea de carga de trabajo a carga de trabajo o de usuario final a carga de trabajo.
- Define políticas de forma amplia o detallada según tus necesidades.
Para ver una explicación detallada sobre la configuración de políticas y las prácticas recomendadas, consulta Autorización con Cloud Service Mesh.
Costos
En este instructivo, se usan los siguientes componentes facturables de Google Cloud:
Cuando completes el instructivo puedes borrar los recursos que hayas creado para evitar que se te sigan cobrando. Para obtener más información, consulta Cómo realizar una limpieza.
Antes de comenzar
Asegúrate de que la facturación esté habilitada para tu proyecto.
Aprovisionar Cloud Service Mesh en un clúster de GKE Existen varios métodos de configuración compatibles:
Clone el repositorio:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples
Implementa una puerta de enlace de entrada
Establece el contexto actual para
kubectlen el clúster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONCrea un espacio de nombres para tu puerta de enlace de entrada:
kubectl create namespace asm-ingressHabilita el espacio de nombres para la inserción. Los pasos dependen de la implementación del plano de control.
Administrado (TD)
Aplica la etiqueta de inserción predeterminada al espacio de nombres:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwriteAdministrado (Istiod)
Recomendado: Ejecuta el siguiente comando para aplicar la etiqueta de inserción predeterminada al espacio de nombres:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwriteSi eres un usuario existente con el plano de control de Istiod administrado, te recomendamos que uses la inserción predeterminada, pero se admite la inserción basada en revisiones. Sigue estas instrucciones:
Ejecuta el siguiente comando para ubicar los canales de versiones disponibles:
kubectl -n istio-system get controlplanerevisionEl resultado es similar a lo siguiente:
NAME AGE asm-managed-rapid 6d7hEn el resultado, el valor en la columna
NAMEes la etiqueta de revisión que corresponde al canal de versiones disponible para la versión de Cloud Service Mesh.Aplica la etiqueta de revisión al espacio de nombres:
kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
En el clúster
Recomendado: Ejecuta el siguiente comando para aplicar la etiqueta de inserción predeterminada al espacio de nombres:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwriteTe recomendamos que uses la inserción predeterminada, pero se admite la inserción basada en revisiones: Usa las siguientes instrucciones:
Usa el siguiente comando para encontrar la etiqueta de revisión en
istiod:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'Aplica la etiqueta de revisión a los espacios de nombres. En el siguiente comando,
REVISION_LABELes el valor de la etiqueta de revisiónistiodque anotaste en el paso anterior.kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Implementa la puerta de enlace de ejemplo en el repositorio
anthos-service-mesh-samples:kubectl apply -n asm-ingress \ -f docs/shared/asm-ingress-gatewayResultado esperado:
serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
Implementa la aplicación de muestra de Online Boutique.
Si no lo hiciste, establece el contexto actual de
kubectlen el clúster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONCrea el espacio de nombres para la aplicación de ejemplo:
kubectl create namespace onlineboutiqueEtiqueta el espacio de nombres
onlineboutiquepara insertar de forma automática los proxies de Envoy:kubectl label namespace onlineboutique \ istio.io/rev- istio-injection=enabled --overwriteImplementar la app de ejemplo, el
VirtualServicepara el frontend y las cuentas de servicio para las cargas de trabajo En este instructivo, implementarás Online Boutique, una app de demo de microservicios.kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yamlkubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
Consulta tus servicios
Visualiza los Pods en el espacio de nombres
onlineboutique:kubectl get pods -n onlineboutiqueResultado 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 2m7sTodos los Pods de tu aplicación deben estar en funcionamiento, con un
2/2en la columnaREADY. Esto indica que los Pods tienen un proxy de sidecar de Envoy insertado de forma correcta. Si no se muestra2/2después de un par de minutos, consulta la guía de solución de problemas.Obtén la IP externa y configúrala en una variable:
kubectl get services -n asm-ingress export FRONTEND_IP=$(kubectl --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )Verás un resultado similar al siguiente:
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 27mVisita la dirección
EXTERNAL-IPen tu navegador web. Deberías ver la tienda de Online Boutique en tu navegador.
Autorización DenyAll para una carga de trabajo
En esta sección, se agrega un AuthorizationPolicy para rechazar todo el tráfico entrante al
servicio de moneda. AuthorizationPolicies funciona transformando
AuthorizationPolicies en parámetros de configuración legibles para Envoy y aplicando los parámetros de configuración a
tus proxies sidecar. Esto permite que el proxy de Envoy autorice o rechace las solicitudes entrantes
a un servicio.
Aplica un
AuthorizationPolicyalcurrencyservice. Observa la coincidencia en la etiquetacurrencyserviceen el archivo YAML.kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutiqueIntenta acceder a la
EXTERNAL-IPde tu puerta de enlace para ver Online Boutique en el navegador web. Deberías ver un error de autorización (error interno del servicio 500) decurrency service.
Observa los registros de tu proxy de sidecar
Para ver lo que ocurre en el proxy de sidecar, puedes revisar los registros en el Pod.
Obtén el nombre de tu Pod de
currencyservice:CURRENCY_POD=$(kubectl get pod -n onlineboutique |grep currency|awk '{print $1}')Configura el proxy de Envoy para permitir registros de nivel de seguimiento. De forma predeterminada, no se registran las llamadas de autorización bloqueadas:
kubectl debug --image istio/base --target istio-proxy -it $CURRENCY_POD -n onlineboutique -- curl -X POST "http://localhost:15000/logging?level=trace"Resultado esperado:
none {:.devsite-disable-click-to-copy} active loggers: admin: trace alternate_protocols_cache: trace ... tracing: trace upstream: trace udp: trace wasm: traceUsa
curlpara enviar tráfico a tuEXTERNAL_IPy generar registros:for i in {0..10}; do curl -s -I $FRONTEND_IP ; doneConsulta los registros relacionados con el control de acceso basado en roles (RBAC) en tu istio-proxy:
kubectl logs -n onlineboutique $CURRENCY_POD -c istio-proxy | grep -m5 rbacResultado 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] ```
Deberías ver un mensaje enforced denied en los registros, que indica que
currencyservice está configurado para bloquear las solicitudes entrantes.
Permite el acceso restringido
En lugar de una política DENYALL, puedes configurar el acceso para que se permita en ciertas
cargas de trabajo. Esto será relevante en una arquitectura de microservicios en la que quieras
asegurarte de que solo los servicios autorizados puedan comunicarse entre sí.
En esta sección, habilitarás los servicios frontend y checkout para que puedan comunicarse con el servicio currency.
- En el siguiente archivo, observa que un
source.principal(cliente) específico puede acceder acurrencyservice:
Aplica la política:
kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutiqueVisita la
EXTERNAL-IPen tu navegador web. Ahora deberías poder acceder a Online Boutique.
Realiza una limpieza
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Para evitar que se apliquen cargos continuos a tu cuenta de Google Cloud por los recursos que se usaron en este instructivo, puedes borrar el proyecto o borrar los recursos individuales.
Borra el proyecto
En Cloud Shell, borra el proyecto:
gcloud projects delete PROJECT_ID
Borra recursos
Si deseas conservar el clúster y quitar la muestra de Online Retail, realiza la siguiente acción:
Borra los espacios de nombres de la aplicación:
kubectl delete namespace onlineboutiqueResultado esperado:
namespace "onlineboutique" deletedBorra el espacio de nombres de la puerta de enlace de entrada:
kubectl delete namespace asm-ingressResultado esperado:
namespace "asm-ingress" deleted
Si deseas evitar cargos adicionales, borra el clúster:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
¿Qué sigue?
- Para obtener una guía general sobre cómo configurar las políticas de
PeerAuthentication, consulta Configura la seguridad de transporte. - Explora el panel de seguridad de tu malla con Supervisa la seguridad de la malla.
- Profundiza en las políticas de autorización con Configura las funciones avanzadas de la política de autorización.
- Familiarízate con las prácticas recomendadas de seguridad de Cloud Service Mesh.