feat(tenant): Role por tenant para os dois Secrets que o provisionamento le

db-credentials (a senha do papel) e <tenant>-tls (so a existencia, que e como a
etapa DNS_PUBLICADO sabe que o cert-manager terminou). Por tenant porque o nome
do TLS depende dele e resourceNames nao aceita curinga — e dar get em qualquer
Secret do namespace deixaria o provisionamento ler a chave Asaas DO CLIENTE.
This commit is contained in:
deploy
2026-09-24 22:39:40 +00:00
parent 9b95eb2ae0
commit dc510205d1
4 changed files with 114 additions and 4 deletions
@@ -20,3 +20,40 @@ roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: atm-provisionamento-tenants
---
# Os DOIS Secrets que o provisionamento le neste namespace, pelo nome.
#
# Role por tenant, e nao regra no ClusterRole, porque os nomes dependem do
# tenant e `resourceNames` nao aceita curinga. A alternativa seria dar `get` em
# QUALQUER Secret do namespace — e ai o provisionamento passaria a poder ler a
# chave Asaas DO CLIENTE, que e dele e nao nossa.
#
# db-credentials a senha do papel no Postgres, que a etapa BANCO_CRIADO
# precisa para dar a senha ao papel e ao pool
# {{TENANT}}-tls so a EXISTENCIA, que e como a etapa DNS_PUBLICADO sabe que
# o cert-manager terminou de emitir
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: atm-provisionamento-segredos
namespace: {{TENANT}}-prod
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
resourceNames: ["db-credentials", "{{TENANT}}-tls"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: atm-provisionamento-segredos
namespace: {{TENANT}}-prod
subjects:
- kind: ServiceAccount
name: atm-provisionamento
namespace: plataforma-prod
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: atm-provisionamento-segredos
@@ -20,3 +20,40 @@ roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: atm-provisionamento-tenants
---
# Os DOIS Secrets que o provisionamento le neste namespace, pelo nome.
#
# Role por tenant, e nao regra no ClusterRole, porque os nomes dependem do
# tenant e `resourceNames` nao aceita curinga. A alternativa seria dar `get` em
# QUALQUER Secret do namespace — e ai o provisionamento passaria a poder ler a
# chave Asaas DO CLIENTE, que e dele e nao nossa.
#
# db-credentials a senha do papel no Postgres, que a etapa BANCO_CRIADO
# precisa para dar a senha ao papel e ao pool
# escolinha-de-teste-2-tls so a EXISTENCIA, que e como a etapa DNS_PUBLICADO sabe que
# o cert-manager terminou de emitir
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: atm-provisionamento-segredos
namespace: escolinha-de-teste-2-prod
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
resourceNames: ["db-credentials", "escolinha-de-teste-2-tls"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: atm-provisionamento-segredos
namespace: escolinha-de-teste-2-prod
subjects:
- kind: ServiceAccount
name: atm-provisionamento
namespace: plataforma-prod
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: atm-provisionamento-segredos
@@ -20,3 +20,40 @@ roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: atm-provisionamento-tenants
---
# Os DOIS Secrets que o provisionamento le neste namespace, pelo nome.
#
# Role por tenant, e nao regra no ClusterRole, porque os nomes dependem do
# tenant e `resourceNames` nao aceita curinga. A alternativa seria dar `get` em
# QUALQUER Secret do namespace — e ai o provisionamento passaria a poder ler a
# chave Asaas DO CLIENTE, que e dele e nao nossa.
#
# db-credentials a senha do papel no Postgres, que a etapa BANCO_CRIADO
# precisa para dar a senha ao papel e ao pool
# escolinha-de-teste-tls so a EXISTENCIA, que e como a etapa DNS_PUBLICADO sabe que
# o cert-manager terminou de emitir
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: atm-provisionamento-segredos
namespace: escolinha-de-teste-prod
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
resourceNames: ["db-credentials", "escolinha-de-teste-tls"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: atm-provisionamento-segredos
namespace: escolinha-de-teste-prod
subjects:
- kind: ServiceAccount
name: atm-provisionamento
namespace: plataforma-prod
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: atm-provisionamento-segredos
@@ -62,10 +62,9 @@ rules:
# `resourceNames` amarra ao NOME: este ClusterRole nao le `asaas-credentials`
# nem nenhum outro Secret do cliente. E o RoleBinding do molde o limita aos
# namespaces de tenant — nao ha binding cluster-wide.
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
resourceNames: ["db-credentials"]
# A leitura de Secret do tenant NAO esta aqui: ela e uma Role por tenant, no
# molde, porque `{{TENANT}}-tls` depende do nome e `resourceNames` nao aceita
# curinga. Ver moldes/consolidado/16-rolebinding-provisionamento.yaml.
---
# O userlist do PgBouncer, que a etapa BANCO_CRIADO acrescenta.