Regras de políticas
O pacote de políticas são as regras da plataforma escritas como código, e esta página lista cada uma delas: o que verifica, se para uma mudança ou só alerta, e o que a sua mensagem diz para fazer no lugar. Quando um merge request falha numa regra, encontre a regra aqui, leia a alternativa e mude o código para que ele se encaixe.
A página de políticas como código explica onde as regras rodam e o que os seus dois vereditos fazem. Em resumo, as mesmas regras rodam pelo airframe validate num notebook, na validação do merge request, nas execuções do executor na aprovação, e em policy:<root> sobre o plano antes de cada apply.
Como ler uma linha
Seção intitulada “Como ler uma linha”Cada linha é uma regra, com três informações e uma fonte:
- Nível é um de três:
- recusa (deny): o job falha, e o GitLab mescla um merge request só quando o seu pipeline passa (aplicado).
- alerta (warn): o job mostra o achado e passa. O design pede a aprovação da plataforma para cada alerta; essa aprovação é projetada, então hoje um alerta não segura nada.
- alerta nesta versão, recusa na próxima: uma regra nova que primeiro alerta, para que os times possam corrigir o que ela recusaria. Que depois ela passe a recusar é uma convenção: nada muda o nível sozinho, e algumas regras marcadas assim ainda são alertas.
- O que verifica diz o que a regra olha. No código de Terraform o pacote julga só os valores escritos de forma literal; no plano ele vê cada valor.
- O que sua mensagem indica é a alternativa conforme que a mensagem nomeia, quando nomeia uma.
- Fonte é o arquivo do pacote que guarda a regra. A lista própria do pacote é
docs/policy-pack.md; uma regra cuja fonte diz que não está listada lá está no código, mas falta nessa lista.
As tabelas descrevem o pacote na versão da plataforma 2026.10.01-1, cujo commit do control-plane é c53c0bc.
Identidade e acesso
Seção intitulada “Identidade e acesso”Nenhum principal público
- Nível
- Recusa
- O que verifica
- Uma concessão a
allUsersouallAuthenticatedUsersem qualquer membro, vínculo ou política de IAM. - O que sua mensagem indica
- Expor o serviço pelo ingresso externo atrás do IAP, que é projetado; o caminho construído é uma rota na borda compartilhada, atrás do login único.
- Fonte
- control-plane
policy/airframe/iam.rego
Nenhum papel de proprietário ou editor
- Nível
- Recusa
- O que verifica
- Os papéis
roles/ownereroles/editor, em qualquer forma de IAM. O papel de leitor é permitido: é a leitura permanente prevista no design. - O que sua mensagem indica
- Conceder um papel predefinido ou personalizado.
- Fonte
- control-plane
policy/airframe/iam.rego
Nenhuma chave de conta de serviço
- Nível
- Recusa
- O que verifica
- Qualquer recurso de chave de conta de serviço.
- O que sua mensagem indica
- Usar a federação de identidade de carga de trabalho.
- Fonte
- control-plane
policy/airframe/iam.rego
Nenhuma administração de IAM para um membro não listado
- Nível
- Alerta nesta versão, recusa na próxima
- O que verifica
- Um papel que administra IAM, como Project IAM Admin, concedido num projeto, numa pasta ou na organização a um membro que o pacote não lista para ele.
- O que sua mensagem indica
- Nenhuma: os papéis de uma raiz são o escopo que o seu README declara, nunca a administração de IAM.
- Fonte
- control-plane
policy/airframe/iam.rego,input.rego; não está listada emdocs/policy-pack.md
Nomes, rótulos e região
Seção intitulada “Nomes, rótulos e região”Os rótulos da plataforma
- Nível
- Recusa
- O que verifica
- Um recurso que declara rótulos precisa levar
managed_by,tenant,domain,product,envecriticality. Chaves do KMS, segredos do Secret Manager e grupos do Cloud Identity estão isentos. - O que sua mensagem indica
- A mensagem lista os rótulos que faltam. Os módulos do golden path colocam todos eles.
- Fonte
- control-plane
policy/airframe/naming.rego
Os identificadores de projeto seguem as regras de nomes
- Nível
- Recusa
- O que verifica
- Um identificador de projeto escrito precisa ser o de um produto,
lk-<domain>-<product>[-np]-<rnd>, o de um projeto da plataforma ou o de um playground. - O que sua mensagem indica
- As regras de nomes dos contratos, seção 2.
- Fonte
- control-plane
policy/airframe/naming.rego
Um recurso avulso precisa de um motivo
- Nível
- Alerta
- O que verifica
- Cada recurso que uma raiz de produto declara por conta própria em vez de por um módulo do golden path.
- O que sua mensagem indica
- Dar um motivo no merge request, e usar os módulos do golden path quando um deles cobre o recurso.
- Fonte
- control-plane
policy/airframe/naming.rego
O nome de um recurso avulso começa com o do produto
- Nível
- Alerta nesta versão, recusa na próxima
- O que verifica
- Um recurso avulso cujo nome não começa com o seu rótulo
producte um hífen. - O que sua mensagem indica
- Começar o nome com o slug do produto, como dizem as regras de nomes dos contratos.
- Fonte
- control-plane
policy/airframe/naming.rego
Uma só região
- Nível
- Recusa
- O que verifica
- Qualquer região ou localização escrita que não seja
us-central1, uma zona dentro dela, ouglobal. - O que sua mensagem indica
- A região da plataforma,
us-central1, que a mensagem nomeia. - Fonte
- control-plane
policy/airframe/naming.rego
Nenhum identificador ou número de projeto escrito no código
- Nível
- Alerta nesta versão, recusa na próxima
- O que verifica
- Fora das fábricas de projetos, qualquer texto com a forma de um identificador ou de um número de projeto, exceto os do projeto de bootstrap e os nomes de buckets da plataforma com a mesma forma.
- O que sua mensagem indica
- Tirar o projeto das saídas da fábrica ou da saída Ready do produto, porque um projeto reconstruído muda os dois.
- Fonte
- control-plane
policy/airframe/literal_ids.rego; não está listada emdocs/policy-pack.md
Código de Terraform
Seção intitulada “Código de Terraform”Nenhum programa externo, leitura web ou provisionador
- Nível
- Recusa
- O que verifica
- A fonte de dados
external; uma fonte de dadoshttppara um endereço fora da lista permitida, que está vazia; e um provisionador em qualquer recurso. - O que sua mensagem indica
- Nenhuma.
- Fonte
- control-plane
policy/airframe/code.rego,data.json
Provedores permitidos e uma versão de Terraform fixada
- Nível
- Recusa
- O que verifica
- No código, um provedor de fora dos namespaces permitidos (
hashicorp/,gitlabhq/,grafana/,integrations/), e uma raiz semrequired_version. Que obackend.tftenha só o backend está na lista do pacote, mas nenhuma regra o verifica, então essa parte é projetada. - O que sua mensagem indica
- Fixar a versão de Terraform da plataforma.
- Fonte
- control-plane
policy/airframe/code.rego,data.json
Estado remoto só entre pares declarados
- Nível
- Recusa
- O que verifica
- Numa raiz de produto, ler o estado de outra raiz, exceto uma raiz de prévia que lê o estado de não produção do seu produto.
- O que sua mensagem indica
- Nada além da regra: ler estado é só para os pares de produtor e consumidor declarados.
- Fonte
- control-plane
policy/airframe/code.rego,data.json
Serviços e dados
Seção intitulada “Serviços e dados”Ingresso só com login único ou pela borda
- Nível
- Recusa
- O que verifica
- Um serviço do Cloud Run aberto a todo o tráfego sem IAP, a não ser que seja o serviço de uma prévia ou um serviço nomeado da plataforma que se autentica sozinho; e ingresso só pelo balanceador num serviço que não está na borda compartilhada nem registrado para ingresso externo.
- O que sua mensagem indica
- Uma prévia é alcançada pelo seu roteador com a verificação de invocador ligada; os outros serviços vão para a borda compartilhada.
- Fonte
- control-plane
policy/airframe/cloud_run.rego
A verificação de invocador continua ligada
- Nível
- Recusa
- O que verifica
- Um serviço do Cloud Run com a verificação de invocador desligada, exceto um serviço nomeado que se autentica sozinho numa raiz da plataforma ou um serviço na borda compartilhada.
- O que sua mensagem indica
- Só os serviços nomeados que se autenticam sozinhos, hoje o controle de aprovação e o gateway de telemetria, ou um serviço na borda podem desligá-la.
- Fonte
- control-plane
policy/airframe/cloud_run.rego,data.json
Um serviço da borda mantém a verificação de invocador
- Nível
- Alerta nesta versão, recusa na próxima
- O que verifica
- Um serviço na borda compartilhada com a verificação de invocador desligada, que não seja este site.
- O que sua mensagem indica
- Manter a verificação ligada com o agente de serviço do IAP como único invocador, renderizando o produto de novo com os módulos atuais do golden path.
- Fonte
- control-plane
policy/airframe/cloud_run.rego; não está listada emdocs/policy-pack.md
O backend de um produto tem login único
- Nível
- Recusa
- O que verifica
- Numa raiz de produto, um serviço de backend do balanceador sem IAP.
- O que sua mensagem indica
- Uma rota pública usa a peça de ingresso externo, que é projetada.
- Fonte
- control-plane
policy/airframe/cloud_run.rego; não está listada emdocs/policy-pack.md
Nenhum endereço público de banco de dados
- Nível
- Recusa
- O que verifica
- Uma instância do Cloud SQL com um endereço IPv4 público.
- O que sua mensagem indica
- Nenhuma.
- Fonte
- control-plane
policy/airframe/cloud_run.rego
Instâncias mínimas acima de zero
- Nível
- Alerta
- O que verifica
- Um serviço do Cloud Run que mantém instâncias rodando, além da única instância aquecida do sandbox.
- O que sua mensagem indica
- A aprovação da plataforma, fora da criticidade 1; a aprovação é projetada.
- Fonte
- control-plane
policy/airframe/cloud_run.rego
Um banco de dados sidecar é só de uma prévia
- Nível
- Alerta nesta versão, recusa na próxima
- O que verifica
- Um contêiner chamado
databaseao lado de um serviço que não é de uma prévia. - O que sua mensagem indica
- Produção e não produção usam Cloud SQL.
- Fonte
- control-plane
policy/airframe/cloud_run.rego; não está listada emdocs/policy-pack.md
Um serviço com banco de dados sidecar roda uma instância
- Nível
- Alerta nesta versão, recusa na próxima
- O que verifica
- Um serviço com um contêiner
databaseque pode escalar para mais de uma instância. - O que sua mensagem indica
- Rodar no máximo uma instância, porque os seus dados vivem na instância.
- Fonte
- control-plane
policy/airframe/cloud_run.rego; não está listada emdocs/policy-pack.md
Uma prévia não cria instâncias de banco de dados
- Nível
- Alerta nesta versão, recusa na próxima
- O que verifica
- Uma instância do Cloud SQL, do Redis ou do AlloyDB rotulada com o ambiente de uma prévia.
- O que sua mensagem indica
- Usar a instância compartilhada do substrato de prévias ou um sidecar.
- Fonte
- control-plane
policy/airframe/cloud_run.rego; não está listada emdocs/policy-pack.md
Recursos da plataforma e segredos
Seção intitulada “Recursos da plataforma e segredos”Nenhum recurso da plataforma numa raiz de produto
- Nível
- Recusa
- O que verifica
- Numa raiz de produto, qualquer um dos tipos que a plataforma detém, como redes, sub-redes, regras de firewall, zonas DNS, certificados, projetos, pastas, APIs habilitadas, políticas da organização, políticas de negação, perímetros, pools de identidade, roteadores e NAT.
- O que sua mensagem indica
- Nenhuma: eles pertencem às raízes da plataforma.
- Fonte
- control-plane
policy/airframe/platform_owned.rego
O Secret Manager é o único armazenamento, e nenhum valor passa pelo Terraform
- Nível
- Recusa
- O que verifica
- Uma versão de segredo com o valor em
secret_data, e um segredo no Vault, na AWS ou no Azure. Uma versão cujo valor é só de escrita,secret_data_wo, passa, porque fica fora do plano e do estado. - O que sua mensagem indica
- Um mantenedor adiciona o valor no Secret Manager, ou o valor é só de escrita.
- Fonte
- control-plane
policy/airframe/platform_owned.rego
Destruição
Seção intitulada “Destruição”Nenhum projeto, banco de dados, bucket ou repositório é destruído fora de uma remoção
- Nível
- Alerta nesta versão, recusa na próxima
- O que verifica
- Um plano que destrói ou substitui um projeto, uma instância do Cloud SQL, um bucket ou um repositório do GitLab, a não ser que pertença a um produto que o catálogo dá como removido com a data já passada. A proteção contra exclusão que as fábricas de projetos colocam nos projetos de um produto ativo é o piso abaixo dela.
- O que sua mensagem indica
- Colocar o ciclo de vida do produto como removido, depois de
retire_after, no catálogo. - Fonte
- control-plane
policy/airframe/lifecycle.rego
O runner confiável não é substituído pelo próprio pipeline
- Nível
- Recusa
- O que verifica
- Um plano que apaga ou substitui a instância do runner confiável, o que encerraria o job que o aplica.
- O que sua mensagem indica
- Aplicar esse plano de um notebook com a concessão platform-apply.
- Fonte
- control-plane
policy/airframe/runner.rego; não está listada emdocs/policy-pack.md
O arquivo de pipeline
Seção intitulada “O arquivo de pipeline”Estas regras leem o .gitlab-ci.yml de um repositório. Os repositórios da plataforma estão isentos das que tratam do arquivo de um produto.
O arquivo de um produto mantém as inclusões da plataforma
- Nível
- Alerta nesta versão, recusa na próxima
- O que verifica
- O arquivo de um produto precisa incluir
tf-applyedrift-report, não pode incluir de novo os componentes injetadosvalidateoubuild-test, não pode nomear um job como um job da plataforma, comoplan:ougate:, e não pode declarar os estágios de políticas. - O que sua mensagem indica
- Manter as inclusões que o template renderizou, remover uma inclusão injetada ou um estágio de políticas, e dar outro nome ao job próprio.
- Fonte
- control-plane
policy/airframe/pipeline.rego
Os componentes são fixados num commit
- Nível
- Alerta nesta versão, recusa na próxima
- O que verifica
- Em cada repositório, um componente do control-plane incluído num branch, numa tag ou num commit abreviado.
- O que sua mensagem indica
- Fixá-lo num commit completo do control-plane, como faz
airframe pin <sha>. - Fonte
- control-plane
policy/airframe/pipeline.rego
Um job próprio de um produto nunca faz deploy
- Nível
- Recusa
- O que verifica
- Um job de um produto que declara um
environment, diretamente ou porextends; uma inclusão que não é um componente; e um job que dispara outro pipeline. - O que sua mensagem indica
- Remover o ambiente e fazer o deploy pelo componente
tf-apply. - Fonte
- control-plane
policy/airframe/pipeline.rego,docs/adr/0026-a-product-job-never-deploys.md
Só os componentes da plataforma
- Nível
- Recusa
- O que verifica
- A inclusão, num produto, de um componente que não é um dos oito do próprio control-plane:
tf-apply,drift-report,image-build,promote-artifact,catalog-publish,reconcile,validateebuild-test. - O que sua mensagem indica
- A mensagem lista os oito componentes que um produto pode incluir.
- Fonte
- control-plane
policy/airframe/pipeline.rego
Dockerfiles
Seção intitulada “Dockerfiles”As imagens partem de uma imagem base da plataforma
- Nível
- Recusa
- O que verifica
- Em cada Dockerfile que
.airframe/images.yamllista, cadaFROMe cadaCOPY --fromouADD --fromque não seja um estágio do mesmo arquivo precisa nomear uma imagem base da plataforma, fixada por uma tag diferente delatestou por um digest, e nunca calculada a partir de um argumento de build. - O que sua mensagem indica
- Construir a partir da imagem base da plataforma para a pilha, nomeada pela sua tag ou pelo seu digest.
- Fonte
- control-plane
policy/airframe/dockerfile.rego,docs/adr/0014-approved-base-images-built-in-project-and-checked-on-every-from.md
Estas regras rodam no executor, sobre os planos com preço de um merge request aprovado, e decidem o status da verificação Airframe cost. Um plano sem preço, por exemplo sem uma chave do Infracost, não é julgado.
Um aumento de custo grande
- Nível
- Alerta
- O que verifica
- Uma mudança que acrescenta mais de 10 dólares americanos por mês, ou mais de 25 por cento.
- O que sua mensagem indica
- A aprovação da plataforma, que é projetada.
- Fonte
- control-plane
policy/airframe/cost.rego; não está listada emdocs/policy-pack.md
O orçamento se mantém
- Nível
- Recusa
- O que verifica
- Uma mudança cujo custo mensal projetado para o produto passa do seu
monthly_budgetno catálogo. - O que sua mensagem indica
- Aumentar o orçamento com um merge request do catálogo que os líderes do domínio aprovem, antes que esta mudança possa ser mesclada.
- Fonte
- control-plane
policy/airframe/cost.rego; não está listada emdocs/policy-pack.md
Limites conhecidos
Seção intitulada “Limites conhecidos”Estes limites estão em aberto nesta versão da plataforma, e a página de afirmações e mecanismos os lista com o resto:
- Um recurso avulso gera alerta, nunca recusa. Um produto pode declarar recursos fora dos módulos do golden path; as regras de recusa continuam valendo para eles, assim como as regras sobre os tipos que a plataforma detém.
- Um recurso sem atributo de rótulos passa pela regra de rótulos, que verifica só os rótulos que um recurso declara.
- Os Dockerfiles são reconhecidos pelo nome do arquivo. A validação do merge request julga uma mudança só num Dockerfile listado quando o arquivo se chama
Dockerfile,Dockerfile.*,*.Dockerfileou*.dockerfile. Um arquivo listado com outro nome, comoContainerfile, só é julgado quando o merge request também muda outro arquivo que a validação observa. - Um alerta não segura nada, e nada aplica o rótulo
warnnem abre uma exceção: a aprovação e o registro de exceções são projetados.
Onde fica
No repositório control-plane:
