Verificação de Modo de Decriptografia TLS¶
Read in your language: English · Português · Español
Status do escopo (pós-congelamento de escopo 2026-05-10) — Ver ARCHITECTURE.md para os 37 MÓDULOs canônicos + 7 Test Kinds + arquitetura de safety DOM/CPOS/PIE-PA. ADRs 0014, 0019-0025 cobrem adições pós-Freeze.
Status: habilitado por padrão no modo DUT desde este PR (nenhuma ação do operador é necessária além de atualizar o padrão regex no ConfigMap do probe caso o Subject da CA do vendor do seu NGFW não case com o catch-all default).
Por que isso importa¶
A medição principal deste test bed é o custo que o NGFW paga pela inspeção TLS — agentes (browser-engine + synthetic-load) geram carga HTTPS, o NGFW sob teste decripta e re-encripta cada conexão, e o cluster reporta o impacto em latência / throughput / taxa de erro.
Essa medição só faz sentido se o NGFW estiver de fato realizando a inspeção. Três modos de falha invalidam silenciosamente os resultados de teste:
| Falha | O que o operador acredita | O que está acontecendo de fato |
|---|---|---|
| Bypass silencioso | "Fizemos benchmark do NGFW com decriptografia TLS LIGADA" | NGFW estava com decriptografia desabilitada → resultados medem velocidade de roteamento, não capacidade de inspeção |
| Bypass parcial | "Todo o tráfego de teste foi decriptado" | NGFW tinha uma policy excluindo uma VLAN / destino → resultados mistos (parte decriptado, parte não) |
| Flip durante execução | "O modo de decriptografia se manteve estável durante o teste" | Drift de configuração / rollback no meio de um run → resultados antes e depois não são comparáveis |
Um vendor de NGFW fazendo demo do test bed tem forte incentivo para silenciosamente desabilitar a decriptografia e fazer seu equipamento parecer mais rápido. Um cliente conduzindo a própria avaliação tem forte motivo para detectar isso.
Como funciona a verificação¶
O cluster envia um TLS Decrypt Mode Probe dedicado e leve (k8s/dut/15-tls-decrypt-probe.yaml) que roda em paralelo com a frota de agentes. Uma vez por minuto, o probe:
- Abre um handshake TLS contra um webserver de persona na mesma VLAN que os agentes usam (default:
shop.persona.internal:443sobre a VLAN 20 do browser engine) - Captura o certificado folha que o peer apresentou
- Extrai o Distinguished Name do
Issuer(CN, O) - Classifica o issuer:
- Casa com o padrão de CA do NGFW (regex configurável, default captura nomes Cisco FTD / Palo Alto / FortiGate / Check Point) → decriptografia ATIVA
- Casa com o Subject do persona-ca-issuer → decriptografia em BYPASS
- Não casa com nenhum dos dois → NÃO CLASSIFICADO (probe não consegue dizer — geralmente significa que o padrão do NGFW precisa de ajuste para o vendor em uso)
- Emite métricas Prometheus
O probe compartilha o mesmo network attachment dos agentes browser engine (mesmo Multus NAD dut-pw, mesma VLAN macvlan, mesmo roteamento via NGFW). O que o probe enxerga É o que os agentes enxergam — não há possibilidade de drift entre os dois.
O que isso expõe¶
Indicador de modo em tempo real (Grafana)¶
Um dashboard Grafana dedicado TLS Decrypt Mode — NGFW Inspection Verification (dashboard JSON) mostra o veredito em tempo real como um painel stat colorido:
┌──────────────────────────────────────────────────────────┐
│ Current decrypt mode │ Peer cert issuer (CN) │
│ ┌───────────────────┐ │ Cisco FTD CA │
│ │ DECRYPT ACTIVE │ │ cn=Cisco FTD CA │
│ │ (green) │ │ o=Cisco Systems │
│ └───────────────────┘ │ │
└──────────────────────────────────────────────────────────┘
Codificação por cores:
- 🟢 DECRYPT ACTIVE — o NGFW está interceptando TLS conforme esperado
- 🟡 DECRYPT BYPASS — o NGFW está apenas roteando, não inspecionando (resultados de teste medem velocidade de roteamento)
- 🔴 UNCLASSIFIED — probe não conseguiu classificar o issuer (geralmente significa que o padrão de CA do NGFW em tls-decrypt-probe-config precisa de atualização para casar com o Subject da CA do seu vendor)
- 🔴 PROBE OFFLINE — pod do probe está fora ou não reportou em > 5 min
Detecção de mudança de modo (alertas)¶
k8s/dut/16-tls-decrypt-rules.yaml define três alertas Prometheus:
| Alerta | Severidade | Gatilho |
|---|---|---|
TLSDecryptModeChanged |
warning | Probe observou um flip (ON ↔ OFF) em até 10 min — dispara em até 1 min após a mudança |
TLSDecryptModeUnknown |
warning | Probe completou handshake mas o issuer não casou com nenhum padrão de CA por 3 min |
TLSDecryptProbeStale |
warning | Probe não reporta métricas frescas há > 5 min |
TLSDecryptModeChanged é a killer feature: qualquer execução de teste que cubra um flip no modo de decriptografia TLS é automaticamente invalidada. A annotation diz ao operador: "Pare o run atual, confirme o estado desejado do NGFW, reinicie de forma limpa."
Por que isso é um diferenciador positivo¶
Appliances comerciais nessa faixa de preço — Spirent CyberFlood, Ixia BreakingPoint — não entregam esse tipo de verificação. Eles geram carga, medem throughput, mas confiam que o operador declare corretamente o estado do NGFW. Não há checagem de ground-truth.
Este test bed: - Verifica o estado do NGFW de forma independente da declaração do operador - Detecta bypass silencioso automaticamente - Expõe mudanças de modo como alertas, não enterradas em um log - Custa ~10m de CPU e ~16Mi de RAM (o probe é busybox + alpine + um sleep loop)
Isso torna os resultados de teste deste cluster defensáveis em avaliações de cliente: o operador pode apontar para o histórico do dashboard e demonstrar que o modo de decriptografia se manteve estável durante toda a janela de medição. Um vendor não consegue silenciosamente flipar o NGFW para bypass sem que isso fique visível em um painel Grafana e em um alerta.
Configuração¶
Edite o ConfigMap tls-decrypt-probe-config em k8s/dut/15-tls-decrypt-probe.yaml para ajustar:
| Campo | Default | Para o que mudar |
|---|---|---|
ngfw_ca_subject_pattern |
regex catch-all que casa com nomes comuns de vendors | Um padrão específico que case com o CN/O do Subject da CA do seu NGFW. Exemplos: Cisco FTD CA, PAN Forward Trust, FGT_CA, Check Point Forward Trust. Use uma regex se você suportar múltiplos vendors de NGFW |
probe_target |
shop.persona.internal:443 |
Qualquer DNS:porta de persona. Default é a primeira synthetic persona, sempre disponível |
poll_interval_seconds |
60 |
Valores menores (15–30s) para detecção mais rápida de mudança de modo, ao custo de carga ligeiramente maior do probe |
Aplique a mudança de ConfigMap com kubectl apply -k k8s/dut/. A integração com Stakater Reloader reinicia o pod do probe automaticamente.
Como descobrir o Subject da CA do seu NGFW¶
A regex ngfw_ca_subject_pattern precisa casar com uma substring do Subject DN da CA de interceptação do seu NGFW. Para descobrir essa substring:
# 1. Probe a persona BEFORE configuring the regex (probe will return UNCLASSIFIED)
kubectl exec -n web-agents deploy/tls-decrypt-probe -c probe -- \
/bin/sh -c "openssl s_client -connect shop.persona.internal:443 -servername shop.persona.internal -CAfile /etc/ssl/combined/ca.crt 2>/dev/null | openssl x509 -noout -issuer"
# Output (example):
# issuer=C = US, ST = California, L = San Jose, O = Cisco Systems, OU = TLS Inspection, CN = Cisco FTD Forward Trust CA
# 2. Extract a unique substring — for the example above, "Cisco FTD" is plenty.
# 3. Update the ConfigMap:
kubectl edit configmap tls-decrypt-probe-config -n web-agents
# ngfw_ca_subject_pattern: "Cisco FTD"
# 4. Probe will pick up the new pattern within ~30s and reclassify the cert as ACTIVE.
Relacionados¶
MONITORING_TEST_VALIDITY.md— contexto mais amplo sobre o que torna resultados de teste válidosNGFW_CONFIGURATION_REFERENCE.en.md— configuração de NGFW específica por vendorSYSTEM_OVERVIEW.md§3.x — referência de arquiteturaDUT_TESTBED.md— bring-up + bring-down do DUT