From 8e0a2a8f1822c31c9758ce6b94ba0653b0908292 Mon Sep 17 00:00:00 2001 From: deploy Date: Tue, 22 Sep 2026 13:07:28 +0000 Subject: [PATCH] feat(plataforma): o certificado de selagem vem do controlador, pela URL O ipBlock da deny-cross-tenant nao vale para destino em outro namespace (o k3s avalia depois do DNAT), entao a variavel sozinha daria FalhaTemporaria. Vai junto a netpol estreita: so o servico-captacao, so o pod do controlador, so a porta 8080, so saida. --- .../plataforma/18-netpol-sealed-secrets.yaml | 60 +++++++++++++++++++ tenants/plataforma/82-servico-captacao.yaml | 12 ++++ 2 files changed, 72 insertions(+) create mode 100644 tenants/plataforma/18-netpol-sealed-secrets.yaml diff --git a/tenants/plataforma/18-netpol-sealed-secrets.yaml b/tenants/plataforma/18-netpol-sealed-secrets.yaml new file mode 100644 index 0000000..22c43d6 --- /dev/null +++ b/tenants/plataforma/18-netpol-sealed-secrets.yaml @@ -0,0 +1,60 @@ +# ============================================================================= +# P5.3 — o provisionamento alcanca o controlador do sealed-secrets. +# +# ── POR QUE, E POR QUE SO AGORA ───────────────────────────────────────────── +# +# A etapa `SEGREDOS_SELADOS` precisa do certificado PUBLICO do controlador. Ate +# 2026-09-22 ela o lia de um ARQUIVO; desde entao aceita tambem a URL +# `http://sealed-secrets-controller.kube-system:8080/v1/cert.pem`, que e a forma +# recomendada — o controlador ROTACIONA a chave a cada 30 dias (medido: 16/06, +# 16/07, 15/08, 14/09), e um arquivo versionado nasce certo e fica velho em um +# mes, EM SILENCIO. +# +# ── O MESMO DEFEITO DO 17-netpol-api-do-kubernetes, PELA MESMA CAUSA ──────── +# +# Medido em 2026-09-22, de dentro do pod do `servico-captacao`: +# +# getent hosts sealed-secrets-controller.kube-system -> 10.43.71.152 OK +# curl http://sealed-secrets-controller.kube-system:8080/v1/cert.pem +# -> HTTP 000, exit 7 +# +# O nome RESOLVE e a conexao NAO sai. A `deny-cross-tenant` libera +# `ipBlock: 10.43.0.0/16`, que cobre o ClusterIP `10.43.71.152` — e nao adianta: +# **o controlador de rede do k3s avalia DEPOIS do DNAT**, e ali o destino ja e o +# IP do POD do controlador (`10.42.x.x`), que nao casa com nenhuma regra. +# +# E a mesma armadilha que fez a API do Kubernetes devolver `000` em 2026-09-20, +# e vale registrar que ela se repete: `ipBlock` com ClusterIP nao protege nem +# libera nada para destino em OUTRO namespace. +# +# ── POR QUE ESTA REGRA E ESTREITA ─────────────────────────────────────────── +# +# `podSelector` por app: so o `servico-captacao` sela segredo; nenhum outro pod +# do namespace tem o que pedir ao controlador. +# +# O destino e o POD do controlador, por rotulo, e nao o namespace inteiro — +# `namespaceSelector` sozinho abriria a porta 8080 de TODO o kube-system. +# +# Saida apenas; o controlador nunca inicia conversa conosco. +# ============================================================================= +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: egress-sealed-secrets + namespace: plataforma-prod +spec: + podSelector: + matchLabels: + app: servico-captacao + policyTypes: [Egress] + egress: + - to: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: kube-system + podSelector: + matchLabels: + name: sealed-secrets-controller + ports: + - port: 8080 + protocol: TCP diff --git a/tenants/plataforma/82-servico-captacao.yaml b/tenants/plataforma/82-servico-captacao.yaml index b1d21c8..d174a4f 100644 --- a/tenants/plataforma/82-servico-captacao.yaml +++ b/tenants/plataforma/82-servico-captacao.yaml @@ -55,6 +55,18 @@ spec: # noutro host, este valor muda junto ou o formulario toma CORS. - { name: CAPTACAO_ORIGEM, value: "https://plataforma.athleticmap.influxdigital.com.br" } - { name: CAPTACAO_RETENCAO_MESES, value: "24" } + # P5.3 — de onde vem o certificado PUBLICO do sealed-secrets. + # + # A URL, e nao um arquivo: o controlador ROTACIONA a chave a cada + # 30 dias (medido: 16/06, 16/07, 15/08, 14/09), e um certificado + # versionado nasce certo e fica velho em um mes, EM SILENCIO — + # selar com o antigo continua funcionando enquanto ele guardar as + # privadas anteriores. Lido a cada provisionamento, vem sempre o + # corrente. + # + # Depende do `18-netpol-sealed-secrets.yaml`: sem ele a conexao + # nao sai (o ipBlock da deny-cross-tenant nao vale depois do DNAT). + - { name: PROVISIONAMENTO_CERT_SELAGEM, value: "http://sealed-secrets-controller.kube-system:8080/v1/cert.pem" } - { name: CAPTACAO_LIMITE_POR_IP, value: "5" } # Destino do aviso ao comercial. Vazio = lead e gravado e o # aviso vira log sem PII. Preencher quando houver SMTP.