Based on the SCS-C03 exam guideReport an error
This week covered the second axis of data protection: secrets (Secrets Manager), storage security (S3 encryption, access control, and exposure prevention), certificates (ACM), and sensitive data classification (Macie). Today we weave the individual services into scenarios and review them the way the exam actually asks (combining several controls to satisfy a single requirement). The point is not "what does each service do" but "which combination is the right answer for which requirement."
[1. Discovery and classification] Macie → "what is where" (sensitivity labeling)
↓
[2. Encryption at rest] SSE-KMS / DSSE-KMS / Object Lock → "protection at rest + immutability"
↓
[3. Access control] Bucket policy / Access Point / BPA / VPC endpoint → "who accesses, from where"
↓
[4. Channel and secrets] ACM (TLS) + Secrets Manager (credential rotation) → "protection in transit + credential lifecycle"
These four layers are the data-plane implementation of defense in depth. Even if one layer is breached (for example, credential theft), the next layer blocks: even if S3 is accessed with a stolen key, the KMS key policy refuses decryption (layer 2), the VPC endpoint condition blocks external paths (layer 3), and Object Lock Compliance physically prevents data deletion (layer 2). The point is to stack multiple controls that fail independently rather than relying on a single control.
┌──────────── Organization boundary (Organizations) ────────────┐
│ SCP: ceiling on the whole account's permissions │
│ aws:PrincipalOrgID / aws:ResourceOrgID │
└───────────────────┬───────────────────────────────────────────┘
│
[Discovery] Macie ──finding──→ EventBridge ──→ Lambda automated remediation
IAM Access Analyzer ──list of externally exposed resources
│
[Path] VPC endpoint (policy) ──→ S3 / Secrets Manager / KMS
aws:SourceVpce Deny blocks other paths
│
[Authorization] IAM ∩ bucket policy ∩ AP policy (explicit Deny wins)
│
[Encryption] SSE-KMS (+Bucket Key) / DSSE-KMS ← KMS key policy = second gate
Secrets Manager (CMK) ← only the rotation Lambda can Decrypt
│
[Immutability] Versioning → Object Lock → separate backup account
│
[Evidence] CloudTrail management/data events · server access logs · Security Hub
The glue that joins the layers in this picture is condition keys and EventBridge. Condition keys make static controls bite each other (reject uploads without encryption, reject access from outside the VPC), and EventBridge connects detection and response dynamically. Most exam scenarios reduce to the question "which layer of this picture is empty?"
Applying the 2019 Capital One breach to this four-layer model makes it clear why each layer is needed. The attacker used SSRF to obtain role credentials from EC2 metadata and read S3 data. The bucket was not public and the data was encrypted, but because it was a normal API call by a principal with legitimate permissions, layer 3 (access control) stayed open as is. Tracing this incident back through this week's controls goes like this: if the S3 permissions granted to the role had been minimal, the readable scope would have been narrow (layer 3); if the SSE-KMS key policy had not allowed that role's kms:Decrypt, it would have been blocked at decryption (layer 2); if the bucket policy had an aws:SourceVpce condition, that path would not have worked in the first place (layer 3); and if CloudTrail S3 data events had been on, the bulk reads would have been noticed much sooner (visibility). It is a situation where any single layer would have reduced the damage, which is why defense in depth does not mean "layering several is good" but "design on the premise that one will be breached."
Requirement: Automatically rotate the RDS master password every 30 days with zero authentication failures. The rotation Lambda accesses a DB in a private subnet.
Combination:
⚠️ Trap summary: single-user can cause momentary authentication failures → alternating-users + master secret reference. If the rotation Lambda cannot reach Secrets Manager from inside the VPC, rotation times out. ARN policies need the
-*suffix wildcard.
Diagnostic order (when rotation fails silently):
1. CloudTrail: is there a RotationFailed event? → if not, rotation was never triggered at all
2. Lambda logs: at which step is the exception?
createSecret / finishSecret fails → Lambda ↔ Secrets Manager path/permissions
setSecret / testSecret fails → Lambda ↔ DB path / DB user permissions
3. Check permissions: PutSecretValue, UpdateSecretVersionStage, kms:Decrypt/GenerateDataKey
4. Check the network: interface VPC endpoint + private DNS + SG 443
aws secretsmanager describe-secret --secret-id prod/db/mysql \
--query '{Enabled:RotationEnabled,Last:LastRotatedDate,Next:NextRotationDate}'
aws secretsmanager rotate-secret --secret-id prod/db/mysql --rotate-immediatelyRequirement: Retain audit logs for 7 years, with deletion impossible even for the root account. A dual-encryption regulation applies.
Combination:
aws:SecureTransport:false Deny in the bucket policy → protection in transit🎯 Key distinction: "principals with authority must be able to bypass (operational flexibility)" → Governance. "No one can ever" → Compliance. "Dual-encryption regulation" → DSSE-KMS (otherwise SSE-KMS).
Add one more layer on top and ransomware is covered too: put the backup in a separate account and apply Object Lock in that account. Even if the production account is completely taken over, the retained versions in the backup account cannot be touched.
⚠️ Trap summary: Object Lock must be enabled at bucket creation time (post-hoc enabling is an exceptional procedure). Versioning is a prerequisite, and objects within the retention period are not deleted even by lifecycle policy; when retention and cost optimization conflict, retention wins. Compliance can only extend the period and cannot shorten or release it, so do verification with Governance and move only production to Compliance.
Requirement: Ensure the data in the company's confidential bucket can never leave the company VPC.
Combination:
aws:SourceVpce StringNotEquals Deny → blocks every path other than the designated endpointaws:ResourceOrgID condition → this endpoint reaches only our organization's bucketsA data perimeter is a combination of trusted identities (PrincipalOrgID) + trusted resources (ResourceOrgID) + trusted networks (SourceVpce). Any one alone is incomplete.
Remembering separately what each of the three axes blocks helps avoid wrong answers.
| Axis | What it blocks | What it cannot block | Condition keys |
|---|---|---|---|
| Trusted identities | External accounts reading our bucket | Our employees copying to an external bucket | aws:PrincipalOrgID |
| Trusted resources | Our principals writing to external buckets | Entry from outside into our bucket | aws:ResourceOrgID, s3:ResourceAccount |
| Trusted networks | Traffic over paths outside our control | Abuse within the controlled path | aws:SourceVpce, aws:SourceIp |
You must apply both the bucket policy side (filters what comes in) and the VPC endpoint policy/SCP side (filters what goes out) for both directions to close.
{
"Sid": "EndpointAllowsOnlyOrgBuckets",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ResourceOrgID": "o-abcd1234ef",
"aws:PrincipalOrgID": "o-abcd1234ef"
}
}
}If you omit the AWS service principal exception when putting an organization-boundary Deny, legitimate paths such as CloudTrail log delivery, S3 replication, and Config snapshots are cut together. The practical standard is to evaluate aws:PrincipalIsAWSService with BoolIfExists to exclude service principals. Also, a request going through a VPC endpoint has no public source IP, so an aws:SourceIp condition does not match; an office IP allow list and a VPC endpoint condition must be opened as separate Statements.
Requirement: KMS ThrottlingException and a cost spike on an SSE-KMS bucket.
Combination: Enable the S3 Bucket Key: replace per-object KMS calls with bucket-level key derivation to cut calls by 99%. (DSSE-KMS is not compatible with Bucket Keys, so it is unsuitable here.)
Requirement: If PII is uploaded to a public bucket, detect it immediately and make the bucket private.
Combination:
Requirement: An app in account B reads a secret in account A, and the app serves HTTPS with an ACM certificate.
Combination:
[ Three gates ]
Account B role ──GetSecretValue──→ ┌ Account B IAM policy
├ Account A secret resource policy
└ Account A CMK key policy (kms:Decrypt)
If the error points to KMS, it is the third; if it points to Secrets Manager, the first two.
Requirement: Serve a static website to the internet but never make the S3 bucket public.
Combination:
BucketOwnerEnforcedcloudfront.amazonaws.com service principal but limits it to a specific distribution with an AWS:SourceArn conditionIf you omit the AWS:SourceArn condition, you get a confused deputy problem in which any CloudFront distribution can use this bucket as its origin. An answer that picks the older OAI for a new configuration is wrong (OAC supports SSE-KMS origins).
Requirement: Convert all existing SSE-S3 objects to SSE-KMS based on a specific CMK.
Combination:
The choice "changing default encryption automatically converts existing objects too" is wrong. The encryption method is determined when the object is written again.
Requirement: Provide results with personal information masked to the analytics team and the original to the audit team. Do not increase data copies.
Combination:
s3:DataAccessPointArn is Null to block bypass🎯 An answer that "copies the data into two sets and masks one" is inferior because copies increase and the exfiltration surface and consistency problems grow.
Requirement: Signs of a compromised developer account. You must decide the response order for secrets and data.
Combination (the order is the answer):
rotate-secret --rotate-immediately)"Delete the secret" is wrong. Deletion has no immediate effect because of the recovery window and only stops the application. The antidote to a leak is not deletion but rotation.
Scenario questions include a type that asks "what should have been turned on?" The key is not to confuse the question each tool answers.
| Tool | Question it answers | Default |
|---|---|---|
| CloudTrail management events | Who changed bucket policy, BPA, and encryption settings, and when | On |
| CloudTrail data events | Who read which object | Off (separate setup and billing) |
| S3 server access logs | Which request received which response code | Off |
| IAM Access Analyzer | Are there resources accessible from outside the organization | Enabled separately |
| AWS Config | Does the configuration comply with the rules (encryption, BPA, etc.) | Enabled separately |
| GuardDuty | Is the access pattern different from usual | Enabled separately |
| Macie | Is there sensitive data in it | Enabled separately |
🎯 Scenario: When "data exfiltration is suspected. Confirm which objects were actually exfiltrated" comes up, the premise of the answer is CloudTrail S3 data events. If they were not turned on, you can only know up to "when the policy changed" and can never know "what was read." The correct pattern is not to enable it on all buckets because of cost but to narrow the scope to sensitive buckets/prefixes.
| Requirement keyword | Answer |
|---|---|
| Automatic DB password rotation | Secrets Manager + Lambda rotation |
| Zero-downtime rotation | alternating-users strategy |
| Simple secret with no rotation needed, minimum cost | Parameter Store SecureString |
| Cross-account secret | CMK + resource policy + KMS key policy |
| Key access separation and audit needed | SSE-KMS |
| Dual-encryption regulation | DSSE-KMS |
| Do not entrust the key to AWS | SSE-C |
| Ease KMS cost and throttling | S3 Bucket Key |
| Retention where even root cannot delete | Object Lock Compliance |
| Retention allowing principals with authority to bypass | Object Lock Governance |
| Block unintended public exposure | Block Public Access |
| Enforce encryption with only a specific key | Bucket policy conditional Deny |
| Enforce HTTPS | aws:SecureTransport:false Deny |
| Prevent exfiltration outside the VPC | aws:SourceVpce Deny + endpoint policy |
| Split a giant bucket policy | S3 Access Point |
| Continuously detect externally exposed buckets | IAM Access Analyzer |
| S3 PII detection and classification | Macie |
| Unattended TLS certificate renewal | ACM + DNS validation |
| Direct TLS termination on EC2 | ALB+ACM or Private CA export |
| External CA certificate uploaded to ACM | Not automatically renewed - expiry monitoring required |
| mTLS / IoT device certificates | Private CA + CRL/OCSP revocation |
| Serve a static site without making it public | CloudFront + OAC (+ AWS:SourceArn condition) |
| Convert the encryption method of existing objects | S3 Batch Operations Copy |
| Provide masked views per role | S3 Object Lambda Access Point |
| Block direct bucket access (force APs) | s3:DataAccessPointArn Null Deny |
| Track which objects were read | CloudTrail data events (enabled in advance) |
| Response to credential leak | Immediate rotation, not deletion |
| Ransomware that even deletes backups | Separate account + Object Lock + versioning |
| Data transfer to accounts outside the organization | aws:ResourceOrgID (endpoint policy/SCP) |
| Service principal exception when applying a policy Deny | aws:PrincipalIsAWSService BoolIfExists |
| Pair | The one-line divider |
|---|---|
| SSE-KMS vs DSSE-KMS | Does the question contain the regulatory wording "two independent encryption layers"? |
| Governance vs Compliance | Is it "cannot be bypassed even by principals with authority, including root"? |
| single vs alternating | Is it "zero authentication failures, zero downtime"? |
| Secrets Manager vs Parameter Store | Are rotation and cross-account needed, or is cost the priority? |
| Access Analyzer vs Macie | Does it ask about the exposure path or the data content? |
| Config vs GuardDuty | Is it configuration compliance or anomalous behavior? |
| BPA vs bucket policy | Is it blocking public exposure (guardrail) or fine-grained authorization? |
| OAC vs OAI | For a new configuration, always OAC (supports SSE-KMS origins) |
StringNotEquals vs ...IfExists | Must it deny when the header is absent, or not? |
The exam's traps are usually "similar but subtly wrong" choices. SSE-KMS vs DSSE-KMS (presence of the dual-encryption regulatory keyword), Governance vs Compliance (whether bypass is possible), single vs alternating (whether zero downtime), Macie being limited to S3 (DB is wrong), the inability to install an ACM public certificate directly on EC2, and issuing CloudFront certificates in us-east-1: distinguishing these boundaries precisely is what separates the passing line from the failing line. Everyone knows "what it does," but "when it is this and when it is that" is the depth of the Specialty.
Every control this week converges on a single question: "When this layer is breached, what blocks next?" Secrets reduce the effective lifetime of a leak through rotation, encryption creates a second authorization gate in the form of the KMS key policy, access control nails down path and method with conditional Denies, immutability leaves data behind even after permissions have completely collapsed, and visibility answers what happened when all of these have failed. What the exam asks in scenarios is ultimately this too: finding which layer is empty in the requirement sentence and choosing the control that fills that layer. People who memorize service names waver in front of similar choices, but people who know the layers do not.
Click a choice to reveal the answer and explanation.
Question 1
Audit logs must be retained for 7 years, and deletion within the retention period must be absolutely impossible even if root credentials are stolen in a breach. In addition, regulation requires a double encryption layer. What is the correct combination?
Question 2
You want to prevent data in a confidential company bucket from leaving the VPC network controlled by the company. What is the most complete combination?
Question 3
You want to automatically rotate the RDS master password, the rotation Lambda must reach the DB in a private subnet, and there must be no authentication failures during rotation. Which two key elements, if missing, cause the rotation to fail?
Question 4
In a very high-traffic bucket that uses SSE-KMS, KMS ThrottlingException errors and a cost spike occur at the same time. There is no double encryption regulation. What is the optimal solution?
Question 5
An application in Account B must read a Secrets Manager secret in Account A. Which policy configuration is required in full?