Construindo Arquitetura de Microsserviços Segura com Service Mesh: Integração com Bancos de Dados e Escalabilidade

Construindo Arquitetura de Microsserviços Segura com Service Mesh: Integração com Bancos de Dados e Escalabilidade

Este artigo detalha como implementar uma arquitetura de microsserviços segura utilizando Service Mesh, focando na integração com bancos de dados PostgreSQL e na escalabilidade. Exploramos os desafios de autenticação mútua TLS e como superá-los.

MundiX News·01 de julho de 2026·9 min de leitura·👁 1 views

Olá, Habr! Meu nome é Valentin, sou engenheiro DevOps na equipe Platform V Kintsugi. Trabalhamos no desenvolvimento de um serviço em nuvem e, na prática, encontramos regularmente tanto desafios arquiteturais na construção de sistemas distribuídos quanto questões de segurança.

Na parte anterior, analisamos detalhadamente o mecanismo de delegação de conexão TLS para o nível do Service Mesh e mostramos como o Egress Gateway pode atuar como um participante completo no handshake do PostgreSQL. No entanto, esse cenário foi considerado em uma configuração simplificada – um serviço, um certificado, uma conexão. Em um sistema real, tudo é organizado de forma diferente: diferentes serviços usam diferentes contas, diferentes certificados e acessam os mesmos sistemas externos. Isso leva à necessidade de selecionar dinamicamente a política TLS e rotear corretamente o tráfego TCP com base na origem. É aqui que as coisas ficam interessantes!

Imagine um cenário em que vários serviços acessam um único servidor PostgreSQL, mas cada serviço:

  • Usa uma conta técnica separada;
  • Possui seu próprio certificado de cliente;
  • Opera com seu próprio banco de dados lógico.

Vamos analisar como a interação é construída nessas condições e quais limitações surgem ao tentar centralizar o gerenciamento de conexões seguras.

Modelaremos a situação descrita implantando dois serviços – psql-postgres e psql-kintsugi. Cada um deles estabelecerá uma conexão segura com seu banco de dados, localizado no servidor SGBD, enquanto a criptografia do tráfego será realizada no lado do Egress Gateway usando sua própria conta técnica e o certificado de cliente correspondente.

Nesta fase, surge a questão crucial: como o Egress Gateway deve determinar qual certificado específico usar para uma determinada conexão? Suponha que o serviço psql-postgres precise se autenticar no servidor de banco de dados usando a conta postgres (CN=postgres), e para o serviço psql-kintsugi, criaremos uma conta separada kintsugi e emitiremos o certificado correspondente (CN=kintsugi). Tentaremos resolver essa tarefa usando os recursos do Service Mesh, dividindo o tráfego no nível do sidecar usando sourceLabels e subsets, e associando uma política TLS a cada fluxo.

Para isso, descreveremos os recursos necessários sequencialmente. Registramos o servidor PostgreSQL externo no registro do Istio:

yaml
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: postgres-se-tls-origin
spec:
  endpoints:
    - address: 10.40.20.72
  exportTo:
    - . 
  hosts:
    - postgres.solution.test
  location: MESH_EXTERNAL
  ports:
    - name: postgres-5432
      number: 5432
      protocol: postgres
  resolution: STATIC

Como resultado, o serviço externo se torna acessível dentro da mesh e pode participar do roteamento e da aplicação de políticas.

Definimos o serviço para proxy de tráfego através do Egress Gateway:

yaml
kind: Service
apiVersion: v1
metadata:
  name: postgres-egress-service-tls-origin
spec:
  ports:
    - name: tcp-5001
      protocol: TCP
      port: 5001
      targetPort: 5001
  type: ClusterIP
  selector:
    app: egressgateway

O tráfego de todos os serviços para o Egress Gateway passará pela porta 5001. Adicionamos um ponto de entrada no Egress Gateway:

