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 bien celui qu'il prétend être ? L'autorisation vérifie l'autorisation. Ce service est-il autorisé à le faire ?
L'identité est au cœur de 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ù les appels sont effectués au-delà des limites du réseau, les règles de pare-feu traditionnelles basées sur l'adresse IP ne sont souvent pas adéquates 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 au sein de votre maillage, qu'il s'agisse de la charge de travail ou de l'utilisateur final.
- Définissez des règles de manière générale ou précise en fonction de vos besoins. Pour obtenir une explication détaillée sur la configuration des règles et des bonnes pratiques, consultez la page 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
Assurez-vous que la facturation est activée pour votre projet.
Provisionnez le service Cloud Service Mesh géré sur un cluster GKE. Plusieurs méthodes de configuration sont prises en charge :
Clonez le dépôt :
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples
Déployer une passerelle d'entrée
Définissez le contexte actuel de
kubectl
sur le cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Créez un espace de noms pour votre passerelle d'entrée :
kubectl create namespace asm-ingress
Activez l'espace de noms pour l'injection : La procédure à suivre dépend de votre type de Cloud Service Mesh (géré ou intégré au cluster) :
Géré
Appliquez le libellé de révision
asm-managed
à l'espace de noms :kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=asm-managed --overwrite
Ce libellé correspond au maillage de services Cloud Service Mesh actuellement géré version disponible pour la version de Cloud Service Mesh.
Dans le cluster
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"}'
Appliquez le libellé de révision à l'espace de noms. Dans la commande suivante,
REVISION
correspond à la valeur du libellé de révisionistiod
que vous avez notée à l'étape précédente.kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION --overwrite
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.
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
Créez l'espace de noms pour l'exemple d'application:
kubectl create namespace onlineboutique
Ajoutez un libellé à l'espace de noms
onlineboutique
pour injecter automatiquement les proxys Envoy. Suivez la procédure pour activer l'injection side-car automatique.Déployez l'exemple d'application, le
VirtualService
pour l'interface et les comptes de service pour les charges de travail. Pour ce tutoriel, vous allez déployer Online Boutique (Boutique en ligne), 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
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 colonneREADY
. Cela indique que les pods ont un proxy side-car Envoy injecté avec succès. Si2/2
ne s'affiche pas au bout de quelques minutes, consultez le guide de dépannage.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
Accédez à l'adresse
EXTERNAL-IP
dans votre navigateur Web. Vous devriez voir la boutique en ligne dans votre navigateur.
Autorisation DenyAll pour une charge de travail
Cette section ajoute un AuthorizationPolicy
pour refuser tout trafic entrant vers le service de devises.
Les AuthorizationPolicies
fonctionnent en transformant AuthorizationPolicies
en configurations lisibles par Envoy et en appliquant les configurations à vos proxys side-car. Cela permet au proxy Envoy d'autoriser ou de refuser les requêtes entrantes adressées à un service.
Appliquez une
AuthorizationPolicy
aucurrencyservice
. Notez la correspondance sur le libellécurrencyservice
dans le fichier YAML.kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutique
Essayez d'accéder à
EXTERNAL-IP
de votre passerelle pour afficher la boutique en ligne dans le navigateur Web. Vous devriez voir une erreur d'autorisation (500 Internal Service Error) provenant decurrency service
.
Observer les journaux de votre proxy side-car
Pour voir ce qui se passe dans le proxy sidecar, vous pouvez consulter les journaux du pod.
Obtenez le nom de votre pod
currencyservice
:CURRENCY_POD=$(kubectl get pod -n onlineboutique |grep currency|awk '{print $1}')
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 exec -it $CURRENCY_POD -n onlineboutique -c istio-proxy -- curl -X POST "http://localhost:15000/logging?level=trace"
Résultat attendu :
active loggers: admin: trace alternate_protocols_cache: trace ... tracing: trace upstream: trace udp: trace wasm: trace
Utilisez
curl
pour envoyer du trafic à votreEXTERNAL_IP
afin de générer des journaux :for i in {0..10}; do curl -s -I $FRONTEND_IP ; done
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
.
- Dans le fichier ci-dessous, vérifiez qu'un
source.principal
(client) spécifique est autorisé à accéder àcurrencyservice
:
Appliquez la règle :
kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutique
- 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, supprimez le projet ou 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 :
Supprimez les espaces de noms de l'application :
kubectl delete namespace onlineboutique
Résultat attendu :
namespace "onlineboutique" deleted
Supprimez l'espace de noms de 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
- Pour obtenir un guide général sur la configuration des règles
PeerAuthentication
, consultez la page Configurer la sécurité du transport. - Améliorez le niveau de sécurité de votre cluster et de votre application grâce à ce tutoriel sur le renforcement de la sécurité de votre application avec Cloud Service Mesh, Config Sync et Policy Controller.
- Explorez le tableau de bord de sécurité de votre réseau maillé avec l'option Surveiller la sécurité du réseau maillé.
- Pour en savoir plus sur les règles d'autorisation, consultez Configurer les fonctionnalités avancées des règles d'autorisation.
- Familiarisez-vous avec les bonnes pratiques de sécurité pour Cloud Service Mesh.