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.
-
Codifique a senha de conexão do banco de dados em Base64.
echo <your-database-password> | base64 Obter o arquivo kubeconfig de um cluster e usar kubectl para conectar-se ao cluster.
-
Crie um cliente MySQL no namespace
demo-server.-
Crie um arquivo chamado
k8s-mysql.yamlcom 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 -
Execute o comando a seguir para criar o cliente MySQL.
kubectl apply -f k8s-mysql.yaml -n demo-server
-
-
Verifique se o sidecar proxy foi injetado no pod do cliente MySQL.
Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
-
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.
Faça login no ASM console. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha .
Na página Egress Gateway, clique em Create.
-
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.
-
Defina a política de tráfego de saída.
Faça login no ASM console. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha .
Na aba global, clique em Outbound Traffic Policy, defina Outbound Traffic Policy como REGISTRY_ONLY e clique em Update Settings.
-
Registre o serviço externo criando um ServiceEntry.
Na página de detalhes da instância ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.
-
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.compelo 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.
-
Crie um Gateway.
Faça login no ASM console. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha . Na página exibida, clique em Create from YAML.
-
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_MUTUALO parâmetro
modeestá definido comoISTIO_MUTUALpara ativar a autenticação TLS mútua (mTLS) no gateway. Isso exige que os clientes dentro da malha apresentem um certificado ao egress gateway.
-
Crie um DestinationRule.
Na página de detalhes da instância ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.
-
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
modeestá definido comoISTIO_MUTUAL. Isso configura os sidecar proxies do cliente para iniciar uma conexão mTLS com o serviço do egress gateway.
-
Crie um VirtualService.
Na página de detalhes da instância ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.
-
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: 100A 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.
-
Crie uma política de autorização para negar solicitações de acesso do namespace
demo-server.Faça login no ASM console. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha . Na página exibida, clique em Create.
-
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.
-
Tente acessar o banco de dados externo.
Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
Na página Pods, localize o pod
k8s-mysql, clique em Actions na coluna Terminal e selecione o contêiner mysql.-
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.comA mensagem
ERROR 2013aparece, indicando falha no acesso ao banco de dados conforme esperado.
-
Para permitir o acesso do namespace
demo-server, altere a ação da política de autorização paraALLOW.Faça login no ASM console. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha .
Na página AuthorizationPolicy, localize a política desejada e clique em View YAML na coluna Actions.
Na caixa de diálogo Edit, altere o valor do parâmetro
actionpara ALLOW e clique em OK.
-
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.comA mensagem
Welcome to the MySQL monitoraparece, 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.