Tous les produits
Search
Centre de documentation

:Layer 7 authorization policies for waypoint proxies

Dernière mise à jour :Aug 11, 2026

En mode Ambient Mesh, les ztunnels gèrent le trafic de couche 4 sur chaque nœud, tandis que les proxys Waypoint traitent les décisions de couche 7. Lorsque vous déployez un proxy Waypoint pour un service, le ztunnel transfère tout le trafic destiné à ce service vers le proxy Waypoint et cesse d'appliquer ses propres stratégies d'autorisation. Toute stratégie d'autorisation de niveau 7 doit cibler le proxy Waypoint, et non le pod d'application.

Cette rubrique présente des scénarios courants d'autorisation de niveau 7 sur les proxys Waypoint dans Service Mesh (ASM) v1.18, notamment le contrôle d'accès basé sur l'adresse IP, le namespace, l'hôte et la méthode HTTP.

Fonctionnement de l'autorisation avec les proxys Waypoint

Sans proxy Waypoint, les ztunnels appliquent l'autorisation uniquement au niveau de la couche 4 (ports, adresses IP, identités). Après le déploiement d'un proxy Waypoint pour un service :

  1. Le ztunnel délègue toutes les décisions d'autorisation pour ce service au proxy Waypoint et laisse passer le trafic du proxy Waypoint inconditionnellement.

  2. Les stratégies d'autorisation qui utilisent selector pour faire correspondre le pod d'application (ciblant le ztunnel) sont contournées.

  3. Les stratégies d'autorisation doivent utiliser selector avec le libellé istio.io/gateway-name pour cibler le proxy Waypoint.

Le proxy Waypoint peut ensuite appliquer des stratégies de niveau 7 basées sur les attributs HTTP tels que les hôtes, les chemins, les méthodes et les en-têtes. Lorsqu'une requête est refusée, le proxy Waypoint renvoie RBAC: access denied avec le statut HTTP 403.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Une instance ASM exécutant la version v1.18

  • Une passerelle d'entrée et des applications exemples déployées, avec vérification des fonctionnalités de base. Pour plus de détails, consultez les prérequis et l'étape 1 de la section Prise en main

Limites

Contrainte Détails
Pas d'autorisation personnalisée Le champ action ne peut pas être défini sur CUSTOM. Les proxys Waypoint ne prennent pas en charge les services d'autorisation externes.
Pas de ipBlocks dans la source Le champ ipBlocks n'est pas pris en charge dans la spécification source. Utilisez remoteIpBlocks pour faire correspondre les adresses IP des clients.
Contournement des stratégies Ztunnel Une fois qu'un proxy Waypoint est déployé pour un service, le ztunnel correspondant autorise tout le trafic du proxy Waypoint. Les stratégies d'autorisation doivent être liées au proxy Waypoint.

Déployer un proxy Waypoint

Déployez un proxy Waypoint pour le service productpage avant d'exécuter les exemples.

  1. Déployez le proxy Waypoint :

    istioctl x waypoint apply --service-account bookinfo-productpage
  2. Vérifiez que le pod du proxy Waypoint est en cours d'exécution :

    kubectl get pod --show-labels | grep waypoint

    Sortie attendue :

    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

Exemple 1 : Les stratégies ciblant le ztunnel n'ont aucun effet lorsqu'un proxy Waypoint est déployé

Une erreur de configuration courante consiste à appliquer une stratégie d'autorisation à un ztunnel alors qu'un proxy Waypoint est déjà déployé pour le service. Étant donné que le ztunnel s'en remet au proxy Waypoint, la stratégie est entièrement contournée. Cet exemple décrit d'abord l'approche incorrecte, puis montre comment la corriger.

Cibler le ztunnel (incorrect)

  1. Créez un fichier productpage-viewer.yaml avec le contenu suivant.

    Cette stratégie utilise selector pour faire correspondre le pod productpage (ztunnel) et refuse l'accès au port 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"
  2. Appliquez la stratégie :

    kubectl apply -f productpage-viewer.yaml
  3. Testez l'accès depuis différentes sources.

    Via la passerelle depuis sleep :

    kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"

    Sortie :

    <title>Simple Bookstore App</title>

    Via la passerelle depuis notsleep :

    kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"

    Sortie :

    <title>Simple Bookstore App</title>

    Accès direct depuis sleep :

    kubectl exec deploy/sleep -- curl -s http://productpage:9080/| grep -o "<title>.*</title>"

    Sortie :

    command terminated with exit code 56

    Accès direct depuis notsleep :

    kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"

    Sortie :

    <title>Simple Bookstore App</title>

    Malgré la stratégie DENY sur le port 9080, la plupart des requêtes ont abouti. Comparez avec la même stratégie dans la section Authentification et autorisation de niveau 4 - Exemple 2, où aucun proxy Waypoint n'est déployé et la stratégie bloque le trafic comme prévu.

    Lorsqu'un proxy Waypoint est déployé, toutes les stratégies d'autorisation ciblant le ztunnel sont contournées. Ciblez plutôt le proxy Waypoint.

