Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Connecter un OPA externe à l'aide d'une stratégie de sécurité ASM

Dernière mise à jour :Aug 27, 2026

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.

    OPA deployment modes

Prérequis

Étape 1 : Déployer OPA

Déployez un service d'autorisation OPA centralisé dans le cluster que vous avez ajouté à votre instance ASM.

  1. Créez le fichier asm-opa.yaml avec le contenu suivant. Le fichier YAML déploie un Service OPA, un Deployment OPA et un Secret.

    Remplacez cn-hangzhou dans l'image registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static par 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.

      Remarque

      Le nom d'utilisateur provient de l'en-tête Authorization de la requête, au format Authorization: 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), ":")
        }
    Remarque

    Les valeurs resources.limits de cet exemple sont des espaces réservés. Définissez cpu et memory avec des valeurs adaptées à votre environnement.

  2. 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
  3. Vérifiez que le service d'autorisation OPA est disponible avant de continuer. Le Deployment opa doit être prêt, et le Service asm-opa doit exposer le port 9191 pour gRPC et le port 8181 pour 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.

  1. Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez Service Mesh > Mesh Management.

  2. Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez Mesh Security Center > ASMSecurityPolicy.

  3. 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.

  4. Configurez le Custom Authorization Service :

    1. 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, saisissez asm-opa.default.svc.cluster.local pour Service Address, saisissez 9191 pour Service Port et saisissez 10 secondes pour Timeout. Ensuite, cliquez sur Next.

    2. 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.

    3. 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 Add to selected workloads, puis cliquez sur OK.

    4. 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é httpbin et sa liste de charges de travail contient le Service httpbin de type Sidecar avec le libellé app:httpbin.

    5. 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-opa pour ASMExtensionProvider et opa-ap-wg-httpbin-default-service-httpbin pour 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.

  1. 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 OK La 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.

  2. Exécutez la commande suivante pour accéder au chemin /status/201 sans 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 Forbidden La réponse indique que la requête est refusée car elle ne contient aucun identifiant valide.

  3. Exécutez la commande suivante pour accéder au chemin /status/201 avec 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 Created La réponse confirme que la requête est autorisée car elle contient des identifiants valides pour l'utilisateur alice. Si cette requête renvoie également 403 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.

  1. Exécutez la commande suivante pour mettre à jour la politique afin que seul l'utilisateur bob soit autorisé à accéder à l'application et que l'utilisateur alice pré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), ":")
    }'
  2. 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 Created La réponse montre que l'utilisateur bob accède à l'application avec succès selon la politique mise à jour.

  3. 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 Forbidden La réponse montre que l'accès de l'utilisateur alice est refusé.