Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Contrôler l'accès à une base de données externe avec une politique d'autorisation

Dernière mise à jour :Aug 12, 2026

Pour garantir la sécurité de vos bases de données, restreignez les services autorisés à y accéder. Par exemple, autorisez les services des namespaces de production à accéder aux bases de données de production tout en bloquant ceux des namespaces de développement. Cette rubrique explique comment utiliser une politique d'autorisation pour contrôler l'accès à une base de données RDS externe spécifique.

Prérequis

Le cluster est ajouté à l'instance ASM. Pour plus d'informations, consultez Ajouter un cluster à une instance ASM.

Étape 1 : Injecter un proxy sidecar

Créez un namespace nommé demo-server et injectez-y un proxy sidecar. Vous pourrez ainsi gérer les autorisations pour les services de ce namespace. Pour plus d'informations, consultez Gérer les namespaces globaux.

Étape 2 : Créer un client de base de données

Créez un client dans le namespace demo-server pour initier des requêtes de connexion à la base de données.

  1. Encodez le mot de passe de connexion à la base de données en Base64.

    echo  <your-database-password> | base64 
  2. Obtenir le fichier kubeconfig d'un cluster et utiliser kubectl pour s'y connecter.

  3. Créez un client MySQL dans le namespace demo-server.

    1. Créez un fichier nommé k8s-mysql.yaml contenant les éléments suivants.

      apiVersion: v1
      data:
        password:   # The Base64-encoded database connection password.
      kind: Secret
      metadata:
        name: mysql-pass
      type: Opaque
      ---
      
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          name: lbl-k8s-mysql
        name: k8s-mysql
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            name: lbl-k8s-mysql
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
          type: RollingUpdate
        template:
          metadata:
            labels:
              name: lbl-k8s-mysql
          spec:
            containers:
              - env:
                  - name: MYSQL_ROOT_PASSWORD
                    valueFrom:
                      secretKeyRef:
                        key: password
                        name: mysql-pass
                image: 'mysql:latest'
                imagePullPolicy: Always
                name: mysql
                ports:
                  - containerPort: 3306
                    name: mysql
                    protocol: TCP
                resources:
                  limits:
                    cpu: 500m
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
                volumeMounts:
                  - mountPath: /var/lib/mysql
                    name: k8s-mysql-storage
            dnsPolicy: ClusterFirst
            restartPolicy: Always
            schedulerName: default-scheduler
            securityContext: {}
            terminationGracePeriodSeconds: 30
            volumes:
              - emptyDir: {}
                name: k8s-mysql-storage
    2. Exécutez la commande suivante pour créer le client MySQL.

      kubectl apply -f k8s-mysql.yaml -n demo-server
  4. Vérifiez que le proxy sidecar est bien injecté dans le pod du client MySQL.

    1. Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.

    2. Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur Workloads > Pods.

    3. Sur la page Pods, cliquez sur le nom du pod du client MySQL.

      L'onglet Containers affiche le conteneur istio-proxy, ce qui confirme l'injection du proxy sidecar.

Étape 3 : Créer une passerelle sortante

Les services d'un Service Mesh doivent utiliser une passerelle sortante pour contrôler le trafic sortant vers les services externes. La configuration d'une politique d'autorisation pour cette passerelle permet de définir des conditions de contrôle d'accès à la base de données.

  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 ASM Gateways > Egress Gateway.

  3. Sur la page Egress Gateway, cliquez sur Create.

  4. Sur la page Create, définissez le Name sur egressgateway et sélectionnez un Cluster. Dans la section Port Mapping, définissez le Protocol sur TCP et le Service Port sur 13306. Cliquez ensuite sur Create.

    Pour plus d'informations sur les paramètres, consultez Créer une passerelle sortante.

Étape 4 : Configurer la politique de trafic sortant

Par défaut, les services du maillage peuvent accéder à tous les services externes. Pour restreindre l'accès à des services externes spécifiques, définissez la politique de trafic sortant sur REGISTRY_ONLY. Avec ce paramètre, les services du Service Mesh ne peuvent pas accéder aux services externes non définis dans un ServiceEntry.

  1. Définissez la politique de trafic sortant.

    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 Data Plane Component Management > Sidecar Proxy Setting.

    3. Dans l'onglet global, cliquez sur Outbound Traffic Policy, définissez Outbound Traffic Policy sur REGISTRY_ONLY, puis cliquez sur Update Settings.

  2. Enregistrez le service externe en créant un ServiceEntry.

    1. Sur la page de détails de l'instance ASM, choisissez Cluster & Workload Management > External Service(ServiceEntry) dans le volet de navigation de gauche. Sur la page qui s'affiche, cliquez sur Create from YAML.

    2. Définissez les Namespaces sur demo-server, collez le contenu suivant dans la zone de texte, puis cliquez sur Create. Remplacez rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com par l'endpoint de votre instance RDS.

      apiVersion: networking.istio.io/v1beta1
      kind: ServiceEntry
      metadata:
        name: demo-server-rds
        namespace: demo-server
      spec:
        endpoints:
          - address: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com   # Database address.
            ports:
              tcp: 3306  
        hosts:
          - rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com
        location: MESH_EXTERNAL
        ports:
          - name: tcp
            number: 3306  # Database port.
            protocol: TCP  # Database protocol.
        resolution: DNS
                                      

Étape 5 : Créer des politiques de trafic

