Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Controlar o acesso a banco de dados externo com uma política de autorização

Última atualização: Jun 28, 2026

Para garantir a segurança do banco de dados, restrinja os serviços que podem acessá-lo. Por exemplo, permita que serviços em namespaces de produção acessem bancos de dados de produção e bloqueie aqueles em namespaces de desenvolvimento. Este tópico mostra como usar uma política de autorização para controlar o acesso a um banco de dados RDS externo específico.

Pré-requisitos

O cluster está adicionado à instância ASM. Para mais informações, consulte Adicionar um cluster a uma instância ASM.

Etapa 1: Injetar um sidecar proxy

Crie um namespace chamado demo-server e injete um sidecar proxy nele. Isso permite gerenciar a autorização dos serviços nesse namespace. Para mais informações, consulte Gerenciar namespaces globais.

Etapa 2: Criar um cliente de banco de dados

Crie um cliente no namespace demo-server para iniciar solicitações de conexão com o banco de dados.

  1. Codifique a senha de conexão do banco de dados em Base64.

    echo  <your-database-password> | base64 
  2. Obter o arquivo kubeconfig de um cluster e usar kubectl para conectar-se ao cluster.

  3. Crie um cliente MySQL no namespace demo-server.

    1. Crie um arquivo chamado k8s-mysql.yaml com o seguinte conteúdo.

      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. Execute o comando a seguir para criar o cliente MySQL.

      kubectl apply -f k8s-mysql.yaml -n demo-server
  4. Verifique se o sidecar proxy foi injetado no pod do cliente MySQL.

    1. Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.

    2. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Pods.

    3. Na página Pods, clique no nome do pod do cliente MySQL.

      Na aba Containers, visualize o contêiner istio-proxy. Isso confirma a injeção do sidecar proxy.

Etapa 3: Criar um egress gateway

Os serviços em um Service Mesh devem usar um egress gateway para controlar o tráfego de saída para serviços externos. Configure uma política de autorização para o egress gateway a fim de definir condições de controle de acesso ao banco de dados.

  1. Faça login no ASM console. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha ASM Gateways > Egress Gateway.

  3. Na página Egress Gateway, clique em Create.

  4. Na página Create, defina Name como egressgateway e selecione um Cluster. Na seção Port Mapping, defina Protocol como TCP e Service Port como 13306. Em seguida, clique em Create.

    Para mais informações sobre os parâmetros, consulte Criar um egress gateway.

Etapa 4: Configurar a política de tráfego de saída

Por padrão, os serviços na malha podem acessar todos os serviços externos. Para controlar o acesso a serviços externos específicos, defina a política de tráfego de saída como REGISTRY_ONLY. Com essa configuração, os serviços no Service Mesh não conseguem acessar serviços externos indefinidos em um ServiceEntry.

  1. Defina a política de tráfego de saída.

    1. Faça login no ASM console. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

    2. Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha Data Plane Component Management > Sidecar Proxy Setting.

    3. Na aba global, clique em Outbound Traffic Policy, defina Outbound Traffic Policy como REGISTRY_ONLY e clique em Update Settings.

  2. Registre o serviço externo criando um ServiceEntry.

    1. Na página de detalhes da instância ASM, escolha Cluster & Workload Management > External Service(ServiceEntry) no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.

    2. Defina Namespaces como demo-server, cole o conteúdo a seguir na caixa de texto e clique em Create. Substitua rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com pelo endpoint da sua instância 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
                                      

Etapa 5: Criar políticas de tráfego

Crie um Gateway, um DestinationRule e um VirtualService para rotear o tráfego do namespace demo-server para a porta 13306 do egress gateway. O egress gateway então roteia o tráfego para a porta 3306 do banco de dados.

  1. Crie um Gateway.

    1. Faça login no ASM console. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

    2. Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha ASM Gateways > Gateway. Na página exibida, clique em Create from YAML.

    3. Defina Namespaces como istio-system, cole o conteúdo a seguir na caixa de texto e clique em 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

      O parâmetro mode está definido como ISTIO_MUTUAL para ativar a autenticação TLS mútua (mTLS) no gateway. Isso exige que os clientes dentro da malha apresentem um certificado ao egress gateway.

  2. Crie um DestinationRule.

    1. Na página de detalhes da instância ASM, escolha Traffic Management Center > DestinationRule no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.

    2. Na página Create, defina Namespaces como demo-server, cole o conteúdo a seguir na caixa de texto e clique em 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.

      O parâmetro mode está definido como ISTIO_MUTUAL. Isso configura os sidecar proxies do cliente para iniciar uma conexão mTLS com o serviço do egress gateway.

  3. Crie um VirtualService.

    1. Na página de detalhes da instância ASM, escolha Traffic Management Center > VirtualService no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.

    2. Na página Create, defina Namespaces como demo-server, cole o conteúdo a seguir na caixa de texto e clique em 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

      A seção http possui duas regras de correspondência. A primeira define gateways como mesh, aplicando-se aos sidecar proxies no namespace demo-server e roteando o tráfego desse namespace para a porta 13306 do egress gateway. A segunda regra define gateways como istio-system/istio-egressgateway e roteia o tráfego do egress gateway para a porta 3306 do banco de dados registrado.

Etapa 6: Verificar o controle de acesso com uma política de autorização

Alterar a ação da política de autorização permite negar ou permitir que os serviços no namespace demo-server acessem o banco de dados externo.

  1. Crie uma política de autorização para negar solicitações de acesso do namespace demo-server.

    1. Faça login no ASM console. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

    2. Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha Mesh Security Center > AuthorizationPolicy. Na página exibida, clique em Create.

    3. Na página Create, configure os seguintes parâmetros e clique em Create.

      Parâmetro

      Descrição

      Name

      Insira um nome para a política de autorização.

      Policy Type

      Selecione DENY.

      Aba Gateway Scope

      ASM Gateway

      Selecione egressgateway. O Match Label será automaticamente definido como istio:egressgateway.

      Request Matching Rules

      Ative a chave Namespaces e defina o valor como demo-server.

  2. Tente acessar o banco de dados externo.

    1. Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.

    2. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Pods.

    3. Na página Pods, localize o pod k8s-mysql, clique em Actions na coluna Terminal e selecione o contêiner mysql.

    4. No terminal do pod, execute o comando a seguir para acessar o banco de dados externo.

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

      A mensagem ERROR 2013 aparece, indicando falha no acesso ao banco de dados conforme esperado.

  3. Para permitir o acesso do namespace demo-server, altere a ação da política de autorização para ALLOW.

    1. Faça login no ASM console. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

    2. Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha Mesh Security Center > AuthorizationPolicy.

    3. Na página AuthorizationPolicy, localize a política desejada e clique em View YAML na coluna Actions.

    4. Na caixa de diálogo Edit, altere o valor do parâmetro action para ALLOW e clique em OK.

  4. No terminal do pod, execute novamente o comando a seguir para acessar o banco de dados externo.

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

    A mensagem Welcome to the MySQL monitor aparece, indicando êxito no acesso ao banco de dados.

    Esses resultados demonstram a possibilidade de controlar o acesso a um banco de dados externo usando uma política de autorização.