Service Mesh (ASM) simplifie la configuration centralisée des scénarios de sécurité courants grâce à la fonctionnalité de stratégie de sécurité ASM, qui abstrait les ressources de sécurité natives d'Istio. ASM intègre le plug-in Open Policy Agent (OPA), ce qui vous permet de définir des politiques de contrôle d'accès et d'appliquer un contrôle d'accès granulaire à vos applications.
Fonctionnement
Par défaut, ASM déploie OPA en mode sidecar. Ce tutoriel utilise plutôt un service d'autorisation OPA centralisé, que vous déployez dans votre cluster et connectez ensuite à votre application via une stratégie de sécurité ASM.
Mode sidecar (par défaut) — Après avoir activé OPA et redémarré le Pod de l'application, ASM injecte un conteneur OPA dans le Pod. Le sidecar OPA valide alors toutes les requêtes provenant du conteneur de l'application. Le mode sidecar maintient tout le trafic à l'intérieur du Pod, ce qui offre une latence plus faible et convient aux charges de travail sensibles à la latence. Les inconvénients incluent la consommation de ressources, la nécessité de redémarrer chaque Pod d'application et une flexibilité limitée.
-
Mode centralisé (utilisé dans ce tutoriel) — Un OPA centralisé complète le mode sidecar sur plusieurs aspects : il consomme moins de ressources, permet de connecter les applications sans redémarrage et vous laisse décider quelles requêtes vers l'application sont évaluées par les politiques OPA.

