Como saber se seu agente autônomo está fazendo o certo? Observabilidade em produção
Guia prático de SRE para monitorar agentes autônomos: tracing de chamadas de ferramentas, métricas de sucesso e custo, detecção de loops, guardrails e kill switch.
Novo: Eficify One em beta aberto. Crie seu primeiro ambiente sem cartão.Conhecer a plataforma →

Você já gastou meses implementando OAuth 2.0 com OIDC, configurou seu API Gateway certinho, e mesmo assim teve um incidente onde um serviço comprometido acessou dados que não deveria. Não foi falha de ferramenta. Foi falha de arquitetura. Zero Trust não é instalar um produto novo, é repensar cada chamada entre serviços como se viesse de uma rede hostil. E isso muda tudo na forma como você projeta autenticação e autorização em microservices.
A maioria dos incidentes de segurança em arquiteturas de microservices não acontece na borda. Acontece no interior. Um serviço de notificações comprometido consegue ler dados de clientes porque ninguém restringiu o que ele pode acessar, só se ele é autenticado.
Esse é o erro fundamental: confundir autenticação (quem é você?) com autorização (o que você pode fazer?). Zero Trust exige que você trate cada uma dessas perguntas separadamente e que a resposta seja sempre contextual.
A implementação que vou descrever é a que rodou em um cliente com 23 microservices, 14 equipes e um volume de 40 milhões de requisições por dia. Não é teoria.
Cada serviço precisa de uma identidade criptográfica, não só um segredo compartilhado. SPIFFE (Secure Production Identity Framework for Everyone) resolve isso gerando X.509 SVIDs (SPIFFE Verifiable Identity Documents) automaticamente, com rotação a cada 24 horas.
helm install spireserver spire/spireserver n spire \
set spireConfig.serverDataDir=/opt/spire/data \
set tetenantagent.enabled=false
# Agent (em cada nó)
helm install spireagent spire/spireagent n spire \
set spireConfig.serverAddress=spireserver.spire.svc.cluster.local
# Registrar um workload
kubectl exec n spire spireagentxxx c spireagent \
/opt/spire/bin/spireagent entry create \
spiffeID spiffe://dominio.com/ns/sre/sa/servicopagamentos \
parentID spiffe://dominio.com/ns/spire/node/sre \
selector k8s:ns_label:sre:true
O resultado prático: cada pod tem um certificado X.509 rotacionado automaticamente. Nenhum secret no Git, nenhum token hardcoded. Se um workload é comprometido, o certificado é revogado em minutos pelo SPIRE Server.
Com SPIFFE emitindo identidades, o service mesh (Linkerd ou Istio) aplica mTLS (mutual TLS) entre todos os serviços sem configuração manual por par. O tráfego entre serviços é criptografado por padrão.
# Linkerd: policy para permitir apenas tráfego autenticado
externallyAuthenticatedIngress:
namespaceSelector:
matchExpressions:
key: mesh.inbound.authorization
operator: In
values:
paymentprocessor
authenticationRefs:
kind: ServiceAccount
name: paymentsservice
kind: ServiceAccount
name: frauddetection
Tradeoff real: mTLS adiciona latência. Em benchmarks com Linkerd 2.14, o overhead é de 0.5ms a 2ms por hop. Em caminhos críticos de latência (transações, pagamentos), você vai sentir. Mitigação: segmentação estratégica, mTLS everywhere, mas com circuit breakers bem configurados para degradação gradual.
Aqui está onde a maioria falha. Autorização não é só "tem token válido?"; é "este serviço, neste contexto, com este recurso, pode fazer esta ação?"
OPA (Open Policy Agent) permite policy as code, versionado no Git, testável em CI, e com semântica declarativa.
# policy/authz_payments.rego
package payments.authz
default allow := false
# Regra principal: serviço interno autenticado pode ler transações
allow if {
input.source.spiffe_id == "spiffe://dominio.com/ns/payments/sa/paymentreader"
input.action == "read"
input.resource.type == "transaction"
input.resource.customer_id == input.subject.customer_id
}
# Serviço de antifraude pode inspecionar, mas não modificar
allow if {
input.source.spiffe_id == "spiffe://dominio.com/ns/fraud/sa/fraudanalyzer"
input.action == "inspect"
input.resource.type == "transaction"
count(input.resource.fraud_score) == 0 # Não pode escrever score
}
# Bloquear crosstenant access
allow if {
input.resource.tenant_id != input.subject.tenant_id
not input.source.spiffe_id in {
"spiffe://dominio.com/ns/admin/sa/platformadmin",
"spiffe://dominio.com/ns/audit/sa/auditlogger"
}
}
# Deployment do OPA como sidecar (formato Kubernetes)
spec:
containers:
name: opa
image: openpolicyagent/opa:0.61.0
args:
"run"
"server"
"configfile=/config/policy/authz_payments.rego"
"tlscertfile=/certs/tls.crt"
"tlsprivatekeyfile=/certs/tls.key"
"authentication=mtls"
"authorization=off"
ports:
containerPort: 8181
volumeMounts:
name: policy
mountPath: /config/policy
readOnly: true
name: paymentsservice
image: paymentsservice:v2.3.1
env:
name: OPA_URL
value: "http://localhost:8181"
Em 11 meses de operação, esta arquitetura entregou:
| Métrica | Antes (secrets compartilhados) | Depois (Zero Trust completo) |
|---|---|---|
| Tempo médio de detecção de comprometimento de workload | 72 horas | 8 minutos |
| Incidentes de acesso não autorizado entre serviços | 3/mês | 0 |
| Tempo de onboarding de novo serviço | 2 dias | 45 minutos |
| Revogação de acesso (exemplo: desligamento de equipe) | 4 horas | Imediato |
| Overhead de latência por requisição | 0 | 1.2ms (p99) |
O overhead de 1.2ms parece contraintuitivo, mas é aceitável quando você considera o que não gastou em incidentes. Um único vazamento de dados na LGPD custa, em média, R$ 500 mil a R$ 2 milhões em multas e remediação.
"Fazemos Zero Trust com só o API Gateway": Zero Trust não é um produto de borda. Se o tráfego entre serviços usa secrets compartilhados ou sem TLS, você não tem Zero Trust.
Policy explosion: Começar com 50 regras de autorização para cada serviço gera complexidade impalatável. Comece com denybydefault e libere apenas o caminho crítico (golden path).
Múltiplos identity providers: Se cada equipe escolhe seu IdP (Auth0, Okta, Cognito, Keycloak), você termina com federations complexas e auditabilidade zero. Padronize em um IdP corporativo com SPIFFE como identidade de workload.
Testes de policy em produção: OPA permite unit tests com opa test. Não suba policies sem cobertura de teste.
# Teste sua policy antes do deploy
opa test ./policy/authz_payments.rego v
# Saída esperada:
# PASS: authz_payments (authz_payments_test)
# ✓ allow with valid paymentreader (3ms)
# ✓ deny with invalid tenant (1ms)
Zero Trust não é um projeto que termina. É uma postura operacional. A arquitetura que descrevi não é bala de prata, é um framework que você adapta ao ritmo da sua organização. O fundamental é começar pela identidade de workload (SPIFFE) porque sem identidade confiável, nada do resto funciona.
Se sua empresa está migrando para microservices ou revisando a postura de segurança entre serviços, posso apresentar em 30 minutos como estruturamos isso na Eficify, sem compromisso.
CONTINUE LENDO
Guia prático de SRE para monitorar agentes autônomos: tracing de chamadas de ferramentas, métricas de sucesso e custo, detecção de loops, guardrails e kill switch.
Latência, erro e custo na mesma tela. Como medir o que importa sem montar um terceiro produto só para isso.
Teste de carga, autoscaling, cache, filas, CDN e acompanhamento ativo. O que fazer antes e durante para o pico não virar prejuízo.