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 :
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.
Les stratégies d'autorisation qui utilisent
selectorpour faire correspondre le pod d'application (ciblant le ztunnel) sont contournées.Les stratégies d'autorisation doivent utiliser
selectoravec le libelléistio.io/gateway-namepour 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.
-
Déployez le proxy Waypoint :
istioctl x waypoint apply --service-account bookinfo-productpage -
Vérifiez que le pod du proxy Waypoint est en cours d'exécution :
kubectl get pod --show-labels | grep waypointSortie 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)
-
Créez un fichier
productpage-viewer.yamlavec le contenu suivant.Cette stratégie utilise
selectorpour faire correspondre le podproductpage(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" -
Appliquez la stratégie :
kubectl apply -f productpage-viewer.yaml -
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 56Accè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)
-
Mettez à jour
productpage-viewer.yamlpour 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 -
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. -
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.
-
Créez un fichier
productpage-viewer.yamlqui refuse l'adresse IP du 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}"Remplacez
${sleep Pod IP}par l'adresse IP réelle du podsleep. -
Appliquez la stratégie :
kubectl apply -f productpage-viewer.yaml -
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/ -ISortie :
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Fri, 19 Jul 2024 08:17:08 GMT server: istio-envoyL'accès via la passerelle et l'accès direct depuis le pod
sleepsont tous deux refusés. -
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.
-
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 -
Appliquez la stratégie :
kubectl apply -f productpage-viewer.yaml -
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 quedefault) n'est pas affecté. -
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.
-
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"] -
Appliquez la stratégie :
kubectl apply -f productpage-viewer.yaml -
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" -ISortie :
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: 18Seul l'hôte
test.comest refusé. Les autres valeurs d'hôte passent normalement. -
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.
-
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"] -
Appliquez la stratégie :
kubectl apply -f productpage-viewer.yaml -
Testez l'accès.
Requête HEAD vers
/productpage:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -ISortie :
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: 0Requête GET vers
/productpage:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/productpage -XGET -ISortie :
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: 18Requête HEAD vers
/api/v1/products:kubectl exec deploy/sleep -- curl -s http://$GATEWAY_HOST/api/v1/products -ISortie :
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: 18Seules les requêtes HEAD vers
/productpagesont refusées. La stratégie n'affecte pas les autres méthodes ou chemins. -
Supprimez la stratégie :
kubectl delete authorizationpolicy productpage-viewer
Étapes suivantes
Authentification et autorisation de niveau 4 – Configurez des stratégies d'autorisation appliquées par les ztunnels au niveau de la couche 4
Prise en main – Déployez les applications exemples utilisées dans ces exemples