Auditoria de Infraestrutura Terraform para Segurança
Quando Usar
- Ao integrar escaneamento de segurança em pipelines CI/CD para implantações Terraform
- Ao revisar planos e módulos Terraform em busca de práticas recomendadas de segurança antes de aplicar
- Ao construir guardrails de política como código para provisionamento de infraestrutura em nuvem
- Ao auditar arquivos de estado existentes do Terraform para identificar configurações incorretas implantadas
- Ao aplicar padrões de segurança organizacionais em vários projetos Terraform
Não usar para monitoramento de segurança em tempo de execução (use ferramentas CSPM), para testes de segurança de aplicativos (use ferramentas SAST/DAST) ou para detecção de desvio de configuração de nuvem (use AWS Config ou Azure Policy após a implantação).
Pré-requisitos
- Checkov instalado (
pip install checkov) - tfsec instalado (
brew install tfsecou binário do GitHub) - Terrascan instalado (
brew install terrascan) - Terraform v1.0+ para geração de plano
- OPA (Open Policy Agent) para aplicação de políticas personalizadas
- Repositório Git com código Terraform para auditar
Fluxo de Trabalho
Passo 1: Escanear Código Terraform com Checkov
Execute o Checkov para escaneamento abrangente de segurança IaC com políticas internas e personalizadas.
# Escanear um diretório Terraform
checkov -d ./terraform/ --framework terraform
# Escanear com categorias específicas de verificação
checkov -d ./terraform/ --check CKV_AWS_18,CKV_AWS_19,CKV_AWS_20,CKV_AWS_21
# Escanear e gerar resultados em JSON
checkov -d ./terraform/ --output json > checkov-results.json
# Escanear um arquivo de plano Terraform para análise mais precisa
terraform init && terraform plan -out=tfplan
terraform show -json tfplan > tfplan.json
checkov -f tfplan.json --framework terraform_plan
# Pular verificações específicas com justificativa
checkov -d ./terraform/ --skip-check CKV_AWS_145 \
--bc-api-key $BRIDGECREW_API_KEY
# Escanear módulos Terraform
checkov -d ./modules/ --framework terraform --compact
# Listar todas as verificações disponíveis
checkov --list --framework terraform | grep CKV_AWS
Passo 2: Escanear com tfsec para Problemas Específicos do Terraform
Use tfsec para análise de segurança nativa do Terraform com orientação detalhada de correção.
# Escanear um diretório Terraform
tfsec ./terraform/
# Escanear com limiar mínimo de severidade
tfsec ./terraform/ --minimum-severity HIGH
# Gerar saída em JSON para processamento CI/CD
tfsec ./terraform/ --format json > tfsec-results.json
# Escanear com verificações personalizadas
tfsec ./terraform/ --custom-check-dir ./custom-checks/
# Excluir regras específicas
tfsec ./terraform/ --exclude-downloaded-modules \
--exclude aws-s3-enable-bucket-logging
# Escanear e falhar em severidade específica
tfsec ./terraform/ --minimum-severity CRITICAL --soft-fail
# Gerar saída SARIF para a aba de Segurança do GitHub
tfsec ./terraform/ --format sarif > tfsec.sarif
Passo 3: Executar Terrascan para Conformidade Multi-Framework
Execute o Terrascan para verificação de conformidade com frameworks CIS, NIST e SOC 2.
# Escanear Terraform contra o benchmark CIS AWS
terrascan scan -t aws -i terraform -d ./terraform/ \
--policy-type aws --verbose
# Escanear contra frameworks de conformidade específicos
terrascan scan -t aws -i terraform -d ./terraform/ \
--policy-type aws \
--categories "Compliance Validation"
# Gerar saída em JSON
terrascan scan -t aws -i terraform -d ./terraform/ \
--output json > terrascan-results.json
# Escanear um plano Terraform
terrascan scan -t aws -i terraform \
--iac-file tfplan.json \
--iac-type tfplan
# Listar políticas disponíveis
terrascan scan --list-policies -t aws
Passo 4: Criar Políticas OPA Personalizadas para Padrões Organizacionais
Escreva políticas Rego para requisitos de segurança específicos da organização.
# policy/aws_s3_encryption.rego
package terraform.aws.s3
denyl[msg] {
resource := input.resource.aws_s3_bucket[name]
not resource.server_side_encryption_configuration
msg := sprintf("O bucket S3 '%s' deve ter criptografia do lado do servidor ativada", [name])
}
# policy/aws_iam_no_wildcards.rego
package terraform.aws.iam
denyl[msg] {
resource := input.resource.aws_iam_policy[name]
statement := resource.policy.Statement[_]
statement.Action == "*"
statement.Effect == "Allow"
msg := sprintf("A política IAM '%s' não deve usar ações curinga (*)", [name])
}
denyl[msg] {
resource := input.resource.aws_iam_policy[name]
statement := resource.policy.Statement[_]
statement.Resource == "*"
statement.Effect == "Allow"
contains(statement.Action[_], "*")
msg := sprintf("A política IAM '%s' tem ações excessivamente permissivas em recursos curinga", [name])
}
# policy/aws_no_public_ingress.rego
package terraform.aws.security_group
denyl[msg] {
resource := input.resource.aws_security_group_rule[name]
resource.type == "ingress"
resource.cidr_blocks[_] == "0.0.0.0/0"
resource.from_port <= 22
resource.to_port >= 22
msg := sprintf("A regra do grupo de segurança '%s' permite SSH de 0.0.0.0/0", [name])
}
# Avaliar plano Terraform contra políticas OPA
terraform show -json tfplan | opa eval \
--data ./policy/ \
--input /dev/stdin \
"data.terraform.aws" \
--format pretty
# Executar Conftest para testes de política OPA mais fáceis
conftest test tfplan.json --policy ./policy/ --output json
Passo 5: Integrar Escaneamento de Segurança no Pipeline CI/CD
Adicione o escaneamento de segurança IaC como um gate obrigatório no CI/CD.
# GitHub Actions: Pipeline de segurança Terraform
name: Escaneamento de Segurança Terraform
on:
pull_request:
paths: ['terraform/**']
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configurar Terraform
uses: hashicorp/setup-terraform@v3
- name: Terraform Init & Plan
run: |
cd terraform/
terraform init
terraform plan -out=tfplan
terraform show -json tfplan > tfplan.json
- name: Escaneamento Checkov
uses: bridgecrewio/checkov-action@master
with:
directory: terraform/
framework: terraform
output_format: sarif
output_file_path: checkov.sarif
soft_fail: false
- name: Escaneamento tfsec
uses: aquasecurity/[email protected]
with:
working_directory: terraform/
soft_fail: false
- name: Enviar SARIF
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: checkov.sarif
- name: Verificação de Políticas OPA
run: |
conftest test terraform/tfplan.json \
--policy ./policy/ \
--output json
Passo 6: Escanear Estado do Terraform para Configurações Incorretas Implantadas
Audite o estado atual do Terraform para identificar problemas de segurança já implantados.
# Exportar estado atual como JSON
terraform show -json > terraform-state.json
# Escanear o estado com Checkov
checkov -f terraform-state.json --framework terraform_plan
# Consultar estado para problemas de segurança específicos
terraform state list | while read recurso; do
terraform state show "$recurso" 2>/dev/null | grep -i "public\|0.0.0.0\|encrypt.*false\|password"
done
# Encontrar recursos sem tags obrigatórias
terraform state list | grep aws_instance | while read recurso; do
tags=$(terraform state show "$recurso" | grep -A20 "tags")
if ! echo "$tags" | grep -q "Environment"; then
echo "TAG AUSENTE: $recurso não tem a tag 'Environment'"
fi
done
Conceitos-chave
| Termo | Definição |
|---|---|
| Infraestrutura como Código | Prática de gerenciar infraestrutura em nuvem por meio de arquivos de configuração declarativos (Terraform, CloudFormation) em vez de operações manuais no console |
| Política como Código | Expressar políticas de segurança e conformidade como código executável (Rego, Python) que pode ser avaliado automaticamente contra definições de infraestrutura |
| Shift Left na Segurança | Mover verificações de segurança para o início do ciclo de desenvolvimento escaneando IaC antes da implantação, em vez de auditar após o provisionamento |
| Plano Terraform | Visualização das alterações que o Terraform fará, que pode ser exportada como JSON para escaneamento de segurança antes de aplicar as alterações |
| Checkov | Ferramenta de análise estática open-source para IaC com suporte a Terraform, CloudFormation, Kubernetes e Docker, com mais de 1000 políticas internas |
| OPA/Rego | Open Policy Agent e sua linguagem de políticas Rego para definir regras de segurança personalizadas que avaliam entradas de dados estruturados |
Ferramentas e Sistemas
- Checkov: Scanner abrangente de IaC com mais de 1000 políticas para Terraform, CloudFormation, Kubernetes, ARM e Dockerfile
- tfsec: Ferramenta de análise estática específica para Terraform com orientação detalhada de correção e saída SARIF
- Terrascan: Scanner multi-IaC com suporte a frameworks de conformidade (CIS, NIST, SOC 2) e política como código
- OPA/Conftest: Motor de políticas personalizadas para definir regras de segurança específicas da organização usando a linguagem Rego
- Bridgecrew: Plataforma comercial construída sobre o Checkov, fornecendo detecção de desvios e segurança da cadeia de suprimentos
Cenários Comuns
Cenário: Adicionar Gates de Segurança a um Pipeline CI/CD Terraform Existente
Contexto: Uma equipe DevOps implanta infraestrutura via Terraform no GitHub Actions, mas não possui escaneamento de segurança. Descobertas de auditoria recentes mostram vários buckets S3 sem criptografia e grupos de segurança permitindo SSH da internet.
Abordagem:
- Adicionar Checkov como o primeiro gate de segurança no fluxo de trabalho do GitHub Actions
- Executar
checkov -d ./terraform/para estabelecer a linha de base atual de descobertas - Triar as descobertas existentes: corrigir problemas CRÍTICOS, criar tickets para ALTA, suprimir riscos aceitos
- Adicionar tfsec como um scanner secundário para verificações específicas do Terraform
- Escrever políticas OPA personalizadas para padrões organizacionais (tags obrigatórias, convenções de nomenclatura)
- Configurar o pipeline para bloquear PRs com descobertas CRÍTICAS ou ALTAS
- Gerar relatórios SARIF para integração com a aba de Segurança do GitHub
Armadilhas: Adicionar escaneamento de segurança a um projeto existante produzirá inicialmente centenas de descobertas. Implemente gradualmente, começando com bloqueio apenas para CRÍTICAS, depois expandindo para ALTAS. Use comentários de supressão inline (#checkov:skip=CKV_AWS_18:Bucket público para site estático) para exceções intencionais com justificativa documentada.
Formato de Saída
Relatório de Auditoria de Segurança Terraform
==============================================
Repositório: acme-corp/infrastructure
Branch: main
Data do Escaneamento: 2026-02-23
Ferramentas: Checkov 3.x, tfsec 1.x, políticas OPA personalizadas
RESULTADOS DO ESCANEAMENTO:
Verificações Checkov aprovadas: 187
Verificações Checkov reprovadas: 34
Verificações tfsec aprovadas: 156
Verificações tfsec reprovadas: 28
Políticas OPA personalizadas: 12 aprovadas, 3 reprovadas
DESCOBERTAS CRÍTICAS:
[TF-001] Bucket S3 Sem Criptografia
Arquivo: modules/storage/main.tf:24
Recurso: aws_s3_bucket.data_lake
Verificação: CKV_AWS_19
Correção: Adicionar bloco server_side_encryption_configuration
[TF-002] Grupo de Segurança Permite SSH de 0.0.0.0/0
Arquivo: modules/network/security.tf:45
Recurso: aws_security_group_rule.ssh_access
Verificação: CKV_AWS_24
Correção: Restringir cidr_blocks à sub-rede bastion
[TF-003] Política IAM com Ações Curinga
Arquivo: modules/iam/policies.tf:12
Recurso: aws_iam_policy.developer_policy
Verificação: CKV_AWS_1
Correção: Escopo de ações para serviços específicos necessários
RESUMO POR SEVERIDADE:
Crítica: 6 descobertas
Alta: 14 descobertas
Média: 28 descobertas
Baixa: 18 descobertas
Info: 12 descobertas