נבדק לאחרונה: מאי 2026
בנו את שירותי AWS של בחינת SAP-C02 עם Terraform פשוט — בלוק אחד בכל פעם, כאשר כל אחד מהם מקושר בחזרה לתחום במבחן. אותו הקוד עובד גם ב-OpenTofu.
בסוף מעבדה זו, תהיה לך פרוסה, באמצעות Terraform רגיל, התשתית הארגונית שכל שאלת SAP-C02 מרובת חשבונות מניחה – מבנה יחידות ארגוניות (OU) של AWS Organizations, מדיניות בקרת שירות (SCP) האוכפת גדר ביטחון של אזורים מותרים, תפקיד IAM בין-חשבונות שנטלי שירותים משותפים יכולים לאמץ, ושביל ארגוני מרכזי של CloudTrail הכותב לדלי S3 בלתי ניתן לשינוי. זוהי ארכיטקטורת ריבוי חשבונות המנוהלת בקנה מידה רחב שהבחינה בודקת ביותר מ-30% מהזמן.
כל משאב הוא Terraform רגיל. שים את הקטעים לקובץ main.tf אחד, הפעל terraform init, ולאחר מכן terraform apply צעד אחר צעד.
>= 1.5 או OpenTofu >= 1.6.us-east-1 מול חשבון הניהול.כל משאבי Organizations ו-IAM הם תמיד בחינם. שני הפריטים בתשלום:
הערימה כולה עומדת על $0. הרס כאשר סיימת כדי למנוע מדלי יומני הביקורת לצבור ראיות תאימות שאולי לא תרצה לשמור לעד.
פתיח סטנדרטי. Organizations הוא שירות גלובלי, אך נקודות הקצה של ה-API שלו נמצאות ב-us-east-1. הפעל תמיד Terraform ברמת ארגון מ-us-east-1 – בחינת ה-SAP-C02 בודקת פרט מדויק זה תחת קישוריות רשת ואספקת תוכן בעת הערכת ארכיטקטורות מרובות אזורים.
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-sap-c02"
ManagedBy = "terraform"
}
}
}
data "aws_caller_identity" "current" {}
# Replace with the 12-digit account ID of the *shared-services* account
# we are wiring cross-account trust to in Step 4.
locals {
shared_services_account_id = "111122223333"
}אם חשבון הניהול אינו כבר מאסטר של ארגון, משאב זה יוצר את הארגון. ההגדרה feature_set = "ALL" מאפשרת SCPs (החלופה של חיוב מאוחד בלבד משמיטה SCPs לחלוטין – SAP-C02 בודק את שני המצבים). רשימת enabled_policy_types בוחרת בשלושת סוגי המדיניות שמעבדה זו משתמשת בהם; היית מוסיף BACKUP_POLICY ו-AISERVICES_OPT_OUT_POLICY עבור תחומים אלה.
שתי היחידות הארגוניות שאנו יוצרים – Production ו-NonProduction – הן צורת הייחוס של SAP-C02 להיקף גדר הביטחון. SCPs מתחברים ליחידות ארגוניות; יחידות ארגוניות מכילות חשבונות. מיקום חשבון ליחידה ארגונית הוא המנוף הגדול ביותר שיש לארכיטקט מרובה חשבונות, מכיוון ש-כל SCP זורם מהיחידה הארגונית למטה לכל חשבון שמתחתיה.
resource "aws_organizations_organization" "main" {
feature_set = "ALL"
enabled_policy_types = [
"SERVICE_CONTROL_POLICY",
"TAG_POLICY",
]
aws_service_access_principals = [
"cloudtrail.amazonaws.com",
]
}
resource "aws_organizations_organizational_unit" "production" {
name = "Production"
parent_id = aws_organizations_organization.main.roots[0].id
}
resource "aws_organizations_organizational_unit" "non_production" {
name = "NonProduction"
parent_id = aws_organizations_organization.main.roots[0].id
}SCPs הם הפרימיטיב המנהלי של SAP-C02 – הם המנגנון היחיד שיכול למנוע ממנהלי חשבון חבר לבצע פעולה מסוימת, נקודה. דפוס ה-SCP הנפוץ ביותר בבחינות הוא הגבלת אזורים מותרים: גם אם מנהל IAM של חשבון חבר מעניק *:* לכולם, גדר הביטחון האזורית הנכפית על ידי ה-SCP עדיין חוסמת פעולות מחוץ לקבוצת האזורים המותרים.
המדיניות שלהלן שוללת כל פעולה של ec2:*, rds:*, ו-lambda:* שאזור ה-aws:RequestedRegion שלה אינו us-east-1 או us-west-2. שירותים גלובליים (IAM, Organizations, CloudFront) אינם מושפעים מכיוון שהם אינם מכבדים את תנאי RequestedRegion. SAP-C02 בודק חריגה מדויקת זו – סטודנטים השוללים *:* מחוץ לאזורים המותרים שוברים בטעות את IAM ונועלים את עצמם מחוץ למערכת.
המדיניות מצורפת לשתי היחידות הארגוניות משלב 2. חשבונות בתוך יחידות ארגוניות אלו כפופים למדיניות; חשבון הניהול אינו מושפע (שאלת מלכודת חוזרת ב-SAP-C02: "מדוע ה-SCP אינו חוסם את מאסטר הארגון?" – מכיוון שמטבע העיצוב הוא אינו יכול).
resource "aws_organizations_policy" "allowed_regions" {
name = "certlabpro-sap-c02-allowed-regions"
description = "Deny ec2/rds/lambda outside the allowed regions."
type = "SERVICE_CONTROL_POLICY"
content = jsonencode({
Version = "2012-10-17"
Statement = [{
Sid = "DenyNonAllowedRegions"
Effect = "Deny"
NotAction = [
"iam:*",
"organizations:*",
"cloudfront:*",
"route53:*",
"support:*",
"sts:*",
"waf:*",
]
Resource = "*"
Condition = {
StringNotEquals = {
"aws:RequestedRegion" = ["us-east-1", "us-west-2"]
}
}
}]
})
}
resource "aws_organizations_policy_attachment" "production" {
policy_id = aws_organizations_policy.allowed_regions.id
target_id = aws_organizations_organizational_unit.production.id
}
resource "aws_organizations_policy_attachment" "non_production" {
policy_id = aws_organizations_policy.allowed_regions.id
target_id = aws_organizations_organizational_unit.non_production.id
}IAM בין-חשבונות הוא הפרימיטיב של שירותים משותפים ב-SAP-C02. הדפוס: חשבון עומס עבודה יוצר תפקיד עם מדיניות אמון המציינת את חשבון השירותים המשותפים כעיקרון האמין; אנשים או שירותים בחשבון השירותים המשותפים מבצעים sts:AssumeRole לתוך חשבון עומס העבודה כדי לבצע את עבודתם. כך מטפלת כל ארכיטקטורת ייחוס של SAP-C02 בניטור מרכזי, ביקורת, פריסה ופלטפורמת נתונים כשירות.
אנו כוללים תנאי MFA (aws:MultiFactorAuthPresent = true) – הבחינה בודקת זאת כהבדל בין מדיניות אמון מאובטחת לבין מדיניות שהיא פשוט פונקציונלית. תנאי ה-ExternalId הוא הרגל השנייה של הגנת בעיית הסגן – מומלץ לגישה של צד שלישי, אך נפוץ גם בשימוש פנימי בין חשבונות.
מדיניות ההרשאות המוטמעת מעניקה לתפקיד הנלקח גישת קריאה לכל מה שעומס העבודה צריך לעשות; עבור המעבדה אנו מעניקים גישת קריאה בלבד לדלי יומן הביקורת שניצור בשלב 5. בייצור, היית מצמצם זאת עוד יותר.
resource "aws_iam_role" "shared_services_reader" {
name = "certlabpro-sap-c02-shared-services-reader"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = {
AWS = "arn:aws:iam::${local.shared_services_account_id}:root"
}
Action = "sts:AssumeRole"
Condition = {
Bool = {
"aws:MultiFactorAuthPresent" = "true"
}
StringEquals = {
"sts:ExternalId" = "certlabpro-sap-c02-external-id"
}
}
}]
})
max_session_duration = 3600
}
# The reader-policy is wired in Step 5 once the audit bucket exists.אבן הראשה לכל סיפור ממשלתי מרובה חשבונות של SAP-C02 היא שביל הארגון – שביל CloudTrail אחד, המוגדר בחשבון הניהול, אשר לוכד אירועי ניהול בכל חשבונות החברים בארגון. SAP-C02 בודק זאת כנגד האנטי-דפוס של שביל אחד לכל חשבון (רועש תפעולית, ביקורת חלקית, יקר יותר).
דלי ה-S3 זקוק למדיניות דלי ספציפית המעניקה ל-CloudTrail את הרשאת s3:PutObject עם מוסכמות הנתיב הנכונות – cloudtrail.amazonaws.com כעקרון השירות, ה-aws:SourceArn תואם לשביל. שאלות SAP-C02 על מדוע CloudTrail אינו יכול לכתוב לדלי מרכזי כמעט תמיד מצביעות על מדיניות זו.
עם השביל במקום, כל קריאת API בכל חשבון בארגון נוחתת בדלי זה. תפקיד ה-IAM משלב 4 מעניק לחשבון השירותים המשותפים גישת קריאה לדלי – כלומר, צוות ביקורת מרכזי יכול לסקור פעילות בכל הארגון מבלי להזדקק אי פעם לגישה לחשבונות חברים בודדים. זוהי ארכיטקטורת הארגון של SAP-C02 בחמש בלוקים.
resource "aws_s3_bucket" "audit_logs" {
bucket_prefix = "certlabpro-sap-c02-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_versioning" "audit_logs" {
bucket = aws_s3_bucket.audit_logs.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_policy" "audit_logs_cloudtrail" {
bucket = aws_s3_bucket.audit_logs.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Sid = "AWSCloudTrailAclCheck"
Effect = "Allow"
Principal = { Service = "cloudtrail.amazonaws.com" }
Action = "s3:GetBucketAcl"
Resource = aws_s3_bucket.audit_logs.arn
},
{
Sid = "AWSCloudTrailWrite"
Effect = "Allow"
Principal = { Service = "cloudtrail.amazonaws.com" }
Action = "s3:PutObject"
Resource = "${aws_s3_bucket.audit_logs.arn}/AWSLogs/*"
Condition = {
StringEquals = {
"s3:x-amz-acl" = "bucket-owner-full-control"
}
}
},
]
})
}
resource "aws_cloudtrail" "org_trail" {
name = "certlabpro-sap-c02-org-trail"
s3_bucket_name = aws_s3_bucket.audit_logs.bucket
is_multi_region_trail = true
is_organization_trail = true
include_global_service_events = true
enable_log_file_validation = true
depends_on = [
aws_s3_bucket_policy.audit_logs_cloudtrail,
aws_organizations_organization.main,
]
}
# Cross-account IAM permissions (continued from Step 4): the role we
# created earlier now gets read access to the audit bucket so a
# shared-services audit team can query CloudTrail across the org.
resource "aws_iam_role_policy" "shared_services_audit_read" {
name = "read-audit-logs"
role = aws_iam_role.shared_services_reader.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["s3:GetObject", "s3:ListBucket"]
Resource = [aws_s3_bucket.audit_logs.arn, "${aws_s3_bucket.audit_logs.arn}/*"]
}]
})
}terraform destroy מפרק את כל מה שקיים במעבדה זו, עם אזהרות:
terraform destroy אם קיימים חשבונות חברים. אם צירפת חשבונות לארגון במהלך המעבדה, עליך להסיר אותם קודם דרך קונסולת AWS Organizations (או דרך ה-API). חשבון ניהול ללא חשבונות חברים יכול לעזוב את הארגון שלו, אך פעולת ה-destroy של Terraform תיכשל אם לארגון יש ילדים. עבור מעבדה נקייה, הפעל זאת רק מול חשבון חדש ללא חשבונות חברים מצורפים.force_destroy = false. CloudTrail יכתוב אליו לפחות חלק מהאירועים עד שתבצע destroy. רוקן אותו תחילה באמצעות aws s3 rm s3://<bucket> --recursive.SAP-C02 מכסה משטח אדריכלי עצום שמעבדה זו אינה יכולה להכיל – Control Tower (אין דרך נקייה של Terraform לפרוס; AWS API דורש אינטראקציה בקונסולה לצורך הגדרת אזור נחיתה), Service Catalog (מוצרים מרובי חשבונות), AWS Config aggregator לתאימות ברמת הארגון, מדיניות כספת AWS Backup על פני חשבונות, AWS RAM (Resource Access Manager), CloudFormation StackSets עבור IaC מרובה חשבונות, Direct Connect Gateway, Aurora Global Database, AWS Migration Hub, AWS Application Migration Service (AWS MGN), משפחת Storage Gateway, ושירותי ה-AWS ההיברידיים השונים (Outposts, Local Zones, Wavelength).
אנו נצמדים לארבעת הפרימיטיבים הארגוניים המרכזיים מכיוון שהם הבסיס שכל דפוס SAP-C02 אחר מתחבר אליו. RAM משתף משאבים בין חשבונות בארגון משלב 2. Config aggregator מושך ממצאי תאימות לחשבון הניהול שבבעלותו השביל משלב 5. StackSets מגלגלים IaC לתוך מבנה היחידות הארגוניות משלב 2 באמצעות דפוס התפקיד בין-חשבונות משלב 4. בנה את היסודות קודם.
עבור המשטחים שאינם פרוסים, לקטעי עיון, מדריך ו-Editorial בדף הסמכה זה יש כיסוי קונספטואלי. בחינת ה-SAP-C02 בודקת זיהוי דפוסים אלה הרבה יותר מאשר הקצאה מעשית של כל אחד מהם – המעבדה נועדה להטמיע את ארבעת הצורות היסודיות בזיכרון השרירים.