diff --git a/tenants/plataforma/16-netpol-tenants-no-keycloak.yaml b/tenants/plataforma/16-netpol-tenants-no-keycloak.yaml new file mode 100644 index 0000000..8ba7b79 --- /dev/null +++ b/tenants/plataforma/16-netpol-tenants-no-keycloak.yaml @@ -0,0 +1,45 @@ +# ============================================================================= +# Os tenants CHEGAM ao Keycloak compartilhado — para baixar as chaves (JWKS) +# que validam o login, e para o client `operacao` pedir token. +# +# FALTAVA, e o efeito era TODO acesso logado dos tenants provisionados +# recusado. Medido em 2026-09-26: um token VALIDO do realm do `teste5`, +# emitido por este Keycloak, voltou 401 do BFF do teste5 — o log mostrava o +# `NimbusJwtDecoder` sem conseguir baixar o JWKS de +# `keycloak.plataforma-prod.svc:8080`. Os tenants TINHAM a saida liberada (a +# `deny-cross-tenant` deles abre 8080 para `plataforma-prod`); faltava a +# ENTRADA deste lado. A `deny-cross-tenant` daqui so aceita o proprio +# namespace e o kube-system. +# +# Nao aparecia em log nenhum ate alguem logar: o JWKS so e buscado na primeira +# requisicao autenticada. Zero erro no log e "ninguem usou", nao "funciona". +# +# Mesmo desenho da `tenants-no-pgbouncer` (15-): so a porta 8080, so o pod do +# Keycloak, por rotulo `athleticmap.io/tenant` para todo tenant provisionado, +# e por nome para os quatro antigos (criados a mao, sem o rotulo), que migram +# para este Keycloak a partir de 2026-09-26 (card 156 / P4.8). +# ============================================================================= +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: tenants-no-keycloak + namespace: plataforma-prod +spec: + podSelector: + matchLabels: { app: keycloak } + policyTypes: [Ingress] + ingress: + - from: + - namespaceSelector: + matchExpressions: + - { key: athleticmap.io/tenant, operator: Exists } + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: piloto-prod } + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: demo-prod } + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: acme-prod } + - namespaceSelector: + matchLabels: { kubernetes.io/metadata.name: escolinha-prod } + ports: + - { protocol: TCP, port: 8080 }