yaml
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: postgres-gw-tls-origin-psql-postgres
spec:
  selector:
    app: egressgateway
  servers:
    - hosts:
        - postgres.solution.test
      port:
        name: postgres-5001
        number: 5001
        protocol: TCP

O Gateway recebe tráfego TCP na porta 5001 e o encaminha para a mesh. Para cada canal, um subset separado é criado no DestinationRule, que é usado ao selecionar a política de tratamento de tráfego. Definimos os conjuntos de políticas que usaremos para selecionar a configuração TLS.

Para tráfego interno (da aplicação para o Egress Gateway):

yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: postgres-internal-dr-tls-origin-postgres
spec:
  exportTo:
    - . 
  host: postgres-egress-service-tls-origin
  subsets:
    - name: postgres-internal-tls-origin-postgres

Para tráfego externo (do Egress Gateway para o servidor SGBD PostgreSQL):

yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: postgres-external-dr-tls-origin
spec:
  exportTo:
    - . 
  host: postgres.solution.test
  subsets:
    - name: postgres-external-tls-origin-postgres
      trafficPolicy:
        tls:
          caCertificates: /secrets/istio/egressgateway-certs/ca.crt
          clientCertificate: /secrets/istio/egressgateway-certs/postgres.crt
          privateKey: /secrets/istio/egressgateway-certs/postgres.key
          mode: MUTUAL
    - name: postgres-external-tls-origin-kintsugi
      trafficPolicy:
        tls:
          caCertificates: /secrets/istio/egressgateway-certs/ca.crt
          clientCertificate: /secrets/istio/egressgateway-certs/kintsugi.crt
          privateKey: /secrets/istio/egressgateway-certs/kintsugi.key
          mode: MUTUAL
  workloadSelector:
    matchLabels:
      app: egressgateway

Cada subset corresponde a uma política TLS separada e a um certificado de cliente específico.

Agora vamos configurar o roteamento. Tentaremos dividir o tráfego no nível do sidecar usando sourceLabels e direcioná-lo para diferentes subsets:

yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: postgres-vs-tls-origin-psql-postgres
spec:
  exportTo:
    - . 
  gateways:
    - postgres-gw-tls-origin-psql-postgres
    - mesh
  hosts:
    - postgres.solution.test
  tcp:
    - match:
        - gateways:
            - mesh
          port: 5432
          sourceLabels:
            app: psql-postgres
      route:
        - destination:
            host: postgres-egress-service-tls-origin
            port:
              number: 5001
            subset: postgres-internal-tls-origin-postgres
    - match:
        - gateways:
            - postgres-gw-tls-origin-psql-postgres
          port: 5001
      route:
        - destination:
            host: postgres.solution.test
            port:
              number: 5432
            subset: postgres-external-tls-origin-postgres

Assim, no nível do sidecar, dividimos o tráfego por sourceLabels e o direcionamos para diferentes subsets, cada um dos quais corresponde à sua própria configuração TLS.

A primeira vista, o esquema parece correto, então vamos verificar e ver como ele se comporta na prática.

Executamos a conexão do serviço psql-postgres:

bash
10001@psql-postgres-8f7584f7d-j97dt:/$ psql "host=postgres.solution.test user=postgres port=5432 dbname=postgres sslmode=disable"

postgres=# SELECT ssl, version, cipher
FROM pg_stat_ssl
WHERE pid = pg_backend_pid();
 ssl | version |           cipher
-----+---------+-----------------------------
 t   | TLSv1.2 | ECDHE-RSA-AES256-GCM-SHA384
(1 row)

Agora executamos uma consulta semelhante do serviço psql-kintsugi:

bash
10001@psql-kintsugi-79db99ff5d-dghpz:/$ psql "host=postgres.solution.test user=kintsugi dbname=kintsugi port=5432 sslmode=disable"
psql: error: connection to server at "postgres.solution.test" (10.40.20.72), port 5432 failed: FATAL:  certificate authentication failed for user "kintsugi"

O resultado não foi exatamente o que esperávamos.

