Última revisão: maio de 2026
Construa os serviços da AWS do exame SCS-C03 com Terraform puro — um bloco de cada vez, cada um vinculado a um domínio do exame. O mesmo código funciona no OpenTofu.
Ao final deste laboratório, você terá provisionado, com Terraform puro, as quatro primitivas de segurança que toda conta AWS deveria ter desde o primeiro dia — uma chave KMS gerenciada pelo cliente com rotação automática, um IAM Access Analyzer verificando acesso público ou entre contas não intencional, GuardDuty ativado com feeds de inteligência de ameaças, e um bucket de logs de auditoria centralizado para o qual outras cargas de trabalho escrevem. Esta é a linha de base SCS-C03 segura por padrão.
Cada recurso é Terraform puro — o mesmo código funciona sem modificação no OpenTofu. Sem variáveis, sem módulos. Coloque os trechos em um único main.tf, execute terraform init, e depois terraform apply passo a passo.
>= 1.5 ou OpenTofu >= 1.6.us-east-1.Três dos quatro serviços aqui são gratuitos para novas contas; um tem uma cobrança real:
Se você mantiver esta linha de base em execução em uma conta real, espere pagar aproximadamente US$ 5–15/mês no total. Barato pela visibilidade que oferece. Destrua após o laboratório se preferir não fazê-lo.
Início padrão. O SCS-C03 é agnóstico em relação a provedor e região em seu escopo, mas uma linha de base de segurança precisa ser aplicada por região — GuardDuty e Access Analyzer são serviços regionais. A maioria das equipes escolhe uma região primária (por exemplo, us-east-1) para a linha de base e a replica via Terraform por região à medida que a conta se expande.
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
}
}
provider "aws" {
region = "us-east-1"
default_tags {
tags = {
Project = "certlabpro-scs-c03"
ManagedBy = "terraform"
}
}
}
data "aws_caller_identity" "current" {}O SCS-C03 testa a diferença entre chaves KMS gerenciadas pela AWS (gratuitas, rotação automática, sem política de chave que você controle) e chaves gerenciadas pelo cliente (US$ 1/mês, você possui a política, você controla a rotação, você obtém visibilidade de auditoria em cada chamada Encrypt/Decrypt via CloudTrail). A produção deve sempre optar por chaves gerenciadas pelo cliente.
Ativamos a rotação anual (enable_key_rotation = true) e escrevemos uma política de chave que dá ao usuário root da conta a capacidade de administrar a chave (o padrão da AWS para qualquer chave gerenciada pelo cliente) e concede explicitamente ao serviço IAM Access Analyzer permissão para avaliar a política da chave. O alias torna a chave referenciável por um nome legível por humanos em códigos posteriores, em vez de por UUID — o SCS-C03 testa esta convenção de nomenclatura como um pré-requisito de auditoria do CloudTrail.
resource "aws_kms_key" "app_data" {
description = "Customer-managed key for application data encryption."
enable_key_rotation = true
deletion_window_in_days = 30
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Sid = "EnableRootAccountAdmin"
Effect = "Allow"
Principal = { AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root" }
Action = "kms:*"
Resource = "*"
},
{
Sid = "AllowAccessAnalyzerToDescribe"
Effect = "Allow"
Principal = { Service = "access-analyzer.amazonaws.com" }
Action = ["kms:DescribeKey", "kms:GetKeyPolicy"]
Resource = "*"
},
]
})
}
resource "aws_kms_alias" "app_data" {
name = "alias/certlabpro-scs-c03-app-data"
target_key_id = aws_kms_key.app_data.id
}O Access Analyzer avalia continuamente as políticas baseadas em recursos (políticas de bucket S3, políticas de chave KMS, políticas de confiança de função IAM, permissões Lambda, políticas de fila SQS, políticas de rotação do Secrets Manager, e muito mais) e exibe uma descoberta sempre que detecta um recurso acessível de fora da sua conta ou limite de confiança. O domínio de Detecção de Ameaças e Resposta a Incidentes do SCS-C03 testa exatamente esse padrão — as descobertas do Access Analyzer são o sinal canônico para "oh, este bucket agora é público".
type = "ACCOUNT" restringe o analisador à sua conta; type = "ORGANIZATION" exige o AWS Organizations e restringe o escopo a toda a organização (a resposta multi-conta do SCS-C03). De qualquer forma, é sempre gratuito e sem configuração uma vez ativado.
resource "aws_accessanalyzer_analyzer" "main" {
analyzer_name = "certlabpro-scs-c03"
type = "ACCOUNT"
}GuardDuty é o serviço gerenciado de detecção de ameaças da AWS. Ele analisa continuamente CloudTrail, VPC Flow Logs e logs DNS contra os feeds de inteligência de ameaças da AWS — listas publicadas de IPs maliciosos conhecidos, domínios de criptomineração, infraestrutura de comando e controle e padrões suspeitos de comportamento de contas. As descobertas são marcadas com severidade (Baixa / Média / Alta) e um tipo analisável por máquina como Recon:EC2/PortProbeUnprotectedPort.
Ativamos o detector com frequência de publicação de 15 minutos (mais rápido que o padrão de 6 horas; as perguntas do SCS-C03 sobre MTTR quase sempre assumem publicação frequente). Os plug-ins de proteção baseados em IAM (MALWARE_PROTECTION_FOR_EC2, S3_DATA_EVENTS, etc.) custam mais e estão fora do escopo desta linha de base; ative-os por carga de trabalho em produção.
As descobertas são publicadas no EventBridge automaticamente — é assim que a automação a jusante (notificações do Slack, correlação do Security Hub, Lambdas de autorremediação) se conecta. O SCS-C03 testa essa cadeia descobertas → EventBridge → resposta repetidamente. Não configuramos a automação a jusante aqui, mas no momento em que o Passo 4 é concluído, o GuardDuty começa a publicar.
resource "aws_guardduty_detector" "main" {
enable = true
finding_publishing_frequency = "FIFTEEN_MINUTES"
}Toda questão de Log e Monitoramento de Segurança do SCS-C03 espera que você tenha um bucket centralizado, criptografado e estilo "gravação única" para o qual outras ferramentas de segurança — CloudTrail, VPC Flow Logs, logs de acesso ELB, exportações do GuardDuty, gravadores do Config — escrevam. O bucket é criptografado com a chave KMS gerenciada pelo cliente do Passo 2, o acesso público é totalmente bloqueado, e uma política de bucket impõe que qualquer objeto escrito deve passar pela chave do Passo 2 (nenhuma escrita em texto simples é aceita).
Usamos a configuração de propriedade bucket-owner-enforced (o modo com ACLs desativadas, recomendado pela AWS desde 2023) — este é um dos atributos de endurecimento do S3 mais testados no SCS-C03 porque elimina toda uma classe de configurações incorretas de ACLs entre contas.
Com o bucket no lugar, a linha de base está completa: KMS para chaves de criptografia, Access Analyzer para exposição não intencional, GuardDuty para detecção de ameaças e um bucket de auditoria para tudo que precisa ser retido para revisão de conformidade. Todo cenário de múltiplos serviços do SCS-C03 espera que você tenha esses quatro; as perguntas mais avançadas adicionam Security Hub, Config, Inspector ou Macie sobre esta base.
resource "aws_s3_bucket" "audit_logs" {
bucket_prefix = "certlabpro-scs-c03-audit-"
}
resource "aws_s3_bucket_public_access_block" "audit_logs" {
bucket = aws_s3_bucket.audit_logs.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_ownership_controls" "audit_logs" {
bucket = aws_s3_bucket.audit_logs.id
rule {
object_ownership = "BucketOwnerEnforced"
}
}
resource "aws_s3_bucket_server_side_encryption_configuration" "audit_logs" {
bucket = aws_s3_bucket.audit_logs.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "aws:kms"
kms_master_key_id = aws_kms_key.app_data.arn
}
bucket_key_enabled = true # cuts KMS request costs ~99% on bulk writes
}
}
resource "aws_s3_bucket_versioning" "audit_logs" {
bucket = aws_s3_bucket.audit_logs.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_policy" "audit_logs_require_kms" {
bucket = aws_s3_bucket.audit_logs.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Sid = "DenyUnencryptedWrites"
Effect = "Deny"
Principal = "*"
Action = "s3:PutObject"
Resource = "${aws_s3_bucket.audit_logs.arn}/*"
Condition = {
StringNotEquals = {
"s3:x-amz-server-side-encryption" = "aws:kms"
}
}
}]
})
}terraform destroy desmonta tudo neste laboratório. Duas observações:
deletion_window_in_days = 30, o que significa que destroy a agenda para exclusão em 30 dias — ela não é removida imediatamente (este é o padrão de segurança prescrito pelo SCS-C03; a exclusão de KMS é irreversível). Durante os 30 dias, você pode cancelar via console. Para realmente excluir, você também precisa aguardar o período. A AWS continua cobrando US$ 1/mês durante este período.force_destroy = false — se você coletou logs nele, esvazie-o antes de destruir (aws s3 rm s3://<bucket> --recursive).O SCS-C03 cobre mais terreno do que qualquer laboratório individual pode abranger — AWS Config (avaliação contínua de conformidade), Security Hub (agregação centralizada de descobertas), Macie (descoberta de PII no S3), Inspector (verificação de vulnerabilidades EC2/Lambda), Detective (investigação de ameaças), WAF + Shield (proteção de borda), Network Firewall, Network Access Analyzer, Cognito (identidade de usuário), Secrets Manager + Systems Manager Parameter Store, ACM (TLS), Firewall Manager (aplicação de políticas em várias contas) e todo o espaço de chaves de hardware CloudHSM.
Nós nos limitamos às quatro primitivas acima porque elas são a linha de base do primeiro dia sobre a qual todo o resto se constrói. As regras do Config registram descobertas no Security Hub, que as correlaciona com as descobertas do GuardDuty, que apontam para recursos protegidos por chaves KMS, com problemas de política detectados pelo Access Analyzer — e tudo isso vai parar no bucket de auditoria para revisão de conformidade. Construa a base primeiro; adicione o restante conforme o perfil de risco da carga de trabalho exigir.
Para cobertura serviço a serviço, consulte as seções Navegar, Guia e Editorial desta página de certificação. Um laboratório de acompanhamento adicionando Security Hub + Config + a cadeia de autorremediação GuardDuty-to-EventBridge seria um próximo passo natural.