Exemples avec Cloud Service Mesh: autorisation


Dans ce tutoriel, vous allez découvrir ce qu'est l'autorisation et comment l'activer avec Cloud Service Mesh sur un exemple d'application pour apprendre à activer des règles d'autorisation pour vos microservices. Vous allez créer un accès AuthorizationPolicy à DENY à un microservice, puis un accès AuthorizationPolicy à ALLOW spécifique à un microservice.

Qu'est-ce qu'une autorisation ?

L'authentification vérifie une identité : ce service est-il celui qu'il prétend être ? L'autorisation vérifie l'autorisation. Ce service est-il autorisé à le faire ? L'identité est fondamentale dans cette idée. Avec Cloud Service Mesh, les AuthorizationPolicies permettent de contrôler la communication de charge de travail à charge de travail dans votre réseau maillé pour améliorer la sécurité et l'accès.

Dans une architecture de microservices, où des appels sont effectués au-delà des limites de réseau, les règles de pare-feu basées sur l'adresse IP ne sont souvent pas adaptées pour sécuriser l'accès entre les charges de travail. Avec Cloud Service Mesh, vous pouvez définir des règles d'autorisation pour:

  • Contrôlez l'accès aux charges de travail de votre réseau maillé, que ce soit de charge de travail à charge de travail ou d'utilisateur final à charge de travail.
  • Définissez des règles de manière globale ou détaillée en fonction de vos besoins.

Pour obtenir une explication détaillée sur la configuration des règles et des bonnes pratiques, consultez la section Autorisation avec Cloud Service Mesh.

Coûts

Ce tutoriel utilise les composants facturables Google Cloud suivants :

Une fois que vous aurez terminé ce tutoriel, évitez de payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

Déployer une passerelle d'entrée

  1. Définissez le contexte actuel de kubectl sur le cluster:

    gcloud container clusters get-credentials CLUSTER_NAME  \
    --project=PROJECT_ID \
    --zone=CLUSTER_LOCATION 
    
  2. Créez un espace de noms pour votre passerelle d'entrée:

    kubectl create namespace asm-ingress
    
  3. Activez l'espace de noms pour l'injection : La procédure dépend de votre implémentation du plan de contrôle.

    Géré (TD)

    Appliquez le libellé d'injection par défaut à l'espace de noms:

    kubectl label namespace asm-ingress \
        istio.io/rev- istio-injection=enabled --overwrite
    

    Géré (Istiod)

    Recommandation:Exécutez la commande suivante pour appliquer le libellé d'injection par défaut à l'espace de noms:

      kubectl label namespace asm-ingress \
          istio.io/rev- istio-injection=enabled --overwrite
    

    Si vous êtes déjà un utilisateur du plan de contrôle Istio géré:nous vous recommandons d'utiliser l'injection par défaut, mais l'injection basée sur les révisions est prise en charge. Suivez les instructions suivantes:

    1. Exécutez la commande suivante pour localiser les versions disponibles:

      kubectl -n istio-system get controlplanerevision
      

      Le résultat ressemble à ce qui suit :

      NAME                AGE
      asm-managed-rapid   6d7h
      

      Dans le résultat, la valeur de la colonne NAME est le libellé de révision qui correspond à la version disponible pour la version de Cloud Service Mesh.

    2. Appliquez le libellé de révision à l'espace de noms.

      kubectl label namespace asm-ingress \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    Dans le cluster

    Recommandation:Exécutez la commande suivante pour appliquer le libellé d'injection par défaut à l'espace de noms:

      kubectl label namespace asm-ingress \
          istio.io/rev- istio-injection=enabled --overwrite
    

    Nous vous recommandons d'utiliser l'injection par défaut, mais l'injection basée sur les révisions est prise en charge: Suivez les instructions suivantes:

    1. Exécutez la commande suivante pour localiser le libellé de révision sur istiod :

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. Appliquez le libellé de révision à l'espace de noms. Dans la commande suivante, REVISION_LABEL correspond à la valeur du libellé de révision istiod que vous avez notée à l'étape précédente.

      kubectl label namespace asm-ingress \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  4. Déployez l'exemple de passerelle dans le dépôt anthos-service-mesh-samples:

    kubectl apply -n asm-ingress \
    -f docs/shared/asm-ingress-gateway
    

    Résultat attendu :

    serviceaccount/asm-ingressgateway configured
    service/asm-ingressgateway configured
    deployment.apps/asm-ingressgateway configured
    gateway.networking.istio.io/asm-ingressgateway configured
    

Déployez l'exemple d'application Boutique en ligne.

  1. Si vous ne l'avez pas encore fait, définissez le contexte actuel de kubectl sur le cluster:

    gcloud container clusters get-credentials CLUSTER_NAME  \
    --project=PROJECT_ID \
    --zone=CLUSTER_LOCATION 
    
  2. Créez l'espace de noms pour l'exemple d'application:

    kubectl create namespace onlineboutique
    
  3. Ajoutez un libellé à l'espace de noms onlineboutique pour injecter automatiquement les proxys Envoy. Suivez la procédure permettant d'activer l'injection side-car automatique.

  4. Déployez l'application exemple, le VirtualService pour l'interface utilisateur et les comptes de service pour les charges de travail. Dans ce tutoriel, vous allez déployer Online Boutique, une application de démonstration de microservices.

    kubectl apply \
    -n onlineboutique \
    -f docs/shared/online-boutique/virtual-service.yaml
    kubectl apply \
    -n onlineboutique \
    -f docs/shared/online-boutique/service-accounts
    