Para o serviço psql-postgres, a conexão foi bem-sucedida – a conexão foi estabelecida, o TLS é usado, o que é confirmado pela saída de pg_stat_ssl. No entanto, ao tentar conectar do serviço psql-kintsugi, recebemos um erro:

FATAL: certificate authentication failed for user "kintsugi"

Vamos prestar atenção aos logs do Egress Gateway:

[2026-04-26T21:28:47.690Z] "- - -" 0 - - - "-" 89 510 564 - "-" "-" "-" "-" "10.40.20.72:5432" outbound|5432|postgres-external-tls-origin-postgres|postgres.solution.test 172.21.15.211:38966 172.21.15.211:5001 172.21.14.161:53470 - - 
[2026-04-26T21:29:56.079Z] "- - -" 0 - - - "-" 84 108 14 - "-" "-" "-" "-" "10.40.20.72:5432" outbound|5432|postgres-external-tls-origin-postgres|postgres.solution.test 172.21.15.211:53216 172.21.15.211:5001 172.21.21.113:35306 - - 

Apesar de as requisições virem de serviços diferentes, em ambos os casos é usado o mesmo subsetpostgres-external-tls-origin-postgres. Consequentemente, o Egress Gateway sempre aplica a mesma política TLS e o mesmo certificado de cliente para todas as conexões, independentemente da origem. É por isso que a conexão para o usuário kintsugi falha: o servidor PostgreSQL recebe o certificado com CN=postgres e rejeita a tentativa de autenticação.

Por que isso aconteceu?

No lado do proxy sidecar, o contexto de origem (incluindo sourceLabels) está realmente disponível, e é por isso que podemos dividir o tráfego com sucesso nesta etapa. No entanto, ao fazer proxy através do Egress Gateway, um novo segmento de conexão TCP é formado, no qual o contexto de roteamento original já não está disponível, ou seja, os rótulos do serviço usados para roteamento no sidecar não entram no próximo segmento da conexão. Como resultado, no nível do Egress Gateway, todas as conexões de entrada parecem um fluxo homogêneo de tráfego TCP, e a seleção da política TLS se torna impossível sem mecanismos adicionais. É por isso que, apesar do roteamento correto no nível do sidecar, a mesma política TLS é aplicada no Egress Gateway para todas as conexões.

Surge uma questão lógica: se o contexto não é transmitido, é possível fixá-lo na própria conexão?

Em vez de tentar transmitir o contexto diretamente, podemos codificá-lo explicitamente nas características L4 do tráfego – por exemplo, direcionando conexões de diferentes serviços para diferentes portas internas do Egress Gateway. Como a porta permanece inalterada durante todo o caminho do pacote, o Egress Gateway obtém a capacidade de distinguir os fluxos e aplicar diferentes políticas a eles. Como resultado, transferimos a lógica de seleção do nível de abstração do Service Mesh para o nível de parâmetros de transporte disponíveis para o proxy.

Para dividir o tráfego no nível do Egress Gateway, introduzimos um sinalizador de transporte adicional – uma porta dedicada.

Primeiro, adicionamos uma nova porta ao serviço através do qual o tráfego do serviço psql-kintsugi será processado:

yaml
spec:
  ports:
    - name: tcp-5001
      protocol: TCP
      port: 5001
      targetPort: 5001
    - name: tcp-5002
      protocol: TCP
      port: 5002
      targetPort: 5002

Em seguida, definimos o Gateway correspondente que receberá as conexões nesta porta:

yaml
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: postgres-gw-tls-origin-psql-kintsugi
spec:
  selector:
    app: egressgateway
  servers:
    - hosts:
        - postgres.solution.test
      port:
        name: postgres-tls-origin
        number: 5002
        protocol: TCP

Após isso, fazemos alterações no VirtualService postgres-vs-tls-origin-psql-kintsugi criado anteriormente: em vez da porta comum 5001 (TCP), usaremos a porta dedicada 5002 (TCP), direcionando assim o tráfego para um canal de transporte separado.