Créez une Gateway, une DestinationRule et une VirtualService pour acheminer le trafic du namespace demo-server vers le port 13306 de la passerelle sortante. Celle-ci achemine ensuite le trafic vers le port 3306 de la base de données.

  1. Créez une Gateway.

    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 ASM Gateways > Gateway. Sur la page qui s'affiche, cliquez sur Create from YAML.

    3. Définissez les Namespaces sur istio-system, collez le contenu suivant dans la zone de texte, puis cliquez sur Create.

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: istio-egressgateway
        namespace: istio-system
      spec:
        selector:
          istio: egressgateway
        servers:
          - hosts:
              - '*'
            port:
              name: http-0
              number: 13306
              protocol: TLS
            tls:
              mode: ISTIO_MUTUAL

      Le paramètre mode est défini sur ISTIO_MUTUAL pour activer l'authentification TLS mutuel (mTLS) sur la passerelle. Les clients situés à l'intérieur du maillage doivent ainsi présenter un certificat à la passerelle sortante.

  2. Créez une DestinationRule.

    1. Sur la page de détails de l'instance ASM, choisissez Traffic Management Center > DestinationRule dans le volet de navigation de gauche. Sur la page qui s'affiche, cliquez sur Create from YAML.

    2. Sur la page Create, définissez les Namespaces sur demo-server, collez le contenu suivant dans la zone de texte, puis cliquez sur Create.

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: demo-server-egress-gateway
        namespace: demo-server
      spec:
        host: istio-egressgateway.istio-system.svc.cluster.local
        subsets:
          - name: mysql-gateway-mTLS
            trafficPolicy:
              loadBalancer:
                simple: ROUND_ROBIN
              portLevelSettings:
                - port:
                    number: 13306 # The gateway port mapping.
                  tls:
                    mode: ISTIO_MUTUAL
                    sni: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com  # The host address of the database.

      Le paramètre mode est défini sur ISTIO_MUTUAL. Les proxys sidecars clients initient alors une connexion mTLS vers le service de passerelle sortante.

  3. Créez une VirtualService.

    1. Sur la page de détails de l'instance ASM, choisissez Traffic Management Center > VirtualService dans le volet de navigation de gauche. Sur la page qui s'affiche, cliquez sur Create from YAML.

    2. Sur la page Create, définissez les Namespaces sur demo-server, collez le contenu suivant dans la zone de texte, puis cliquez sur Create.

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: demo-server-through-egress-gateway
        namespace: demo-server
      spec:
        exportTo:
          - istio-system
          - demo-server
        gateways:
          - mesh
          - istio-system/istio-egressgateway
        hosts:
          - rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com
        tcp:
          - match:
              - gateways:
                  - mesh
                port: 3306
            route:
              - destination:
                  host: istio-egressgateway.istio-system.svc.cluster.local
                  port:
                    number: 13306
                  subset: mysql-gateway-mTLS
                weight: 100
          - match:
              - gateways:
                  - istio-system/istio-egressgateway
                port: 13306
            route:
              - destination:
                  host: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com
                  port:
                    number: 3306
                weight: 100

      La section http contient deux règles de correspondance. La première définit gateways sur mesh. Ce paramètre s'applique aux proxys sidecars du namespace demo-server et achemine le trafic de ce namespace vers le port 13306 de la passerelle sortante. La seconde règle définit gateways sur istio-system/istio-egressgateway et achemine le trafic de la passerelle sortante vers le port 3306 de la base de données enregistrée.

Étape 6 : Vérifier le contrôle d'accès avec une politique d'autorisation

La modification de l'action de la politique d'autorisation permet de refuser ou d'autoriser les services du namespace demo-server à accéder à la base de données externe.

  1. Créez une politique d'autorisation pour refuser les requêtes d'accès provenant du namespace demo-server.

    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 > AuthorizationPolicy. Sur la page qui s'affiche, cliquez sur Create.

    3. Sur la page Create, configurez les paramètres suivants et cliquez sur Create.

      Paramètre

      Description

      Name

      Saisissez un nom pour la politique d'autorisation.

      Policy Type

      Sélectionnez DENY.

      Onglet Gateway Scope

      ASM Gateway

      Sélectionnez egressgateway. Le Match Label est alors automatiquement défini sur istio:egressgateway.

      Request Matching Rules

      Activez le commutateur Namespaces et définissez la valeur sur demo-server.

  2. Tentez d'accéder à la base de données externe.

    1. Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.

    2. Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur Workloads > Pods.

    3. Sur la page Pods, localisez le pod k8s-mysql, cliquez sur Actions dans la colonne Terminal, puis sélectionnez le conteneur mysql.

    4. Dans le terminal du pod, exécutez la commande suivante pour accéder à la base de données externe.

      mysql --user=root --password=$MYSQL_ROOT_PASSWORD --host rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com

      Le message ERROR 2013 s'affiche, indiquant que l'accès à la base de données échoue comme prévu.

  3. Pour autoriser l'accès depuis le namespace demo-server, remplacez l'action de la politique d'autorisation par ALLOW.

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

    3. Sur la page AuthorizationPolicy, localisez la politique cible et cliquez sur View YAML dans la colonne Actions.

    4. Dans la boîte de dialogue Edit, remplacez la valeur du paramètre action par ALLOW et cliquez sur OK.

  4. Dans le terminal du pod, exécutez à nouveau la commande suivante pour accéder à la base de données externe.

    mysql --user=root --password=$MYSQL_ROOT_PASSWORD --host rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com

    Le message Welcome to the MySQL monitor s'affiche, confirmant la réussite de l'accès à la base de données.

    Ces résultats confirment qu'une politique d'autorisation permet de contrôler l'accès à une base de données externe.