Cibler le proxy Waypoint (correct)

  1. Mettez à jour productpage-viewer.yaml pour cibler le proxy Waypoint en modifiant le libellé selector, puis réappliquez la configuration :

    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
  2. Testez à nouveau l'accès.

    Via la passerelle depuis sleep :

    kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"

    Sortie :

    RBAC: access denied%

    Via la passerelle depuis notsleep :

    kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage"

    Sortie :

    RBAC: access denied%

    Accès direct depuis sleep :

    kubectl exec deploy/sleep -- curl -s http://productpage:9080/

    Sortie :

    RBAC: access denied%

    Accès direct depuis notsleep :

    kubectl exec deploy/notsleep -- curl -s http://productpage:9080/

    Sortie :

    RBAC: access denied%

    Toutes les requêtes sont désormais refusées. Le proxy Waypoint renvoie RBAC: access denied% avec un code d'état HTTP 403. Cela diffère de l'erreur au niveau de la connexion décrite dans la section Authentification et autorisation de niveau 4, où les ztunnels appliquent les stratégies au niveau de la couche 4.

  3. Supprimez la stratégie :

    kubectl delete authorizationpolicy productpage-viewer

Exemple 2 : Refuser l'accès depuis une adresse IP spécifique

Les stratégies d'autorisation des proxys Waypoint ne prennent pas en charge ipBlocks. Utilisez remoteIpBlocks pour faire correspondre l'adresse IP du client d'origine. Vous pouvez configurer le champ remoteIpBlocks pour faire correspondre les requêtes transitant par la passerelle.

  1. Créez un fichier productpage-viewer.yaml qui refuse l'adresse IP du pod sleep :

    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}"

    Remplacez ${sleep Pod IP} par l'adresse IP réelle du pod sleep.

  2. Appliquez la stratégie :

    kubectl apply -f productpage-viewer.yaml
  3. Testez l'accès depuis le pod sleep.

    Via la passerelle :

    kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"

    Sortie :

    RBAC: access denied%

    Accès direct :

    kubectl exec deploy/sleep -- curl -s http://productpage:9080/ -I

    Sortie :

    HTTP/1.1 403 Forbidden
    content-length: 19
    content-type: text/plain
    date: Fri, 19 Jul 2024 08:17:08 GMT
    server: istio-envoy

    L'accès via la passerelle et l'accès direct depuis le pod sleep sont tous deux refusés.

  4. Supprimez la stratégie :

    kubectl delete authorizationpolicy productpage-viewer

Exemple 3 : Refuser l'accès depuis un namespace spécifique

Cet exemple bloque tout le trafic provenant du namespace istio-system. Étant donné que la passerelle d'entrée s'exécute dans istio-system, les requêtes routées via la passerelle sont refusées, tandis que les requêtes directes de pod à pod provenant d'autres namespaces aboutissent toujours.

  1. Créez un fichier 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
  2. Appliquez la stratégie :

    kubectl apply -f productpage-viewer.yaml
  3. Testez l'accès.

    Via la passerelle depuis sleep :

    kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"

    Sortie :

    RBAC: access denied%

    Via la passerelle depuis notsleep :

    kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage"

    Sortie :

    RBAC: access denied%

    Accès direct depuis sleep :

    kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"

    Sortie :

    <title>Simple Bookstore App</title>

    Accès direct depuis notsleep :

    kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"

    Sortie :

    <title>Simple Bookstore App</title>

    Le trafic routé via la passerelle est refusé car la passerelle s'exécute dans le namespace istio-system. L'accès direct depuis les pods d'autres namespaces (tels que default) n'est pas affecté.

  4. Supprimez la stratégie :

    kubectl delete authorizationpolicy productpage-viewer

Exemple 4 : Refuser les requêtes par en-tête d'hôte

Cet exemple refuse les requêtes dont l'en-tête host est test.com sur le port 9080. Les requêtes avec d'autres valeurs d'hôte passent.

  1. Créez un fichier 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"]
  2. Appliquez la stratégie :

    kubectl apply -f productpage-viewer.yaml
  3. Testez l'accès.

    Requête avec Host: test.com :

    kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -H "Host: test.com"

    Sortie :

    RBAC: access denied%

    Requête avec Host: test1.com :

    kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -H "Host: test1.com" -I

    Sortie :

    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: 18

    Seul l'hôte test.com est refusé. Les autres valeurs d'hôte passent normalement.

  4. Supprimez la stratégie :

    kubectl delete authorizationpolicy productpage-viewer

Exemple 5 : Refuser une méthode HTTP spécifique sur un chemin spécifique

Cet exemple bloque les requêtes HEAD vers le chemin /productpage. Les requêtes GET vers le même chemin et les requêtes HEAD vers d'autres chemins sont autorisées.

  1. Créez un fichier 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"]
  2. Appliquez la stratégie :

    kubectl apply -f productpage-viewer.yaml
  3. Testez l'accès.

    Requête HEAD vers /productpage :

    kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -I

    Sortie :

    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: 0

    Requête GET vers /productpage :

    kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -XGET -I

    Sortie :

    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: 18

    Requête HEAD vers /api/v1/products :

    kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/api/v1/products -I

    Sortie :

    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: 18

    Seules les requêtes HEAD vers /productpage sont refusées. La stratégie n'affecte pas les autres méthodes ou chemins.

  4. Supprimez la stratégie :

    kubectl delete authorizationpolicy productpage-viewer

Étapes suivantes