yaml
tcp:
  - match:
      - gateways:
          - mesh
        port: 5432
        sourceLabels:
          app: psql-kintsugi
    route:
      - destination:
          host: postgres-egress-service-tls-origin
          port:
            number: 5002
          subset: postgres-internal-tls-origin-kintsugi
  - match:
      - gateways:
          - postgres-gw-tls-origin-psql-kintsugi
        port: 5002
    route:
      - destination:
          host: postgres.solution.test
          port:
            number: 5432
          subset: postgres-external-tls-origin-kintsugi

Em outras palavras, dividimos explicitamente o tráfego no nível L4: cada serviço corresponde a uma porta dedicada do Egress Gateway, e, portanto, a uma política TLS própria. Como resultado, fluxos de transporte independentes são formados, que não se misturam mais no nível do gateway.

Assim como no cenário anterior, verificaremos a conexão com o banco de dados para cada serviço. Para isso, executaremos o comando apropriado dentro do pod de cada aplicação.

bash
10001@psql-postgres-8f7584f7d-j97dt:/$ psql "host=postgres.solution.test user=postgres port=5432 dbname=postgres sslmode=disable"
postgres=# SELECT ssl, version, cipher
FROM pg_stat_ssl
WHERE pid = pg_backend_pid();
 ssl | version |           cipher
-----+---------+-----------------------------
 t   | TLSv1.2 | ECDHE-RSA-AES256-GCM-SHA384
(1 row)

Para o serviço psql-postgres, a conexão foi bem-sucedida; verificaremos de forma semelhante para o serviço psql-kintsugi:

bash
10001@psql-kintsugi-79db99ff5d-dghpz:/$ psql "host=postgres.solution.test user=kintsugi port=5432 dbname=kintsugi sslmode=disable"

kintsugi=> SELECT ssl, version, cipher
FROM pg_stat_ssl
WHERE pid = pg_backend_pid();
 ssl | version |           cipher
-----+---------+-----------------------------
 t   | TLSv1.2 | ECDHE-RSA-AES256-GCM-SHA384
(1 row)

O resultado é o esperado: ambas as conexões são estabelecidas com sucesso.

Nos logs do Egress Gateway, você pode ver como o tráfego é proxyado e quais subsets são usados para roteamento:

[2026-04-26T21:41:45.957Z] "- - -" 0 - - - "-" 169 664 36540 - "-" "-" "-" "-" "10.40.20.72:5432" outbound|5432|postgres-external-tls-origin-postgres|postgres.solution.test 172.21.15.211:36170 172.21.15.211:5001 172.21.14.161:45982 - - 
[2026-04-26T21:45:06.743Z] "- - -" 0 - - - "-" 89 511 8024 - "-" "-" "-" "-" "10.40.20.72:5432" outbound|5432|postgres-external-tls-origin-kintsugi|postgres.solution.test 172.21.15.211:37830 172.21.15.211:5002 172.21.21.113:34314 - - 

Assim, conseguimos resolver o problema da conexão multiusuário: cada serviço estabelece uma conexão com o mesmo SGBD, enquanto no nível do Egress Gateway, a política TLS correta é aplicada e o certificado de cliente apropriado é usado. A ideia chave da solução é que o contexto da conexão é codificado nos parâmetros de transporte – neste caso, através da porta. Isso permite contornar a limitação do roteamento TCP no Service Mesh e garantir a seleção da política no lado da infraestrutura. No entanto, essa abordagem tem uma característica arquitetônica importante que deve ser considerada no projeto.

Com o aumento do número de serviços, o número de canais de transporte independentes aumenta:

  • Para cada serviço, uma porta dedicada é necessária no Egress Gateway;
  • Surgem recursos adicionais que descrevem as políticas de roteamento;
  • O volume total de configuração no Service Mesh aumenta.

