Based on the DEA-C01 exam guideReport an error
This week we looked at access control, encryption, sensitive data protection, and governance, one per day. The four topics are not separate features; they are the checkpoints that a single analyst query passes through, in order, before it reaches the data.
An analyst's Athena query
│
▼ ① Transport: is it TLS? (aws:SecureTransport, require_ssl) Day 2
▼ ② IAM: can it call this API? (athena, glue, lakeformation:GetDataAccess) Day 1
▼ ③ Lake Formation: can it see this table? (SELECT, LF-Tags) Day 1
▼ ④ KMS: can it decrypt? (key policy, kms:Decrypt) Day 2
▼ ⑤ What is returned? (data filters, masking, tokens) Day 1, 3
▼ ⑥ Record: who read what? (CloudTrail data events) Day 4
Result
| Observed behavior | Blocked checkpoint | What to check |
|---|---|---|
| IAM policies allow everything but the table query fails with insufficient permissions | ③ | Lake Formation SELECT and DESCRIBE, whether a data filter was granted |
| Lake Formation permissions exist too but it fails | ② | lakeformation:GetDataAccess |
| Permissions were narrowed but the user sees everything | ③ is turned off | Super for IAMAllowedPrincipals, direct S3 permissions |
| Metadata is visible but it fails the moment data is read | ④ | kms:Decrypt in the key policy, whether it is a customer managed key |
| Works within the same account but fails only cross-account | One of ②, ③, ④ in one account | Policies in both accounts, RAM invitation, resource link, key policy |
| A security finding that access works over HTTP | ① | The aws:SecureTransport deny in the bucket policy |
| An analyst sees the original card numbers | ⑤ | The attachment target and priority of the filter or masking policy |
| There is no record of who read it | ⑥ | Data events, the Redshift user activity log |
Four means of "keeping sensitive data from being seen"
| Means | When it acts | Stored value | What the user sees | Suitable requirement |
|---|---|---|---|---|
| ETL tokenization/hashing (Glue) | Before writing | Changed | Token or hash | We do not want to keep the original in the lake |
| Lake Formation data filter | At read time | Unchanged | The relevant columns and rows are absent | Different visible scope per role (data lake) |
| Redshift dynamic data masking | At query time | Unchanged | Masked value | Show the same table differently per role (warehouse) |
| Macie | Investigates after storage | Unchanged | (Detection results only) | We do not know where it is |
S3 encryption: who holds the key
| Method | Key owner | Auditing / control | Representative clue |
|---|---|---|---|
| SSE-S3 | S3 | None | The default, no extra configuration needed |
| SSE-KMS | KMS key | Key policy + CloudTrail | Auditing key use, cross-account |
| DSSE-KMS | KMS key (dual) | Same | A regulation requiring two layers of encryption |
| SSE-C | The customer provides it with each request | AWS does not store the key | Do not entrust the key to AWS, but S3 does the encryption |
| Client-side | The customer | AWS gets only ciphertext | AWS must never see the plaintext |
Sharing: what the other party gets their hands on
| Method | What the other party gets | Original rows exposed |
|---|---|---|
| Data Exchange | A dataset (a file copy or in-place access rights) | Exposed |
| Redshift datashare | Live table access | Exposed |
| Lake Formation cross-account sharing | Catalog tables (within the filter scope) | Exposed within the scope |
| S3 bucket policy sharing | The entire object | Exposed |
| Clean Rooms | The results of an agreed analysis | Not exposed |
Audit logs
| Question | Log |
|---|---|
| Who changed a policy, key, or table | CloudTrail management events |
| Who read this object | CloudTrail data events |
| Requests that failed authentication, objects deleted by a lifecycle rule | S3 server access logs |
| Who ran which SQL in Redshift | Redshift audit logs (user activity log) |
| Where sensitive data is | Macie findings (detection results, not an audit log) |
| Service | Access control | Encryption at rest | Encryption in transit | Auditing |
|---|---|---|---|---|
| S3 | Bucket policy, IAM | Bucket default encryption (SSE-S3, SSE-KMS), Bucket Key | aws:SecureTransport | Data events, server access logs |
| Glue Data Catalog | Lake Formation permissions, LF-Tags | Catalog encryption setting | TLS | CloudTrail |
| Glue ETL | Job role (IAM) | Security configuration (S3, logs, bookmarks) | TLS | CloudWatch Logs, CloudTrail |
| Athena | IAM + Lake Formation | Workgroup result encryption | TLS | CloudTrail, query history |
| Redshift | GRANT, roles, dynamic masking | Cluster encryption (applied by default) | require_ssl | Audit logging, CloudTrail |
| Kinesis | IAM | Server-side encryption of the stream (KMS) | TLS | CloudTrail |
| Area | Item | Value |
|---|---|---|
| IAM | Evaluation order | Explicit Deny > explicit Allow > implicit deny |
| IAM | Cross-account | Both accounts must allow for it to pass |
| Lake Formation | Initial state | Super for IAMAllowedPrincipals, controlled by IAM only |
| Lake Formation | Permissions granted with a data filter | SELECT only |
| Lake Formation | Cross-account | Uses RAM. Immediate within the same organization, invitation acceptance outside it |
| KMS | Automatic rotation | Optional for customer managed (default period 365 days), yearly for AWS managed |
| KMS | Deletion waiting period | 7 to 30 days, 30 by default |
| S3 | Default encryption | SSE-S3 on all new objects since January 5, 2023 |
| S3 | SSE-C | Blocked by default on new buckets since April 2026 |
| S3 Bucket Key | Effect | Up to 99% reduction in KMS request cost, DSSE-KMS not supported |
| Redshift | Encryption | Applied by default. If you disable the key, it can be deleted after 14 days |
| Macie | Finding retention | 90 days |
| Macie | Custom identifier | Regex 512 characters, 50 keywords, maximum match distance default 50 (1 to 300) |
| Redshift DDM | Default priority | 0. The higher one applies |
| Schema Registry | Recommended compatibility | BACKWARD |
| CloudTrail | Default recording | Management events only. You turn on data events yourself |
Requirements: Load payment data into a data lake, detect and protect PII, show analysts only masked data, collaborate with partners without exposing originals, audit all access, and respond to GDPR deletion.
[Payment source] --Glue ETL (KMS encryption, tokenization)--> s3://lake-clean/payments/ (Iceberg)
--Macie scan--> [PII finding] --EventBridge--> [Lambda: restrict access/notify]
--Lake Formation (data filters, LF-Tags)--> [Analysts: view without PII]
--Clean Rooms--> [Partners: agreed aggregates only]
All activity --> CloudTrail (data events) --> audit account bucket| Decision | Choice | Why this choice is required |
|---|---|---|
| Encryption at rest | SSE-KMS (customer managed key) + Bucket Key | Key usage auditing and control are needed, and KMS cost must be reduced for the ETL's bulk reads |
| Transport | Enforce TLS through the bucket policy | It is a layer separate from encryption at rest |
| Card numbers | Tokenize in ETL | Keep joins but do not keep the originals in the lake |
| Detection | Macie automated discovery + discovery jobs for sensitive buckets | Finds PII that slipped past tokenization (free-text fields) |
| Access control | LF-Tags + data filters | Permissions apply automatically even as tables grow, and only the region's rows are visible |
| Partner collaboration | Clean Rooms | Neither side may see the other's original rows |
| Auditing | CloudTrail data events on sensitive buckets | Proves object-level access |
| Deletion | Iceberg row-level DELETE + snapshot cleanup | Remove only one customer's rows and leave nothing in past snapshots either |
-- GDPR deletion (Iceberg on Athena): logical delete, then clean up snapshots too
DELETE FROM lake_clean.payments WHERE customer_id = 'GDPR-REQ-2026-042';
VACUUM lake_clean.payments;{
"Name": "analyst_payments_filter",
"ColumnNames": ["txn_id", "region", "amount_token", "dt"],
"RowFilter": { "FilterExpression": "region = 'ap-northeast-2'" }
}| Request | Processing order |
|---|---|
| "Show the sales data to a new analyst" | Check lakeformation:GetDataAccess on the role → grant the LF-Tag expression that fits the role (do not add individual table GRANTs) → if PII is not needed, use a filtered permission → do not give direct S3 permissions |
| "Delete all of this customer's data" | Locate copies with lineage → DELETE in each Iceberg table → expire snapshots and VACUUM → handle S3 previous versions, the raw zone, backups, and warehouse copies → keep a record of the handling |
| "Produce who read this bucket last month" | Check whether data events were on during that period → query the logs the trail accumulated with Athena → for a role session, trace back through the AssumeRole event to identify the person. If it was not turned on, there is no way to create it retroactively |
💡 Related theory: Security and governance are not a single control but defense in depth. Encryption (confidentiality) + access control (authorization) + detection (visibility) + auditing (accountability) must work together to meet regulatory and trust requirements. Because one is strong, you cannot omit another.
IAMAllowedPrincipals remains, data is readable through IAM alone.s3:GetObject, the raw file opens.enable_user_activity_logging is separate.| Clue in the question | Correct answer |
|---|---|
| "Card numbers as tokens, only your own region's rows, applied automatically to new tables" | LF-Tags + data filter + ETL tokenization |
| "Prove which role read a specific object" | CloudTrail data events |
| "Originals not exposed to partners, PII excluded for internal analysts" | Clean Rooms + Lake Formation data filter |
| "KMS throttling and cost spike + block plaintext HTTP" | S3 Bucket Key + aws:SecureTransport deny |
| "Is a single control enough" | No. Encryption, access control, detection, and auditing together |
| "IAM allows but the query fails" | Lake Formation permission |
| "Another account cannot read an encrypted table" | KMS key policy (customer managed key) |
| "Even AWS must not see the plaintext" | Client-side encryption |
Next week is the last week. We start with an integrated review of Domains 1 and 2 (ingestion and transformation, and store management).
Click a choice to reveal the answer and explanation.
Question 1
On a payment data platform, you want analysts to see card numbers as tokens, expose only the rows for their own region, and have permissions applied automatically even when new tables are added. Which combination is the most appropriate?
Question 2
A security team must prove "which IAM role read a specific object in the payment bucket last month." What setup is required?
Question 3
You must jointly analyze campaign effectiveness with an external partner without exposing either company's raw customer data. At the same time, you provide in-house analysts with data excluding PII. Which combination of services is correct?
Question 4
An ETL job reading a large number of objects from a payment bucket encrypted with SSE-KMS is suffering KMS throttling and a cost spike. Plaintext HTTP access must also be blocked at the same time. Which combination of actions is the most appropriate?
Question 5
Which option most accurately describes "defense in depth" in data security and governance?