Prérequis
Un cluster Kubernetes managé est ajouté à une instance ASM exécutant la version 1.15.3.25 ou ultérieure. Pour obtenir des instructions, consultez les rubriques Ajouter un cluster à une instance ASM et Mettre à niveau une instance ASM.
L'application httpbin est déployée et accessible via une passerelle d'entrée ASM. Les commandes de test de ce tutoriel envoient des requêtes à
${ASM_GATEWAY_IP}, qui correspond à l'adresse IP de cette passerelle. Pour obtenir des instructions, consultez la rubrique Déployer l'application httpbin.L'injection automatique de sidecar est activée pour le namespace
default. Pour obtenir des instructions, consultez la rubrique Configurer une politique d'injection de sidecar.
Étape 1 : Déployer OPA
Déployez un service d'autorisation OPA centralisé dans le cluster que vous avez ajouté à votre instance ASM.
-
Créez le fichier
asm-opa.yamlavec le contenu suivant. Le fichier YAML déploie un Service OPA, un Deployment OPA et un Secret.Remplacez
cn-hangzhoudans l'imageregistry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-staticpar la région de votre cluster avant de déployer le fichier.Le moteur OPA du Deployment active la journalisation par défaut (
--set=decision_logs.console=true) pour simplifier le débogage.Le Secret définit la politique OPA, qui autorise une requête dans l'un des cas suivants :
Le chemin de la requête est
health.La méthode de la requête est
HEAD.-
Le nom d'utilisateur est
alice.RemarqueLe nom d'utilisateur provient de l'en-tête
Authorizationde la requête, au formatAuthorization: Basic ${encodage Base64 de la chaîne nom d'utilisateur:mot de passe}.
asm-opa.yaml
apiVersion: v1 kind: Service metadata: name: asm-opa labels: app: opa spec: ports: - name: grpc port: 9191 targetPort: 9191 protocol: TCP - name: http port: 8181 targetPort: 8181 protocol: TCP selector: app: opa --- kind: Deployment apiVersion: apps/v1 metadata: name: opa labels: app: opa spec: replicas: 1 selector: matchLabels: app: opa template: metadata: labels: app: opa annotations: sidecar.istio.io/inject: "false" spec: containers: - name: opa image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static securityContext: runAsUser: 1111 volumeMounts: - readOnly: true mountPath: /policy name: opa-policy args: - "run" - "--server" - "--addr=0.0.0.0:8181" - "--diagnostic-addr=0.0.0.0:8282" - "--set=plugins.envoy_ext_authz_grpc.addr=:9191" - "--set=plugins.envoy_ext_authz_grpc.path=asm/authz/allow" - "--set=decision_logs.console=true" - "--ignore=.*" - "/policy/policy.rego" ports: - containerPort: 9191 protocol: TCP resources: limits: cpu: "0" memory: "0" volumes: - name: opa-policy secret: secretName: opa-policy --- apiVersion: v1 kind: Secret metadata: name: opa-policy type: Opaque stringData: policy.rego: | package asm.authz import future.keywords import input.attributes.request.http as http_request import input.parsed_path default allow := false allow if { parsed_path[0] == "health" } allow if { http_request.method == "HEAD" } allow if { user_name == "alice" } user_name := parsed if { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") }RemarqueLes valeurs
resources.limitsde cet exemple sont des espaces réservés. Définissezcpuetmemoryavec des valeurs adaptées à votre environnement. -
Utilisez le fichier kubeconfig du cluster Container Service for Kubernetes (ACK) pour exécuter la commande suivante afin de déployer OPA.
kubectl apply -f asm-opa.yaml Vérifiez que le service d'autorisation OPA est disponible avant de continuer. Le Deployment
opadoit être prêt, et le Serviceasm-opadoit exposer le port9191pour gRPC et le port8181pour HTTP.
Étape 2 : Se connecter à OPA à l'aide d'une stratégie de sécurité ASM
Créez une stratégie de sécurité ASM qui envoie les requêtes sélectionnées au service d'autorisation OPA pour validation.
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page ASMSecurityPolicy, cliquez sur Create. Dans la boîte de dialogue Create ASMSecurityPolicy, cliquez sur la carte Custom Authorization Service, puis cliquez sur OK.
-
Configurez le Custom Authorization Service :
-
Sur la page Create Custom Authorization Service, configurez les informations du service d'autorisation OPA que vous avez déployé à l'étape Étape 1.
Définissez les paramètres comme suit : définissez ASM Security Policy Name sur
opa, sélectionnez GRPC pour Protocol, saisissezasm-opa.default.svc.cluster.localpour Service Address, saisissez9191pour Service Port et saisissez10secondes pour Timeout. Ensuite, cliquez sur Next. Dans l'assistant Workload and Match Rules, cliquez sur Add Workload Group. Dans la boîte de dialogue New Workload Group, saisissez un Workload Group Name et cliquez sur Add Workload.
Dans la boîte de dialogue Add Workload, sélectionnez Workload Scope, définissez Namespaces sur default et définissez Workload Type sur Service. Dans la zone Select workloads, sélectionnez httpbin, cliquez sur l'icône
, puis cliquez sur OK.-
Dans la boîte de dialogue New Workload Group, accédez à la zone Match Rule List. Définissez Match Mode sur The selected request must be authenticated, définissez Matching Rules sur Custom Matching Rules, activez l'interrupteur Path et définissez-le sur
/status/*, puis cliquez sur OK.Ce groupe de charges de travail est nommé
httpbinet sa liste de charges de travail contient le Service httpbin de type Sidecar avec le libelléapp:httpbin. -
Dans l'assistant Workload and Match Rules, cliquez sur Submit.
Après avoir soumis la configuration, la page affiche The ASM security policy is created et montre les ressources Istio créées. Les noms des ressources sont
grpcextauth-asmsecuritypolicy-opapour ASMExtensionProvider etopa-ap-wg-httpbin-default-service-httpbinpour AuthorizationPolicy. Vous pouvez cliquer sur View YAML pour afficher les détails des ressources, puis sur Done.
-
Étape 3 : Tester l'accès à httpbin
Dans les commandes suivantes, ${ASM_GATEWAY_IP} représente l'adresse IP de la passerelle d'entrée ASM qui expose httpbin. Chaque commande utilise -I pour renvoyer uniquement les en-têtes de réponse et -X GET pour forcer la méthode GET, car la politique OPA autorise toutes les requêtes HEAD. Ces tests valident la règle relative au nom d'utilisateur de la politique OPA.
-
Exécutez la commande suivante pour accéder au chemin
/.curl ${ASM_GATEWAY_IP}/ -I -X GET
HTTP/1,1 200 OK server: istio-envoy date: Tue, 25 Jul 2023 08:30:58 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 2
200 OKLa réponse indique que la requête est autorisée. Le chemin/ne correspond pas à la règle de correspondance/status/*que vous avez configurée à l'étape 2, donc la requête n'est pas envoyée à OPA pour autorisation. -
Exécutez la commande suivante pour accéder au chemin
/status/201sans identifiants valides.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET
HTTP/1,1 403 Forbidden date: Tue, 25 Jul 2023 08:31:18 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1
403 ForbiddenLa réponse indique que la requête est refusée car elle ne contient aucun identifiant valide. -
Exécutez la commande suivante pour accéder au chemin
/status/201avec des identifiants valides.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpassword
HTTP/1,1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:31:38 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3
201 CreatedLa réponse confirme que la requête est autorisée car elle contient des identifiants valides pour l'utilisateuralice. Si cette requête renvoie également403 Forbidden, vérifiez le déploiement OPA à l'étape 1 et la configuration de la stratégie de sécurité ASM à l'étape 2.
Étape 4 : Mettre à jour la politique OPA et retester l'accès
Appelez l'API HTTP du moteur OPA pour mettre à jour la politique OPA à l'exécution. Le Secret opa-policy que vous avez créé à l'étape 1 n'est pas modifié et contient toujours la politique d'origine.
-
Exécutez la commande suivante pour mettre à jour la politique afin que seul l'utilisateur
bobsoit autorisé à accéder à l'application et que l'utilisateuraliceprécédent soit refusé.kubectl exec deployment/httpbin -c istio-proxy -- curl asm-opa:8181/v1/policies/policy/policy.rego -XPUT --data-binary 'package asm.authz import future.keywords import input.attributes.request.http as http_request import input.parsed_path default allow := false allow if { parsed_path[0] == "health" } allow if { http_request.method == "HEAD" } allow if { user_name == "bob" } user_name := parsed if { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") }' -
Exécutez la commande suivante pour accéder à httpbin en tant qu'utilisateur
bob.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user bob:testpassword
HTTP/1,1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:32:16 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 3
201 CreatedLa réponse montre que l'utilisateurbobaccède à l'application avec succès selon la politique mise à jour. -
Exécutez la commande suivante pour accéder à httpbin en tant qu'utilisateur
alice.curl ${ASM_GATEWAY_IP}/status/201 -I -X GET --user alice:testpassword
HTTP/1,1 403 Forbidden date: Tue, 25 Jul 2023 08:32:49 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1
403 ForbiddenLa réponse montre que l'accès de l'utilisateuraliceest refusé.