En el modo Ambient Mesh, los ztunnels gestionan el tráfico de capa 4 en cada nodo, mientras que los proxy waypoint se encargan de las decisiones de capa 7. Cuando despliega un proxy waypoint para un servicio, el ztunnel reenvía todo el tráfico de ese servicio al waypoint y deja de aplicar sus propias directivas de autorización. Cualquier directiva de autorización de capa 7 debe dirigirse al proxy waypoint, no al pod de la aplicación.
Este documento muestra escenarios comunes de autorización de capa 7 en proxy waypoint dentro de Service Mesh (ASM) v1.18, incluido el control de acceso basado en IP, namespace, host y método HTTP.
Funcionamiento de la autorización con proxy waypoint
Sin un proxy waypoint, los ztunnels aplican la autorización únicamente en la capa 4 (puertos, direcciones IP, identidades). Una vez que despliega un proxy waypoint para un servicio:
El ztunnel delega todas las decisiones de autorización de ese servicio al proxy waypoint y permite que el tráfico del waypoint pase sin condiciones.
Las directivas de autorización que usan
selectorpara coincidir con el pod de la aplicación (dirigidas al ztunnel) se omiten.Las directivas de autorización deben usar
selectorcon la etiquetaistio.io/gateway-namepara dirigirse al proxy waypoint.
El proxy waypoint puede entonces aplicar directivas de capa 7 basadas en atributos HTTP como hosts, rutas, métodos y encabezados. Cuando se deniega una solicitud, el waypoint devuelve RBAC: access denied con un estado HTTP 403.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una instancia de ASM que ejecute la versión 1.18
Un ingress gateway y aplicaciones de ejemplo desplegadas con las funciones básicas verificadas. Para más detalles, consulte los requisitos previos y el Paso 1 en Getting started
Limitaciones
|
Restricción |
Detalles |
|
Sin autorización personalizada |
El campo |
|
No se admite |
El campo |
|
Omisión de directivas de ztunnel |
Después de desplegar un proxy waypoint para un servicio, el ztunnel correspondiente permite todo el tráfico del waypoint. Las directivas de autorización deben vincularse al proxy waypoint. |
Despliegue de un proxy waypoint
Despliegue un proxy waypoint para el servicio productpage antes de ejecutar los ejemplos.
-
Despliegue el proxy waypoint:
istioctl x waypoint apply --service-account bookinfo-productpage -
Compruebe que el pod del proxy waypoint esté en ejecución:
kubectl get pod --show-labels | grep waypointSalida esperada:
bookinfo-productpage-istio-waypoint-6c579dd48d-l**** 1/1 Running 0 91s gateway.istio.io/managed=istio.io-mesh-controller,istio.io/gateway-name=bookinfo-productpage,pod-template-hash=6c579dd48d,service.istio.io/canonical-name=bookinfo-productpage-istio-waypoint,service.istio.io/canonical-revision=latest,sidecar.istio.io/inject=false
Ejemplo 1: Las directivas dirigidas a ztunnel no tienen efecto cuando hay un proxy waypoint desplegado
Un error de configuración común es aplicar una directiva de autorización a un ztunnel cuando ya existe un proxy waypoint desplegado para el servicio. Dado que el ztunnel delega en el proxy waypoint, la directiva se omite por completo. Este ejemplo muestra primero el enfoque incorrecto y luego explica cómo corregirlo.
Dirigir la directiva al ztunnel (incorrecto)
-
Cree un archivo
productpage-viewer.yamlcon el siguiente contenido.Esta directiva usa
selectorpara coincidir con el podproductpage(ztunnel) y deniega el acceso al puerto 9080:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: DENY rules: - to: - operation: ports: - "9080" -
Aplique la directiva:
kubectl apply -f productpage-viewer.yaml -
Pruebe el acceso desde diferentes orígenes.
A través del gateway desde
sleep:kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"Salida:
<title>Simple Bookstore App</title>A través del gateway desde
notsleep:kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"Salida:
<title>Simple Bookstore App</title>Acceso directo desde
sleep:kubectl exec deploy/sleep -- curl -s http://productpage:9080/| grep -o "<title>.*</title>"Salida:
command terminated with exit code 56Acceso directo desde
notsleep:kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Salida:
<title>Simple Bookstore App</title>A pesar de la directiva DENY en el puerto 9080, la mayoría de las solicitudes se completaron correctamente. Compare este comportamiento con la misma directiva en Autenticación y autorización de capa 4 - Ejemplo 2, donde no hay ningún proxy waypoint desplegado y la directiva bloquea el tráfico como se espera.
Cuando se despliega un proxy waypoint, se omiten todas las directivas de autorización dirigidas al ztunnel. Dirija la directiva al proxy waypoint en su lugar.
Dirigir la directiva al proxy waypoint (correcto)
-
Actualice
productpage-viewer.yamlpara dirigirla al proxy waypoint cambiando la etiquetaselectory vuelva a aplicarla:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - to: - operation: ports: - "9080"kubectl apply -f productpage-viewer.yaml -
Vuelva a probar el acceso.
A través del gateway desde
sleep:kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"Salida:
RBAC: access denied%A través del gateway desde
notsleep:kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage"Salida:
RBAC: access denied%Acceso directo desde
sleep:kubectl exec deploy/sleep -- curl -s http://productpage:9080/Salida:
RBAC: access denied%Acceso directo desde
notsleep:kubectl exec deploy/notsleep -- curl -s http://productpage:9080/Salida:
RBAC: access denied%Ahora se deniegan todas las solicitudes. El proxy waypoint devuelve
RBAC: access denied%con un código de estado HTTP 403. Esto difiere del error a nivel de conexión en Autenticación y autorización de capa 4, donde los ztunnels aplican las directivas en la capa 4. -
Limpieza:
kubectl delete authorizationpolicy productpage-viewer
Ejemplo 2: Denegar acceso desde una dirección IP específica
Las directivas de autorización del proxy waypoint no admiten ipBlocks. Utilice remoteIpBlocks para coincidir con la dirección IP original del cliente. Configure el campo remoteIpBlocks para filtrar las solicitudes que pasan por el gateway.
-
Cree un archivo
productpage-viewer.yamlque deniegue la dirección IP del podsleep:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - from: - source: remoteIpBlocks: - "${sleep Pod IP}"Reemplace
${sleep Pod IP}con la dirección IP real del podsleep. -
Aplique la directiva:
kubectl apply -f productpage-viewer.yaml -
Pruebe el acceso desde el pod
sleep.A través del gateway:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"Salida:
RBAC: access denied%Acceso directo:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ -ISalida:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Fri, 19 Jul 2024 08:17:08 GMT server: istio-envoySe deniega tanto el acceso a través del gateway como el acceso directo desde el pod
sleep. -
Limpieza:
kubectl delete authorizationpolicy productpage-viewer
Ejemplo 3: Denegar acceso desde un namespace específico
Este ejemplo bloquea todo el tráfico originado en el namespace istio-system. Dado que el ingress gateway se ejecuta en istio-system, las solicitudes enrutadas por el gateway se deniegan, mientras que las solicitudes directas de pod a pod desde otros namespaces siguen funcionando correctamente.
-
Cree un archivo
productpage-viewer.yaml:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - from: - source: namespaces: - istio-system -
Aplique la directiva:
kubectl apply -f productpage-viewer.yaml -
Pruebe el acceso.
A través del gateway desde
sleep:kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"Salida:
RBAC: access denied%A través del gateway desde
notsleep:kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage"Salida:
RBAC: access denied%Acceso directo desde
sleep:kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Salida:
<title>Simple Bookstore App</title>Acceso directo desde
notsleep:kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Salida:
<title>Simple Bookstore App</title>El tráfico enrutado por el gateway se deniega porque este se ejecuta en el namespace
istio-system. El acceso directo desde pods en otros namespaces (comodefault) no se ve afectado. -
Limpieza:
kubectl delete authorizationpolicy productpage-viewer
Ejemplo 4: Denegar solicitudes por encabezado host
Este ejemplo deniega las solicitudes cuyo encabezado host es test.com en el puerto 9080. Las solicitudes con otros valores de host pasan sin restricciones.
-
Cree un archivo
productpage-viewer.yaml:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - to: - operation: hosts: ["test.com"] ports: ["9080"] -
Aplique la directiva:
kubectl apply -f productpage-viewer.yaml -
Pruebe el acceso.
Solicitud con
Host: test.com:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -H "Host: test.com"Salida:
RBAC: access denied%Solicitud con
Host: test1.com:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -H "Host: test1.com" -ISalida:
HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 5290 server: istio-envoy date: Tue, 15 Aug 2023 03:39:29 GMT x-envoy-upstream-service-time: 18Solo se deniega el host
test.com. Los demás valores de host pasan con normalidad. -
Limpieza:
kubectl delete authorizationpolicy productpage-viewer
Ejemplo 5: Denegar un método HTTP específico en una ruta específica
Este ejemplo bloquea las solicitudes HEAD hacia la ruta /productpage. Se permiten las solicitudes GET a la misma ruta y las solicitudes HEAD a otras rutas.
-
Cree un archivo
productpage-viewer.yaml:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - to: - operation: methods: ["HEAD"] paths: ["/productpage"] -
Aplique la directiva:
kubectl apply -f productpage-viewer.yaml -
Pruebe el acceso.
Solicitud HEAD a
/productpage:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -ISalida:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Tue, 15 Aug 2023 03:59:37 GMT server: istio-envoy x-envoy-upstream-service-time: 0Solicitud GET a
/productpage:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -XGET -ISalida:
HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 5290 server: istio-envoy date: Tue, 15 Aug 2023 03:39:29 GMT x-envoy-upstream-service-time: 18Solicitud HEAD a
/api/v1/products:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/api/v1/products -ISalida:
HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 5290 server: istio-envoy date: Tue, 15 Aug 2023 03:39:29 GMT x-envoy-upstream-service-time: 18Solo se deniegan las solicitudes HEAD a
/productpage. La directiva no afecta a otros métodos ni rutas. -
Limpieza:
kubectl delete authorizationpolicy productpage-viewer
Pasos siguientes
Autenticación y autorización de capa 4 -- Configure directivas de autorización aplicadas por ztunnels en la capa 4
Getting started -- Despliegue las aplicaciones de ejemplo utilizadas en estos casos