Pular para o conteúdo principal

Princípios de Security by Design aplicados a IaC

📌 Princípios essenciais aplicáveis a projetos IaC

PrincípioAplicação prática no contexto IaC
Separação de ambientesDiretórios, workspaces, pipelines e artefactos independentes para dev, staging, prod
Privilégio mínimoOs recursos provisionados (ex.: roles, buckets, keys) devem ter apenas as permissões estritamente necessárias
RastreabilidadeTodas as alterações devem ser versionadas, associadas a autor, ticket, ambiente e justificação
ImutabilidadeRecursos críticos devem ser redeployáveis, evitando alterações fora de band
ConsistênciaNaming conventions, tagging, layout de diretórios e outputs padronizados
Visibilidade controladaOutputs, logs e metadados suficientes para auditoria sem expor topologia, segredos ou permissões
DesacoplamentoEvitar hardcodes, dependências implícitas e sobreposição entre módulos e ambientes
Fail securelyDefaults seguros (ex.: recursos só criados com tags e permissões restritivas por omissão)
Minimização de contextoReduzir ao mínimo a exposição de planos, outputs, topologia e metadados fora do domínio controlado

⚠️ Código não confiável por origem

Qualquer código IaC que seja:

  • gerado automaticamente,
  • sugerido por ferramentas assistidas,
  • criado a partir de templates externos,

deve ser tratado como código não confiável por origem, independentemente da ferramenta utilizada.

A confiança resulta exclusivamente de:

  • validação técnica automatizada;
  • revisão humana qualificada;
  • evidência explícita de aprovação;
  • execução controlada em pipelines autorizados.

Este princípio evita que erros sistemáticos, defaults inseguros ou hallucinations se propaguem automaticamente entre ambientes.


📋 O que deve ser feito

  1. Definir e aplicar um layout estruturado para o repositório, com separação lógica de ambientes;
  2. Usar tags obrigatórias (ambiente, owner, tipo, criticidade) em todos os recursos provisionados;
  3. Padronizar nomes e variáveis, evitando ambiguidades e erros por copy/paste;
  4. Rever permissões criadas por IaC, com especial atenção a iam_role, policy, security_group, etc.;
  5. Forçar uma estrutura comum entre projetos IaC, com templates base ou scaffolding aprovado;
  6. Evitar dependências circulares ou implícitas entre módulos e ambientes;
  7. Tratar drift e mudanças manuais como falha de segurança e não como exceção aceitável;
  8. Garantir que qualquer alteração automatizada é validada e aprovada antes de execução.

⚙️ Técnicas e ferramentas

Técnica / FerramentaAplicação prática
Layout de repositório IaCiac/ ├─ modules/ ├─ envs/ ├─ policies/ ├─ templates/
Tagging obrigatóriotags = { Environment = "prod", Owner = "appsec", ... }
Pre-commit hooksValidação de naming, presença de tags e estrutura de ficheiros
Padrão de variáveisvariable "environment" { type = string } obrigatório em todos os módulos
Testes semânticosOPA/Rego, Conftest para validar impacto real e políticas mínimas
Policy-as-CodeBloqueio de permissões amplas, ausência de tags ou naming incorreto
Reutilização controladaTemplates base para main.tf, variables.tf, outputs.tf validados

🕒 Quando aplicar

Fase do ciclo de vidaAção esperada
Criação do projeto IaCDefinir layout e aplicar princípios estruturais
Adição de novos módulosRever permissões, naming, outputs e tagging
Alterações críticasRevalidar aderência aos princípios antes de aprovação
Auditoria / revisãoVerificar rastreabilidade, tagging e minimização de exposição

👥 Perfis envolvidos

PerfilResponsabilidades
DevOps / CloudImplementar estrutura, tagging, segregação e revisão de permissões
Segurança / AppSecDefinir políticas default e validar princípios SbD
ArquiteturaAprovar standards de layout, naming e outputs
PlataformaFornecer scaffolds, templates e validações partilhadas

🧪 Exemplos práticos

  • Diretório envs/prod/ com ficheiro main.tf, onde variable "environment" é obrigatória;
  • Tagging obrigatório em recursos como aws_instance, aws_s3_bucket, validado por OPA;
  • Regra OPA de exemplo:
deny[msg] {
input.resource_type == "aws_s3_bucket"
not input.tags["Environment"]
msg := "Missing Environment tag on S3 bucket"
}

✅ Benefícios diretos

  • Redução do risco estrutural nos ambientes geridos por IaC;
  • Prevenção de exposição involuntária de topologia e permissões;
  • Consolidação de princípios SbD entre equipas e projetos;
  • Capacidade de enforcement técnico consistente e auditável.

🔗 Referências cruzadas

DocumentoRelação
addon/02-validacoes-e-checks.mdValidações automáticas e evidência
addon/03-governanca-modulos.mdGovernação e supply chain de módulos
addon/11-uso-ferramentas-automatizadas-iac.mdAutomação e ferramentas assistidas
SAMM (AA2.1, CM1.3)Padrões de arquitetura e controlo de mudança
SSDF (CM.5)Design seguro e separação de ambientes
SLSAProveniência e rastreabilidade de código