最后审核时间:2026年5月
使用原生 Terraform 构建 SCS-C03 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
在本实验结束时,您将使用纯 Terraform 预置每个 AWS 账户在第一天就应具备的四种安全原语——一个带有自动轮换的客户管理型 KMS 密钥、一个扫描意外跨账户或公共访问的 IAM Access Analyzer、一个启用威胁情报源的 GuardDuty,以及一个供其他工作负载写入的集中式审计日志存储桶。这是 SCS-C03 的默认安全基线。
每个资源都是纯 Terraform——相同的代码在 OpenTofu 上无需修改即可工作。没有变量,没有模块。将这些代码片段放入一个 main.tf 文件中,运行 terraform init,然后逐步运行 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。us-east-1 区域进行AWS CLI 身份验证。这里的四项服务中有三项对新账户是免费的;一项会产生实际费用:
如果您在真实账户上保持此基线运行,预计总共将支付大约每月 5-15 美元。对于它为您提供的可见性来说非常划算。如果不想保留,请在实验后销毁。
标准开场。SCS-C03 在范围上与提供商和区域无关,但安全基线需要按区域应用——GuardDuty 和 Access Analyzer 是区域服务。大多数团队会选择一个主区域(例如 us-east-1)作为基线,并随着账户的扩展通过 Terraform 将其复制到每个区域。
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" {}SCS-C03 考察AWS 管理型 KMS 密钥(免费,自动轮换,您无法控制密钥策略)和客户管理型密钥(每月 1 美元,您拥有策略,您控制轮换,通过 CloudTrail 可以审计每个加密/解密调用)之间的区别。生产环境应始终选择客户管理型密钥。
我们启用年度轮换 (enable_key_rotation = true),并编写一个密钥策略,赋予账户根用户管理密钥的能力(这是任何客户管理型密钥的 AWS 默认设置),并明确授予 IAM Access Analyzer 服务评估密钥策略的权限。别名使得密钥可以在下游代码中通过人类可读的名称而非 UUID 引用——SCS-C03 将这种命名约定作为 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
}Access Analyzer 持续评估基于资源的策略(S3 存储桶策略、KMS 密钥策略、IAM 角色信任策略、Lambda 权限、SQS 队列策略、Secrets Manager 轮换策略等),并在检测到可从您的账户或信任边界外部访问的资源时生成一个发现。SCS-C03 的威胁检测与事件响应领域正是考察这种模式——Access Analyzer 发现是“哦,这个存储桶现在是公共的”这一情况的典型信号。
type = "ACCOUNT" 将分析器范围限定为您的账户;type = "ORGANIZATION" 需要 AWS Organizations 才能跨整个组织进行范围限定(这是 SCS-C03 多账户方案的答案)。无论哪种方式,一旦启用,它始终免费且无需配置。
resource "aws_accessanalyzer_analyzer" "main" {
analyzer_name = "certlabpro-scs-c03"
type = "ACCOUNT"
}GuardDuty 是 AWS 的托管威胁检测服务。它根据 AWS 的威胁情报源——已发布的已知恶意 IP 列表、加密货币挖矿域、命令和控制基础设施以及可疑账户行为模式——持续分析 CloudTrail、VPC 流日志和 DNS 日志。发现结果会标记严重性(低/中/高)和机器可解析的类型,例如 Recon:EC2/PortProbeUnprotectedPort。
我们以 15 分钟的发布频率启用检测器(比 6 小时的默认频率更快;SCS-C03 关于 MTTR 的问题几乎总是假设频繁发布)。基于 IAM 的保护插件(MALWARE_PROTECTION_FOR_EC2、S3_DATA_EVENTS 等)需要额外付费,并且超出此基线的范围;在生产环境中应按工作负载启用它们。
发现结果会自动发布到 EventBridge——这是下游自动化(Slack 通知、Security Hub 关联、自动修复 Lambda)接入的方式。SCS-C03 反复考察这种发现 → EventBridge → 响应的链条。我们在此不连接下游,但步骤 4 完成后,GuardDuty 将开始发布。
resource "aws_guardduty_detector" "main" {
enable = true
finding_publishing_frequency = "FIFTEEN_MINUTES"
}每个 SCS-C03 安全日志记录和监控问题都要求您拥有一个集中式、加密的、一次写入式存储桶,供其他安全工具(CloudTrail、VPC 流日志、ELB 访问日志、GuardDuty 导出、Config 记录器)写入。该存储桶使用步骤 2 中的客户管理型 KMS 密钥进行加密,公共访问被完全阻止,并且存储桶策略强制规定任何写入的对象都必须通过步骤 2 中的密钥(不接受明文写入)。
我们使用 bucket-owner-enforced 所有权设置(自 2023 年起 AWS 推荐的禁用 ACL 模式)——这是 SCS-C03 上最常考察的 S3 强化属性之一,因为它消除了整类跨账户 ACL 配置错误。
有了这个存储桶,基线就完成了:KMS 用于加密密钥,Access Analyzer 用于意外暴露,GuardDuty 用于威胁检测,以及一个审计存储桶用于所有需要保留以进行合规性审查的内容。每个 SCS-C03 多服务场景都期望您拥有这四个功能;更高级的问题会在这个基础上添加 Security Hub、Config、Inspector 或 Macie。
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 将销毁本实验中的所有内容。两点说明:
deletion_window_in_days = 30,这意味着 destroy 会将其安排在 30 天后删除——它不会立即删除(这是 SCS-C03 规定的安全模式;KMS 删除不可逆)。在这 30 天内,您可以通过控制台取消。要实际删除,您还需要等待该期限结束。在此期间,AWS 将继续收取每月 1 美元的费用。force_destroy = false——如果您已在其中收集日志,请在销毁前清空它 (aws s3 rm s3://<bucket> --recursive)。SCS-C03 涵盖的范围远超任何单个实验所能容纳的——AWS Config(持续合规性评估)、Security Hub(集中式发现聚合)、Macie(S3 PII 发现)、Inspector(EC2/Lambda 漏洞扫描)、Detective(威胁调查)、WAF + Shield(边缘保护)、Network Firewall、Network Access Analyzer、Cognito(用户身份)、Secrets Manager + Systems Manager Parameter Store、ACM (TLS)、Firewall Manager(多账户策略实施)以及整个 CloudHSM 硬件密钥空间。
我们坚持上述四种原语,因为它们是所有其他内容的基础,是第一天的基线。Config 规则将发现写入 Security Hub,Security Hub 将它们与 GuardDuty 发现关联起来,这些发现指向受 KMS 密钥保护的资源,其中策略问题由 Access Analyzer 捕获——所有这些都将落入审计存储桶进行合规性审查。首先打好基础;然后根据工作负载的风险概况叠加其余功能。
有关服务的逐项覆盖,请参阅此认证页面中的浏览、手册和Editorial部分。一个后续实验,添加 Security Hub + Config + GuardDuty 到 EventBridge 的自动修复链将是一个自然的下一步。