Isso leva não apenas à complexidade de manutenção, mas também a um potencial aumento da carga no proxy (Envoy): o número de listeners, clusters e regras de roteamento que precisam ser processados aumenta. Como resultado, ao escalar o sistema, essa abordagem pode se tornar um fator que afeta a utilização de recursos e a gerenciabilidade da configuração.

No entanto, este esquema continua sendo uma solução viável e prática para cenários onde:

  • É necessário gerenciamento centralizado de TLS;
  • É importante remover o trabalho com certificados das aplicações;
  • O número de serviços e conexões permanece controlável.

Na prática, tais cenários raramente permanecem isolados. À medida que o sistema cresce, abordagens combinadas ou a busca por mecanismos alternativos de roteamento e autenticação podem ser necessárias – especialmente quando o número de serviços e opções de conexão começa a aumentar.

No entanto, mesmo na variante considerada, a solução já oferece um benefício tangível: o gerenciamento de TLS é centralizado, o trabalho com certificados é transferido para o nível da infraestrutura, e as próprias aplicações se livram de complexidade desnecessária. Como resultado, a arquitetura se torna mais simples e sua manutenção, mais previsível.

Percorremos o caminho desde a conexão básica através do Service Mesh até um cenário multiusuário mais complexo, analisamos as limitações do roteamento TCP e vimos como elas afetam o design da solução. Este é um bom exemplo de como as abstrações de infraestrutura facilitam a vida – mas ao mesmo tempo exigem a compreensão de seus limites.

Tradicionalmente, forneço um link para o repositório com exemplos de configuração discutidos no artigo: https://gitverse.ru/spbvalentine/istio-demo/tag/v1.2.0

Obrigado pela atenção!

🛡️⚡

Pare de pesquisar. Comece a hackear.

O MundiX é seu copiloto de pentest com IA: comandos exatos, análise de outputs e próximo passo na kill chain — em segundos.

Testar grátis por 7 dias →

Sem cartão para começar · Planos a partir de R$49/mês

📤 Compartilhar & Baixar

🧰 Ferramentas recomendadas

Divulgação: alguns links são patrocinados. Podemos receber comissão se você comprar — sem custo extra para você. Só indicamos o que faz sentido para a comunidade.

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Com centenas de ferramentas pré-instaladas, a distribuição Kali Linux facilita o trabalho de os profissionais de segurança começarem a fazer testes de segurança rapidamente. No entanto, com mais de 600 ferramentas em seu arsenal, o Kali Linux também pode ser desafiador. A nova edição deste prático livro abrange as atualizações nas ferramentas e inclui uma melhor abordagem da análise forense e da engenharia reversa. Ric Messier, autor, não fica apenas no teste de segurança, mas também faz uma abordagem sobre a execução de análise forense, incluindo a análise em disco e na memória, assim como alguma análise básica de malware. • Explore as diversas ferramentas disponíveis no Kali Linux • Entenda o valor do teste de segurança e examine os tipos de teste disponíveis • Aprenda os aspectos básicos do pentest em todo o ciclo de vida do ataque • Instale o Kali Linux em vários sistemas, tanto físicos quanto virtuais • Descubra como usar diferentes ferramentas destinadas à segurança • Estruture um teste de segurança baseado nas ferramentas do Kali Linux • Estenda as ferramentas do Kali para criar técnicas de ataque avançadas • Use o Kali Linux para ajudar a criar relatórios quando o teste terminar “A abordagem concisa, clara e baseada na experiência adotada por Ric Messier para a introdução do Kali Linux e dos testes de cibersegurança é incomparável. Este livro é uma leitura excelente e acessível para iniciantes e um recurso valioso para qualquer pessoa.” —Alexander Arlt, Consultor sênior de segurança, Google

