Pular para o conteúdo principal

Exemplos de Boas Práticas de IaC Seguro

📁 Estrutura recomendada de repositório

iac/
├── modules/
│ └── networking/
│ ├── main.tf
│ ├── variables.tf
│ ├── outputs.tf
│ └── README.md
├── envs/
│ ├── dev/
│ │ ├── main.tf
│ │ └── backend.tf
│ ├── staging/
│ └── prod/
├── policies/
│ ├── opa/
│ └── conftest/
├── .github/workflows/
│ └── validate.yaml
├── .pre-commit-config.yaml
├── LICENSE
└── README.md

Propriedades de segurança asseguradas:

  • Separação física e lógica de ambientes;
  • Modularização controlada e reutilizável;
  • Integração nativa de policy-as-code;
  • Suporte direto a rastreabilidade e auditoria.

🏷️ Exemplo de tagging obrigatório

tags = {
Environment = var.environment
Owner = var.owner
Application = var.application
Criticality = var.criticality
ManagedBy = "Terraform"
}
  • As tags são aplicadas por omissão em todos os recursos;
  • A ausência de qualquer tag obrigatória deve resultar em falha bloqueante via OPA/Rego.

🔐 Exemplo de controlo de permissões (privilégio mínimo)

resource "aws_iam_role" "example" {
name = "app-deploy-role"

assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = {
Service = "ec2.amazonaws.com"
}
Action = "sts:AssumeRole"
}
]
})

managed_policy_arns = [aws_iam_policy.least_privilege.arn]
}

Notas de segurança:

  • Nenhuma política ampla (*) é permitida por omissão;
  • Permissões são explicitamente associadas e validadas em policy-as-code;
  • Revisão obrigatória para qualquer alteração em IAM.

🔄 Exemplo de uso seguro de módulos externos

module "vpc" {
source = "git::https://github.com/org/vpc-module.git?ref=v1.2.3"

cidr_block = "10.0.0.0/16"
environment = var.environment
}

Boas práticas evidenciadas:

  • Referência explícita a tag imutável (ref=vX.Y.Z);
  • Origem verificável;
  • Compatível com validação de digest e attestation em pipeline.

💪 Exemplo de workflow CI para validação IaC

name: Validate IaC

on:
pull_request:
paths:
- 'iac/**'

jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Terraform Format
run: terraform fmt -check -recursive

- name: Terraform Validate
run: terraform validate

- name: TFLint
uses: terraform-linters/setup-tflint@v1

- name: tfsec
run: tfsec ./iac

- name: Checkov
run: checkov -d ./iac

Garantias fornecidas pelo pipeline:

  • Validação sintática e estrutural;
  • Deteção precoce de más configurações;
  • Bloqueio automático de não conformidades;
  • Evidência auditável por PR/MR.

🧷 Template de pre-commit hooks

repos:
- repo: https://github.com/antonbabenko/pre-commit-terraform
rev: v1.66.1
hooks:
- id: terraform_fmt
- id: terraform_validate
- id: terraform_tflint
- id: terraform_tfsec

Objetivo:

  • Reduzir feedback loop;
  • Eliminar erros triviais antes de CI;
  • Normalizar qualidade entre contribuidores.

🔗 Ligação a requisitos

Exemplo aplicadoRequisitos relacionados
Estrutura modular de repositórioIAC-002, IAC-005, REQ-004
Tagging obrigatórioIAC-002, IAC-008, REQ-006
Uso de módulos versionadosIAC-004, REQ-007
Workflow CI com scannersIAC-003, REQ-005, REQ-006
Pre-commit hooksIAC-003, REQ-006

✅ Benefícios diretos

  • Acelera a adoção consistente de IaC seguro;
  • Reduz variação entre projetos e equipas;
  • Facilita auditoria e onboarding técnico;
  • Transforma segurança em default operacional.

🔗 Estes exemplos estão alinhados com as práticas de SSDF (PW.6), SLSA (Build L2) e OWASP SAMM (AA2.1, CM1.1), funcionando como material de referência operacional para equipas técnicas.