Afficher vos services

  1. Affichez les pods de l'espace de noms onlineboutique:

    kubectl get pods -n onlineboutique
    

    Résultat attendu :

    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
    

    Tous les pods de votre application doivent être opérationnels, avec une valeur 2/2 dans la colonne READY. Cela indique que les pods ont un proxy side-car Envoy injecté avec succès. Si 2/2 ne s'affiche pas au bout de quelques minutes, consultez le guide de dépannage.

  2. Obtenez l'adresse IP externe et définissez-la sur une 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}' \
    )
    

    Vous obtenez un résultat semblable à celui-ci :

    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
    
    
  3. Accédez à l'adresse EXTERNAL-IP dans votre navigateur Web. La boutique Online Boutique devrait s'afficher dans votre navigateur.

    interface de la boutique en ligne

Autorisation DenyAll pour une charge de travail

Cette section ajoute un AuthorizationPolicy pour refuser tout trafic entrant vers le service de devise. AuthorizationPolicies fonctionne en transformant AuthorizationPolicies en configurations lisibles par Envoy, puis en appliquant les configurations à vos proxys sidecar. Cela permet au proxy Envoy d'autoriser ou de refuser les requêtes entrantes vers un service.

  1. Appliquez une AuthorizationPolicy au currencyservice. Notez la correspondance sur le libellé currencyservice dans le fichier YAML.

    kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutique
    
    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: currency-policy
    spec:
      selector:
        matchLabels:
          app: currencyservice
  2. Essayez d'accéder à EXTERNAL-IP de votre passerelle pour afficher la boutique en ligne dans le navigateur Web. Une erreur d'autorisation (500 – Erreur de service interne) doit s'afficher à partir de currency service.

    Erreur 500 authz rbac

Observer les journaux de votre proxy side-car

Pour voir ce qui se passe dans le proxy side-car, vous pouvez consulter les journaux du pod.

  1. Obtenez le nom de votre pod currencyservice:

    CURRENCY_POD=$(kubectl get pod -n onlineboutique |grep currency|awk '{print $1}')
    
  2. Définissez le proxy Envoy pour autoriser les journaux de niveau trace. Par défaut, les appels d'autorisation bloqués ne sont pas consignés:

    kubectl debug --image istio/base --target istio-proxy -it $CURRENCY_POD -n onlineboutique -- curl -X POST "http://localhost:15000/logging?level=trace"
    

    Résultat attendu : none {:.devsite-disable-click-to-copy} active loggers: admin: trace alternate_protocols_cache: trace ... tracing: trace upstream: trace udp: trace wasm: trace

  3. Utilisez curl pour envoyer du trafic à votre EXTERNAL_IP afin de générer des journaux:

    for i in {0..10}; do
    curl -s -I $FRONTEND_IP ; done
    
  4. Affichez les journaux liés au contrôle des accès basé sur les rôles (RBAC) dans votre istio-proxy:

    kubectl logs -n onlineboutique $CURRENCY_POD -c istio-proxy | grep -m5 rbac
    

    Résultat attendu :

    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]
      ```
    

Un message enforced denied doit s'afficher dans les journaux, indiquant que currencyservice est défini pour bloquer les requêtes entrantes.

Autoriser l'accès restreint

Au lieu d'une règle DENYALL, vous pouvez autoriser l'accès pour certaines charges de travail. Cela est pertinent dans une architecture de microservices où vous souhaitez vous assurer que seuls les services autorisés peuvent communiquer entre eux.

Dans cette section, vous allez activer la possibilité pour les services frontend et checkout de communiquer avec le service currency.

  1. Dans le fichier suivant, vérifiez qu'un source.principal(client) spécifique est autorisé à accéder à currencyservice:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: currency-policy
spec:
  selector:
    matchLabels:
      app: currencyservice
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/onlineboutique/sa/frontend"]
  - from:
    - source:
        principals: ["cluster.local/ns/onlineboutique/sa/checkoutservice"]
  1. Appliquez la règle :

    kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutique
    
  2. Accédez à EXTERNAL-IP dans votre navigateur Web. Vous devriez maintenant pouvoir accéder à la Boutique en ligne.

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Pour éviter que les ressources utilisées lors de ce tutoriel continuent d'être facturées sur votre compte Google Cloud, vous pouvez supprimer le projet ou supprimer les ressources individuelles.

Supprimer le projet

Dans Cloud Shell, supprimez le projet :

gcloud projects delete PROJECT_ID

Supprimer les ressources

  • Si vous souhaitez conserver votre cluster et supprimer l'exemple de boutique en ligne, procédez comme suit :

    1. Supprimez les espaces de noms de l'application :

      kubectl delete namespace onlineboutique
      

      Résultat attendu :

      namespace "onlineboutique" deleted
      
    2. Supprimez l'espace de noms de la passerelle d'entrée:

      kubectl delete namespace asm-ingress
      

      Résultat attendu :

      amespace "asm-ingress" deleted
      
  • Si vous souhaitez éviter des frais supplémentaires, supprimez le cluster :

    gcloud container clusters delete  CLUSTER_NAME  \
    --project=PROJECT_ID \
    --zone=CLUSTER_LOCATION 
    

Étape suivante