Ver na Amazon
Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Compatível com portas USB-C e USB-A, ideal para ampliar a conectividade de dispositivos como MacBook Pro e outros com portas USB-C. Inclui um adaptador USB-A extra, proporcionando uma conexão Ethernet estável e veloz de até 1 Gbps, perfeita para filmes, jogos online e videoconferências. Oferece três portas USB 3.0 com velocidades de transferência de até 5 Gbps, permitindo conectar mouse, teclado, discos rígidos e outros periféricos. Fabricado em alumínio durável, garantindo longa vida útil e resistência ao uso diário. Design compacto e leve, ideal para viagens de negócios e uso diário, facilitando o transporte e armazenamento. Funciona com Windows 10/8.1/8, Mac OS e Chrome OS, oferecendo versatilidade incomparável para diversas necessidades de conectividade. Assegura uma conectividade estável e rápida, perfeita para tarefas exigentes como transferência de dados, streaming e mais.

Ver na Amazon
Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs is a crash course on web API security testing that will prepare you to penetration-test APIs, reap high rewards on bug bounty programs, and make your own APIs more secure. You'll learn how REST and GraphQL APIs work in the wild and set up a streamlined API testing lab with Burp Suite and Postman. Then you'll master tools useful for reconnaissance, endpoint analysis, and fuzzing, such as Kiterunner and OWASP Amass. Next, you'll learn to perform common attacks, like those targeting an API's authentication mechanisms and the injection vulnerabilities commonly found in web applications. You'll also learn techniques for bypassing protections against these attacks. In the book's nine guided labs, which target intentionally vulnerable APIs, you'll practice: Enumerating APIs users and endpoints using fuzzing techniques Using Postman to discover an excessive data exposure vulnerability Performing a JSON Web Token attack against an API authentication process Combining multiple API attack techniques to perform a NoSQL injection Attacking a GraphQL API to uncover a broken object level authorization vulnerability

Ver oferta
Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Up-to-date strategies for thwarting the latest, most insidious network attacks This fully updated, industry-standard security resource shows, step by step, how to fortify computer networks by learning and applying effective ethical hacking techniques. Based on curricula developed by the authors at major security conferences and colleges, the book features actionable planning and analysis methods as well as practical steps for identifying and combating both targeted and opportunistic attacks. Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition clearly explains the enemy's devious weapons, skills, and tactics and offers field-tested remedies, case studies, and testing labs. You will get complete coverage of Internet of Things, mobile, and Cloud security along with penetration testing, malware analysis, and reverse engineering techniques. State-of-the-art malware, ransomware, and system exploits are thoroughly explained. Fully revised content includes 7 new chapters covering the latest threats Includes proof-of-concept code stored on the GitHub repository Authors train attendees at major security conferences, including RSA, Black Hat, Defcon, and B-Sides

Ver na Amazon
Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Proteção de privacidade aprimorada: protege o link de transmissão de dados para evitar roubo de informações, fornecendo proteção de segurança robusta que protege a privacidade do usuário durante transferências de arquivos e garante uma conexão segura para interações de dispositivos sem preocupações em vários ambientes Uso a longo prazo: a camada protetora resistente ao desgaste, combinada com um corpo de metal resistente, oferece gerenciamento de calor confiável e qualidade duradoura durante o uso diário Entrega eficiente de energia: a tecnologia de chip inteligente garante a identificação automática dos requisitos de energia, fornecendo carregamento eficiente alinhando-se com vários protocolos de carregamento rápido para maior conveniência Proteção contra sobrecarga: evitando riscos de sobrecarga, este bloqueador de dados USB protege a vida útil da bateria e garante um desempenho estável, mantendo um fluxo estável de energia para melhorar a longevidade do dispositivo de forma eficaz Prático de transportar: com atenção à portabilidade, este bloqueador de dados USB oferece um design compacto que é leve e fácil de transportar, melhorando a conveniência do usuário e operação eficiente

Ver na Amazon

📩 Newsletter MundiX

Receba novidades de cibersegurança + um checklist de pentest grátis. Sem spam.

Ao assinar você concorda em receber e-mails. Cancele quando quiser.