KMS 加密與 Secrets Manager 是處理敏感資料的任何生產級資料流水線的基石。在 DEA-C01 考試中,領域 4 任務 4.3 和 4.4 大約在每六個情境中就有一題會測試考生是否知道如何執行靜態加密、傳輸中加密、管理憑證,以及如何避開典型的 KMS 金鑰政策陷阱。考試的考點很少是「是否要加密」,而是關於如何在 SSE-S3、SSE-KMS 與 DSSE-KMS 之間做選擇、如何正確配置允許 Glue 和 Redshift 服務委託人的 KMS 金鑰政策、何時為流水線憑證選擇 Secrets Manager 或 Parameter Store,以及如何避免因跳過 S3 儲存桶金鑰 (S3 Bucket Keys) 而導致的高額 KMS API 帳單。
本指南從資料工程師 / MLOps 的角度涵蓋 KMS 加密與 Secrets Manager — 介紹存在的 KMS 金鑰類型及其計費方式、S3 伺服器端加密選項及其權衡、Redshift 叢集加密、用於 ETL 工作構件的 Glue 安全組態、Kinesis Data Streams 加密、Redshift 連接上的 TLS 強制執行、Secrets Manager 與 Parameter Store 的對比、用於 RDS 和 Redshift 的自動輪換 Lambda、跨服務存取的 KMS 金鑰政策模式,以及圍繞儲存桶金鑰成本優化、預設加密驚喜和輪換 Lambda 機制設定的典型考試陷阱。
靜態加密 vs 傳輸中加密 — 兩個獨立的控制項
在討論 KMS 之前,請先區分這兩個加密關注點。
靜態加密 (Encryption At Rest)
指存儲在磁碟上的資料,如 S3、EBS、RDS、Redshift 中的資料,以及 Kinesis 串流負載、DynamoDB 資料表和 Glue ETL 工作臨時存儲。靜態加密是為了防止物理磁碟被盜或底層存儲層被讀取。AWS 存儲服務支持通過服務管理金鑰或客戶管理 KMS 金鑰進行靜態加密。
傳輸中加密 (Encryption In Transit)
指在網路上流動的資料 — 如用戶端到 S3、ETL 工作到 Redshift、Kinesis 生產者到串流。傳輸中加密是為了防止網路攔截。AWS 端點預設支持 TLS;資料工程師的職責是強制執行僅限 TLS 的連接、配置 VPC 端點,並在儲存桶政策或叢集參數群組層級拒絕 HTTP 請求。
為什麼 DEA-C01 測試這兩者
考試會設定候選人啟用了靜態加密但資料仍然洩露的情境,原因是連接未加密。對於敏感資料,這兩個控制項都是必需的;單獨一個都不足以保證安全。
AWS KMS 金鑰類型與階層
KMS 是 AWS 上加密金鑰的中心服務。DEA-C01 考試預期考生能熟練掌握金鑰類型和信封加密模式。
AWS 託管金鑰 (AWS-Managed Keys)
AWS 託管金鑰(前稱「AWS 託管 CMK」)是 AWS 代表您建立和管理的 KMS 金鑰 — 如 aws/s3、aws/redshift、aws/glue、aws/secretsmanager。您不能按自己的排程輪換它們,不能編輯其金鑰政策,也不能刪除它們。可以免費使用;金鑰使用僅產生每 API 調用的成本。
客戶管理金鑰 (CMK)
客戶管理金鑰 (Customer-Managed Keys) 是您建立、控制和管理的 KMS 金鑰。您可以選擇金鑰政策(誰可以使用它)、啟用年度輪換、設定跨帳戶存取,並在 7-30 天的等待期後刪除。CMK 每個金鑰每月花費 1 美元,外加每 API 調用的成本。DEA-C01 陷阱:在生產環境中預設使用 AWS 託管金鑰的考生會忽略一點,即跨帳戶存取、自定義金鑰政策和稽核級別的輪換控制都需要 CMK。
AWS 擁有的金鑰 (AWS-Owned Keys)
AWS 擁有的金鑰由 AWS 服務用於內部加密 — 對您不可見,無成本且無控制權。DynamoDB 預設使用 AWS 擁有的金鑰進行靜態加密,除非您顯式選擇使用 CMK 的 SSE-KMS。
對稱 vs 非對稱金鑰
KMS 支持對稱金鑰(AES-256,資料加密的預設值)和非對稱金鑰(用於數位簽名的 RSA、ECC)。資料工程工作負載幾乎總是使用對稱金鑰;非對稱金鑰用於 DEA-C01 極少測試的簽名場景。
多區域金鑰 (Multi-Region Keys)
多區域金鑰是存在於多個區域且具有相同金鑰內容的 KMS 金鑰,允許在一個區域解密在另一個區域加密的資料。使用案例:S3 SSE-KMS 資料的跨區域複寫、帶加密的 DynamoDB 全域資料表。考試可能會將此作為「帶加密資料的災難復原 (DR) 模式」的正確答案。
信封加密 (Envelope Encryption)
KMS 使用信封加密:資料使用資料加密金鑰 (DEK) 進行加密,DEK 由 KMS 金鑰加密,且加密後的 DEK 與資料存儲在一起。解密時,加密的 DEK 發送到 KMS 進行解密,然後明文 DEK 在本地解密資料。這種模式讓 KMS 能夠處理數十億位元組的資料,而每次約 64KB 的加密操作只需一次 API 調用,而不是按位元組計費。
KMS 使用信封加密 — 資料由資料加密金鑰 (DEK) 加密,而 DEK 則由 KMS 金鑰 (KEK) 加密。 DEK 隨資料傳輸;KEK 則永遠不會離開 KMS。解密時,服務將加密的 DEK 發送到 KMS,KMS 返回純文字 DEK,服務在本地解密資料。這種模式意味著 KMS API 調用次數隨不同的 DEK 數量而增長(大約每個檔案、每個串流批次、每個 S3 物件一次),而不是隨位元組數增長。這也是 KMS API 成本可能爆炸的原因:一個加密一百萬個小型 S3 物件的工作負載,每讀取一次就要支付一百萬次 KMS 調用。S3 儲存桶金鑰 (S3 Bucket Key) 功能通過在許多物件中重複使用一個 DEK 來大幅降低每個物件的 KMS 調用率。DEA-C01 考試將此作為「具有數百萬物件的儲存桶中 KMS 成本異常高」的解決方案 — 答案是啟用 S3 儲存桶金鑰。
S3 伺服器端加密 — 五個選項
S3 支持五種加密選項。DEA-C01 考試會測試每一個選擇。
SSE-S3 — S3 託管金鑰
S3 生成並管理加密金鑰。免費、簡單,無需 KMS 交互,無細粒度控制。自 2023 年 1 月起成為新儲存桶的預設值。正確答案適用於:出於合規性要求需要加密,但沒有跨帳戶或客戶管理金鑰需求時。
SSE-KMS — KMS 託管金鑰
S3 使用 KMS 金鑰(AWS 託管或客戶管理)加密資料。通過 CloudTrail 增加了金鑰存取日誌,支持通過 KMS 金鑰政策進行跨帳戶存取,支持金鑰輪換。每筆請求成本較高,因為除非啟用了儲存桶金鑰,否則每次 PUT 和 GET 都會調用 KMS。正確答案適用於:受監管資料、解密的稽核日誌需求或跨帳戶情境。
DSSE-KMS — 雙重伺服器端加密
DSSE-KMS 使用兩個獨立層級對資料進行兩次加密 — 專為 FedRAMP High 和其他需要分層加密控制的工作負載設計。延遲和成本較高。正確答案適用於:監管強制要求明確要求雙重加密時。
SSE-C — 客戶提供的金鑰
用戶端在每次 PUT 和 GET 時發送加密金鑰;AWS 使用它進行加密後將其捨棄。AWS 永遠不會存儲該金鑰,因此如果用戶端丟失金鑰,資料將無法復原。使用案例:必須將金鑰保留在 AWS 之外的工作負載。在 DEA-C01 中很少是正確答案;CSE-KMS 或 SSE-KMS 更典型。
CSE — 用戶端加密 (Client-Side Encryption)
用戶端在將資料發送到 S3 之前對其進行加密;S3 僅存儲加密後的內容。加密金鑰可以來自 KMS (CSE-KMS) 或由客戶提供 (CSE-C)。使用案例:要求在用戶端進行加密以保證端到端加密的工作負載。DEA-C01 考試將 CSE-KMS 作為「在傳輸前加密敏感資料」的正確答案。
預設儲存桶加密與儲存桶金鑰
S3 支持預設儲存桶加密 — 即使用戶端未指定,對儲存桶的每次 PUT 都會使用配置的選項進行加密。對於 SSE-KMS,請啟用 S3 儲存桶金鑰 (S3 Bucket Keys) 以便在每個儲存桶每天緩存一個 DEK,從而大幅減少針對每個物件的 KMS API 調用。儲存桶金鑰可將高流量儲存桶的 KMS 成本降低 99%。
Redshift 靜態加密
Redshift 加密是在建立叢集時配置的,之後無法輕易更改。
叢集層級加密
建立 Redshift 叢集時,選擇使用 KMS(AWS 託管或 CMK)或 HSM 進行加密。叢集會加密所有靜態資料 — 磁碟區塊、備份、自動快照。加密使用分層金鑰模型:叢集金鑰 → 資料庫金鑰 → 資料表金鑰 → 區塊金鑰。只有叢集金鑰位於 KMS 中;其餘由 Redshift 內部管理。
重新加密現有叢集
如果您更改現有叢集的加密設定,Redshift 會建立一個新叢集、複製資料並切換 DNS — 視叢集大小而定,這是一個耗時數小時到數天的操作。無法就地完成。DEA-C01 陷阱:建議「在現有叢集上啟用加密」而未意識到停機成本的情境題。
快照加密
手動和自動快照繼承叢集加密。跨區域快照複寫在目標區域使用單獨的 KMS 金鑰 — 對於帶加密的跨區域 DR,請設定目標 KMS 金鑰並使用該金鑰配置快照複寫。
Spectrum 與外部資料表
Redshift Spectrum 讀取 S3 資料;底層的 S3 加密 (SSE-KMS, SSE-S3) 決定了掃描時的解密。Spectrum 角色需要對資料金鑰具備 kms:Decrypt 權限。
Redshift Serverless
Redshift Serverless 預設使用加密(無法停用)。您可以選擇 AWS 託管金鑰或 CMK。金鑰輪換行為與佈建模式相同。
Glue 安全組態 (Security Configurations)
Glue 安全組態是一組可重複使用的加密設定,套用於 Glue ETL 工作。
加密內容
一個安全組態涵蓋三項內容:S3 輸出(加密 Glue 寫入 S3 目標的資料)、CloudWatch 日誌(加密工作的日誌群組)以及工作書籤(加密 Glue 存儲的書籤狀態)。每項都可以配置為 SSE-S3、SSE-KMS 或停用。
為什麼它很重要
如果沒有安全組態,寫入精選 S3 區域的 Glue ETL 工作可能會寫入未加密的物件(或預設使用 SSE-S3),且 CloudWatch 日誌群組可能會存儲包含敏感資料的未加密日誌。安全組態可在工作輸出中強制執行一致的加密。
附加到工作
建立 Glue ETL 工作時,選擇一個安全組態。工作會將該組態套用於所有輸出,而無需逐條語句設定加密參數。DEA-C01 考試將此作為「Glue ETL 寫入必須使用客戶管理金鑰加密」的正確答案。
所需的 KMS 權限
Glue 工作的 IAM 角色必須對 KMS 金鑰具備 kms:Encrypt、kms:Decrypt、kms:GenerateDataKey 權限。KMS 金鑰政策也必須授予該角色存取權 — 信任關係的兩個方向都是必需的。
Kinesis Data Streams 加密
Kinesis Data Streams 支持使用 KMS 的伺服器端加密,以加密串流中的靜態負載。
運作方式
寫入串流的每條記錄都使用衍生自配置 KMS 金鑰的資料金鑰進行加密。取用者在讀取時,如果具備對金鑰的 kms:Decrypt 權限,會自動解密記錄。加密對生產者和取用者程式碼是透明的;僅需要對 KMS 金鑰的 IAM 權限。
預設與客戶管理金鑰
串流支持免費的 AWS 託管金鑰 (aws/kinesis),或用於跨帳戶或稽核級場景的客戶管理金鑰。DEA-C01 考試在情境題出現「可稽核的金鑰存取」或「跨帳戶串流共享」時,CMK 是正確答案。
成本
Kinesis 串流上的伺服器端加密會增加少量每分片小時的成本以及 KMS API 調用成本。對於高吞吐量串流,請考慮資料敏感度是否值得;對於不敏感的彙總指標,普通串流可能就足夠了。
傳輸中加密 — TLS 強制執行
每個 AWS 端點預設都支持 TLS;工程師的職責是強制執行僅限 TLS。
用於僅限 TLS 的 S3 儲存桶政策
在儲存桶政策中添加一個帶有 aws:SecureTransport=false 條件的 Deny 語句。這會拒絕任何純 HTTP 請求並強制執行 TLS:
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": ["arn:aws:s3:::bucket/*", "arn:aws:s3:::bucket"],
"Condition": {"Bool": {"aws:SecureTransport": "false"}}
}
DEA-C01 考試將僅限 TLS 的 S3 作為領域 4 的核心考點。
Redshift TLS 強制執行
將叢集參數群組中的 require_ssl 參數設定為 true。不帶 SSL 的連接將被拒絕。JDBC 和 ODBC 用戶端必須指定 ssl=true 並信任 Redshift CA 組合。
用於私有連線的 VPC 端點
VPC 端點(S3 和 DynamoDB 使用閘道端點;其他所有服務使用介面端點)將流量保留在 AWS 骨幹網路上,永遠不經過公共網際網路。結合 TLS,這是敏感資料工程流水線的分層防禦模式。
Glue 與 Redshift VPC 配置
Glue ETL 工作和 Redshift 叢集可以配置 VPC 連接,通過 VPC 端點進行路由,保持資料流的私密性。DEA-C01 考試將此作為「ETL 工作不得經過公共網際網路」的正確答案。
AWS Secrets Manager — 憑證與輪換
Secrets Manager 存儲並輪換資料流水線使用的資料庫憑證、API 金鑰和連接字串。
存儲內容
資料庫憑證(使用者名稱 + 密碼)、API 金鑰、OAuth 權杖、最高 64 KB 的任意 JSON 或文字機密。秘密使用 KMS(AWS 託管或 CMK)進行靜態加密,並通過 API 進行存取。
自動輪換
核心功能:Secrets Manager 可以通過調用 Lambda 函數按排程(例如每 30 天)輪換憑證。AWS 為 RDS MySQL、RDS PostgreSQL、Aurora、Redshift、DocumentDB 提供了預建的輪換 Lambda。對於其他秘密,您需要編寫自定義 Lambda。輪換 Lambda 是該功能的靈魂 — 沒有它,Secrets Manager 就只是一個更高級的 Parameter Store。
RDS 輪換運作方式
輪換 Lambda 建立新密碼、更新資料庫以接受新密碼、將秘密更新為新值並測試新憑證。四步模式(createSecret, setSecret, testSecret, finishSecret)防止應用程式在輪換期間看到損壞的憑證。
跨帳戶存取
如果秘密上的資源政策和 KMS 金鑰政策都允許,帳戶 A 中的秘密可以被帳戶 B 中的角色存取。DEA-C01 考試將此用於集中式憑證管理情境。
成本
Secrets Manager 每個秘密每月收費 0.40 美元,外加每 10,000 次 API 調用 0.05 美元。雖然比 Parameter Store 高,但對於生產資料庫憑證來說,輪換功能物有所值。
AWS Secrets Manager 自動輪換需要 Lambda 函數 — 對於 RDS MySQL/PostgreSQL/Aurora/Redshift/DocumentDB,AWS 提供預建的輪換 Lambda;對於其他秘密,您必須自行編寫 Lambda。 Lambda 遵循四步模式(createSecret, setSecret, testSecret, finishSecret),該模式建立新憑證、將其套用於目標系統、測試連線並將其提升為當前版本。如果沒有配置輪換 Lambda,Secrets Manager 僅存儲秘密而不自動輪換。DEA-C01 考試將此作為多步驗證考點:「團隊需要為 ETL 流水線使用的 RDS 資料庫實現密碼自動輪換」 — 答案是使用 AWS 提供的 RDS 輪換 Lambda 的 Secrets Manager,而不是 Parameter Store,也不是自定義輪換腳本。對於非 AWS 託管的機密(如第三方 API 金鑰),團隊應編寫遵循相同四步協定的自定義 Lambda。
Secrets Manager vs Systems Manager Parameter Store
這兩個服務看起來很像;DEA-C01 考試會測試何時使用哪一個。
Secrets Manager
成本:每個秘密每月 0.40 美元 + API 調用。自動輪換:支持,通過 Lambda。跨區域複寫:支持。設計用途:資料庫憑證、需要輪換的 API 金鑰、跨帳戶秘密共享。加密:始終使用 KMS。
Parameter Store (Standard)
成本:標準參數免費。自動輪換:不支持。跨區域複寫:手動。設計用途:組態值、不需要輪換的秘密、應用程式組態。加密:通過 SecureString 選用 KMS。
Parameter Store (Advanced)
成本:每個參數每月 0.05 美元。具有更高的限制(8KB 值,每個帳戶 10 萬個參數)、參數政策(到期、無更改通知)。仍無原生輪換功能。
決策規則
如果秘密需要輪換,選 Secrets Manager。如果秘密是靜態組態或不需要輪換的值,選帶有 SecureString 的 Parameter Store。如果工作負載在規模上有成千上萬個參數,Parameter Store 在成本上勝出。DEA-C01 考試將此作為成本與功能的權衡 — 對於生產資料庫憑證,正確答案始終是 Secrets Manager。
KMS 金鑰政策 — 跨服務陷阱
KMS 金鑰政策控制誰可以使用該金鑰。配置錯誤的政策會導致整個資料流水線發生無聲失敗。
金鑰政策結構
KMS 金鑰政策是附加到金鑰上的 JSON 文件(類似於 S3 儲存桶政策)。它控制哪些委託人可以執行金鑰操作 — kms:Encrypt、kms:Decrypt、kms:GenerateDataKey。如果沒有金鑰政策的授予,即使是授予 KMS 存取權的 IAM 身分政策也無效 — 除非 kms:ViaService 允許,否則 KMS 金鑰需要顯式的金鑰政策權限。
金鑰政策中的服務委託人
要讓 Glue、S3、Redshift 或 Kinesis 代表使用者使用金鑰,金鑰政策必須授予服務委託人存取權 — glue.amazonaws.com、s3.amazonaws.com、redshift.amazonaws.com。DEA-C01 陷阱:Glue ETL 工作無法寫入 SSE-KMS 儲存桶,因為儲存桶的 KMS 金鑰政策未授予 Glue 服務委託人 kms:Decrypt 和 kms:GenerateDataKey 權限。
跨帳戶金鑰存取
與另一個帳戶共享 KMS 金鑰需要:(1) 生產者帳戶的金鑰政策授予取用者帳戶委託人,且 (2) 取用者帳戶的 IAM 身分政策也授予相同的權限。兩者都必須允許。
預設金鑰政策
當您通過主控台建立 CMK 時,預設金鑰政策會授予 AWS 帳戶根使用者存取權,並委派給 IAM 身分政策。這意味著帳戶中任何具有 kms:Decrypt 權限的 IAM 委託人都可以使用該金鑰。為了更嚴格的控制,請編寫顯式列出允許委託人的自定義金鑰政策。
KMS 客戶管理金鑰需要為服務委託人 (glue.amazonaws.com, redshift.amazonaws.com, s3.amazonaws.com) 提供顯式的金鑰政策權限 — 僅在 IAM 角色政策中授予 kms:Decrypt 是不足夠的。 DEA-C01 考試將此作為跨服務權限情境題: 「Glue ETL 工作擁有帶有 kms:Decrypt 的 IAM 角色,但寫入 SSE-KMS 儲存桶失敗。」 正確答案是將 Glue 服務委託人添加到 KMS 金鑰政策中,而不是擴大 IAM 角色權限。同樣的陷阱也適用於 Redshift 從 SSE-KMS S3 執行 COPY、Athena 查詢 SSE-KMS 資料以及 Firehose 寫入 SSE-KMS S3 目的地。KMS 金鑰政策獨立於 IAM 身分政策;兩者都必須允許。在疑難排解「加密存取被拒」錯誤時,務必先檢查 KMS 金鑰政策 — 它是最常見的元兇。
白話文解釋 KMS 加密與 Secrets Manager
三個具體的類比可以讓加密故事變得直觀。
類比 1 — 銀行金庫與主金鑰及每日密碼
KMS 就像銀行存放所有主金鑰 (KMS keys) 的主金庫 — 主金鑰永遠不會離開金庫,但它們可以印製出櫃員用來鎖定單個保險箱的每日密碼(資料加密金鑰 / DEK)。信封加密正是這種模式:資料由每日密碼鎖定,每日密碼由主金鑰鎖定,要解鎖資料時,您將加密的每日密碼帶到金庫,金庫對其進行解密,然後您在本地使用明文密碼。AWS 託管金鑰是銀行為您選擇的主金鑰 — 方便但您無法檢查它們。客戶管理金鑰是您委託製作的主金鑰 — 您控制存取、設定輪換,並在等待期後刪除。S3 儲存桶金鑰就像是櫃員將一千個箱子歸於同一個每日密碼下,而不是為每個箱子印製新的密碼,從而大幅減少前往主金庫的次數(和帳單)。Secrets Manager 是銀行的自動密碼更換器 — 每 30 天會有一個機器人為您的資料庫生成新密碼、更新資料庫以接受它、測試新密碼並輪換秘密值,所有這些都無需您干預。Parameter Store 則是銀行用於存放文件和組態等不需要輪換項目的通用保管箱。
類比 2 — 帶有防篡改信封和保險箱金鑰的郵政系統
KMS 金鑰就像郵政設施裡的保險箱金鑰。每封敏感郵件都密封在一個防篡改信封中,由每日鎖與金鑰組合(資料金鑰)鎖定;而每日金鑰本身被鎖在主金鑰櫃(KMS key)中。當郵件抵達目的地時,收件人將鎖定的信封帶到郵局,主金鑰櫃解開每日金鑰組合,每日金鑰解開信封,收件人閱讀內容。SSE-S3 是郵政服務透明地處理整個鎖與金鑰方案,包括主金鑰 — 方便且免費,但您無法稽核誰解開了什麼。SSE-KMS 是郵政服務處理每日金鑰,但您控制主金鑰櫃 — 每次解鎖都會被稽核,您可以撤銷存取權,也可以刪除主金鑰(經過等待期),這將永久銷毀所有加密郵件。SSE-C 是您在每筆交易中自備每日金鑰,如果丟失,郵件將永久丟失。CSE 是您在交給郵局之前自己鎖上信封。Secrets Manager 是郵政設施的租戶金鑰系統 — 每 30 天設施會自動為您的郵箱生成新租戶金鑰、分發它們並使舊金鑰失效。
類比 3 — 帶有腕帶、置物櫃金鑰和每日重置的主題樂園
KMS 金鑰就像主題樂園的主置物櫃金鑰。您租用一個置物櫃(S3 物件),樂園給您一個可以打開置物櫃的每日腕帶 (DEK),而腕帶本身由樂園的主金鑰環 (KMS key) 編碼。許多租約可以共用一個腕帶 (S3 Bucket Key),以減少門口主金鑰環的身分驗證頻率。AWS 託管金鑰是樂園的標準主金鑰環;客戶管理金鑰是公司委託製作的帶有自定義品牌和稽核日誌的公司金鑰環。DSSE-KMS 是高安全性區域,置物櫃由兩個獨立的金鑰環系統雙重鎖定,以符合 FedRAMP 級別的合規性。Redshift 叢集加密是樂園的置物櫃階層 — 您的個人置物櫃金鑰由區域金鑰鎖定,區域金鑰由行金鑰鎖定,行金鑰由主金鑰環鎖定,所有這些都在樂園的鎖定基礎設施內部管理,只有主金鑰環暴露給 KMS。Secrets Manager 是每日腕帶刷新系統 — 每天早上機器人為您的團隊生成新腕帶,樂園的閘機讀取器接受新腕帶,舊腕帶失效,所有這些都無需您前往櫃檯。Parameter Store 則是基本的訊息看板,您可以在上面發布非機密通知,如「中午開會」 — 免費且易於存取但不提供輪換。
KMS 與 Secrets Manager 的常見考試陷阱
請務必記住這五個陷阱。
陷阱 1 — 未使用儲存桶金鑰導致的 KMS API 成本爆炸
情境描述了一個高流量的 SSE-KMS 儲存桶,KMS 帳單異常高。錯誤答案:切換到 SSE-S3(這會丟失 KMS 稽核日誌)。正確答案:啟用 S3 儲存桶金鑰,以便每個儲存桶每天重複使用一個 DEK,從而減少 99% 的 KMS 調用。
陷阱 2 — IAM 角色政策有權限但 KMS 金鑰政策未授權
情境描述一個 Glue ETL 工作在其角色中具備 kms:Decrypt 權限,但無法讀取 SSE-KMS 資料。錯誤答案:擴大角色政策。正確答案:將 Glue 服務委託人(或角色 ARN)添加到 KMS 金鑰政策中。
陷阱 3 — 使用 Parameter Store 輪換資料庫憑證
情境描述 RDS 資料庫憑證需要每 30 天輪換一次。錯誤答案:使用 Parameter Store 的 SecureString。正確答案:使用帶有 AWS 提供之 RDS 輪換 Lambda 的 Secrets Manager。
陷阱 4 — 新儲存桶上的預設加密
情境描述儲存桶中出現未加密的物件。自 2023 年 1 月起,S3 為新儲存桶預設使用 SSE-S3 — 但較舊的儲存桶可能沒有預設加密。正確答案:顯式將預設儲存桶加密配置為使用 CMK 的 SSE-KMS。
陷阱 5 — Redshift 叢集的就地重新加密
情境要求「在一夜之間為現有的 Redshift 叢集啟用加密」。錯誤答案:就地更改加密設定。正確答案:Redshift 建立新叢集、複製資料並切換 DNS — 視規模而定,這是一個耗時數小時到數天的操作,對於大型叢集來說不可能在一夜之間完成。
關鍵數據與必背事實
KMS
- 客戶管理金鑰每月 1 美元
- 每 10,000 次 KMS API 調用 0.03 美元
- 每次加密操作最高 64KB 明文
- 年度自動輪換(僅限 CMK)
- 7-30 天刪除等待期
- 對稱 (AES-256) 與非對稱 (RSA, ECC) 金鑰類型
S3 加密
- SSE-S3:免費,S3 託管,2023 年 1 月起的預設值
- SSE-KMS:產生 API 調用成本,具備稽核日誌,支持跨帳戶
- DSSE-KMS:為 FedRAMP High 提供的雙重加密
- SSE-C:客戶提供金鑰,AWS 不存儲
- CSE-KMS / CSE-C:用戶端加密,S3 僅存儲密文
- S3 儲存桶金鑰:減少 99% 的 KMS API 調用
Redshift 加密
- 建立時進行叢集級 KMS 加密
- 重新加密需要重建叢集
- 快照繼承叢集加密
- 跨區域快照複寫需要單獨的目標金鑰
- Serverless:預設加密,無法停用
Secrets Manager
- 每個秘密每月 0.40 美元 + 每 1 萬次 API 調用 0.05 美元
- 秘密最大大小 64KB
- AWS 提供的輪換 Lambda:RDS MySQL/PostgreSQL/Aurora/Redshift/DocumentDB
- 非 AWS 託管機密需自定義 Lambda
- 四步輪換:createSecret, setSecret, testSecret, finishSecret
Parameter Store
- Standard:免費,4KB 值,無輪換
- Advanced:每個參數每月 0.05 美元,8KB 值,具備參數政策
- SecureString:經 KMS 加密的參數值
在使用 SSE-KMS 時,務必啟用 S3 儲存桶金鑰 (S3 Bucket Keys),以在高流量儲存桶上減少高達 99% 的 KMS API 成本。 如果不使用儲存桶金鑰,對 S3 物件的每次 PUT 和 GET 都需要一次 KMS API 調用來加密或解密資料金鑰,每次 10,000 次調用成本為 0.03 美元並增加延遲。使用儲存桶金鑰後,S3 每個儲存桶每天生成一個 DEK,並在該期間內用於所有物件 — KMS 每天看到的調用次數從每個物件一次減少到每天一次。對於每月存取 1 億個物件的儲存桶,這意味著 300 美元的 KMS 成本與幾美分之間的差距。儲存桶金鑰是作為預設加密設定按儲存桶配置的;它們自動套用於新物件以及通過複製重新加密的現有物件。DEA-C01 考試將此作為「資料湖儲存桶中 KMS 成本異常高」的解決方案 — 只要儲存桶金鑰是可選項,就永遠不要選擇「切換到 SSE-S3」或「減少資料量」。
記住 KMS 存取要求:IAM 身分政策和 KMS 金鑰政策「兩者都必須」允許該操作 — 僅授予其中之一是不夠的。 即使 IAM 身分政策中具有 kms:Decrypt 權限的使用者或角色,如果 KMS 金鑰政策未授予該委託人存取權,也無法進行解密。反之,如果金鑰政策授予了存取權,但委託人的 IAM 政策拒絕了 KMS,同樣無法運作。CMK 上的預設金鑰政策會委派給 IAM 身分政策,這就是為什麼大多數設定「自然有效」的原因 — 但限制特定委託人的自定義金鑰政策可以覆蓋此行為。DEA-C01 考試會利用跨服務場景設定陷阱:「Glue 無法解密 SSE-KMS 物件」(金鑰政策缺失 Glue 服務委託人)、「Redshift 無法讀取 SSE-KMS 資料」(金鑰政策缺失 Redshift 角色)、「跨帳戶存取被拒」(金鑰政策缺失取用者帳戶)。疑難排解時務必同時檢查金鑰政策與身分政策。
DEA-C01 考試重點 — KMS 加密與 Secrets Manager。 此主題在 DEA-C01 考試中佔有很大權重。請掌握每項 AWS 服務所暴露的權衡取捨、決策邊界以及成本/性能觸發點 — 考試將測試那些依賴於知道哪個服務是錯誤答案而不僅僅是正確答案的情境。
常見問題 (FAQ) — KMS 加密與 Secrets Manager 熱門問題
Q1 — 我應該在什麼時候為 S3 儲存桶選擇 SSE-S3、SSE-KMS 或 DSSE-KMS?
當出於合規性需要加密但不需要 KMS 稽核日誌、跨帳戶存取或客戶管理金鑰控制時,請使用 SSE-S3 — 它是免費、簡單的,且現在是新儲存桶的預設值。當您需要 CloudTrail 中的解密日誌(受監管工作負載)、跨帳戶存取(資料共享模式)或用於金鑰輪換控制的客戶管理金鑰時,請使用 SSE-KMS。僅當監管命令明確要求雙層加密(FedRAMP High、某些醫療或金融工作負載)時才使用 DSSE-KMS。對於大規模的 SSE-KMS,務必啟用 S3 儲存桶金鑰以避免 KMS 成本爆炸。DEA-C01 考試將帶有儲存桶金鑰的 SSE-KMS 作為「具有稽核和成本控制的加密資料湖」的正確答案。
Q2 — 為什麼我的 Glue ETL 工作即使角色具備 kms:Decrypt 權限,也無法寫入 SSE-KMS 儲存桶?
因為 KMS 金鑰同時需要 IAM 身分政策和 KMS 金鑰政策的權限。Glue ETL 工作的 IAM 角色在其身分政策中具備 kms:Decrypt,這是必要的但不足夠。KMS 金鑰政策也必須授予存取權 — 可以通過明確列出角色 ARN,或者通過授予 Glue 服務委託人 (glue.amazonaws.com)。將角色 ARN(或服務委託人)添加到 KMS 金鑰政策中,作為允許執行 kms:Decrypt、kms:GenerateDataKey 和 kms:Encrypt 的委託人。同樣的陷阱也適用於存取 SSE-KMS 資料的 Redshift、Athena、EMR 和 Firehose。疑難排解跨服務 KMS 存取被拒錯誤時,務必先檢查金鑰政策。
Q3 — AWS 託管金鑰與客戶管理金鑰有什麼區別?
AWS 託管金鑰是 AWS 為了服務整合而建立和管理的 KMS 金鑰 — 如 aws/s3、aws/redshift、aws/glue。它們可以免費使用(僅需支付每 API 調用成本),由 AWS 自動輪換,且金鑰政策固定無法修改。客戶管理金鑰 (CMK) 是您自己建立的 KMS 金鑰,每個金鑰每月 1 美元,外加每 API 調用成本。您可以控制金鑰政策(誰可以使用它)、啟用年度輪換、配置跨帳戶存取,並在 7-30 天的等待期後刪除。對於服務整合足夠的簡單帳戶內加密,請使用 AWS 託管金鑰。當您需要跨帳戶存取、自定義金鑰政策、稽核級別的輪換控制或需要客戶控制金鑰的監管合規性時,請使用客戶管理金鑰。DEA-C01 考試將 CMK 作為跨帳戶場景和稽核要求的正確答案。
Q4 — 我應該在什麼時候使用 Secrets Manager 或是 Systems Manager Parameter Store?
對於需要自動輪換的憑證(如 RDS、Aurora、Redshift 資料庫密碼,以及具有定期輪換政策的第三方 API 金鑰),請使用 Secrets Manager。Secrets Manager 為主流資料庫提供了 AWS 託管的輪換 Lambda,並支持為其他秘密提供自定義 Lambda。對於靜態組態值、應用程式級組態以及使用 SecureString 加密即可滿足要求的非輪換秘密,請使用 Parameter Store。Parameter Store 標準參數是免費的,並支持 KMS 加密的 SecureString 值。決策點在於「輪換」:如果機密需要輪換,選 Secrets Manager;如果不需要,選 Parameter Store。對於具有數千個靜態參數的工作負載,Parameter Store 在成本上勝出;對於有輪換要求的生產資料庫憑證,儘管每個秘密成本較高,但 Secrets Manager 才是正確答案。
Q5 — Secrets Manager 對於 RDS 資料庫的自動輪換是如何運作的?
Secrets Manager 按排程(例如每 30 天)調用一個 Lambda 函數,遵循四步模式:createSecret 生成新密碼並將其存儲為秘密的 AWSPENDING 版本;setSecret 將新密碼套用於 RDS 資料庫(使用新密碼修改使用者);testSecret 通過嘗試連線來驗證新密碼是否有效;finishSecret 將 AWSPENDING 提升為 AWSCURRENT 並將舊版本降級為 AWSPREVIOUS。這四步模式確保應用程式在任何時候都能看到有效的憑證 — 即使在輪換中期,舊憑證和新憑證都會短暫有效。AWS 為 RDS MySQL/PostgreSQL/MariaDB/Oracle/SQL Server、Aurora MySQL/PostgreSQL、Redshift 和 DocumentDB 提供了預建的輪換 Lambda;您在建立秘密時選擇正確的範本即可。對於非 AWS 託管的機密,請編寫實現相同四個步驟的自定義 Lambda。
Q6 — 我該如何一致地加密 Glue ETL 工作的輸出和 CloudWatch 日誌?
建立一個 Glue 安全組態 (Glue Security Configuration),為三個組件指定 SSE-KMS(配合 CMK 或 AWS 託管金鑰):S3 輸出(工作寫入目標儲存桶的資料)、CloudWatch 日誌(工作的日誌群組)以及工作書籤(Glue 存儲的書籤狀態)。將該安全組態附加到處理敏感資料的每個 Glue ETL 工作和爬網程式。該組態在帳戶內的工作之間是可重複使用的,因此一個組態就可以控管整個資料工程團隊的加密立場。Glue 角色必須對金鑰具備 KMS 權限,且 KMS 金鑰政策必須授予 Glue 服務委託人存取權。DEA-C01 考試將此作為「Glue ETL 必須使用客戶管理金鑰加密所有構件」的正確答案。
Q7 — 我該如何對 S3 儲存桶強制執行僅限 TLS 的存取?
在儲存桶政策中添加一個帶有 aws:SecureTransport=false 條件的 Deny 語句。該語句會拒絕任何通過純 HTTP 抵達的 S3 請求,強制所有用戶端使用 HTTPS。政策如下:{"Effect":"Deny","Principal":"*","Action":"s3:*","Resource":["arn:aws:s3:::bucket/*","arn:aws:s3:::bucket"],"Condition":{"Bool":{"aws:SecureTransport":"false"}}}。將此套用於每個包含敏感資料的生產儲存桶。對於 Redshift,在叢集參數群組中設定 require_ssl=true;對於 RDS,在 DB 參數群組中配置 SSL/TLS。DEA-C01 考試將 TLS 強制執行作為領域 4 的核心考點 — 「確保傳輸中加密」的答案始終包括僅限 TLS 的 Deny 語句,外加用於私有網路路徑的 VPC 端點。
延伸閱讀 — AWS 官方文件
權威的 AWS 來源包括《AWS KMS 開發人員指南》(金鑰類型、金鑰政策、信封加密、多區域金鑰)、《S3 使用者指南》加密章節(SSE-S3, SSE-KMS, DSSE-KMS, 儲存桶金鑰)、《Redshift 叢集管理指南》加密章節、《Glue 開發人員指南》安全組態章節、《Secrets Manager 使用者指南》輪換章節、《Systems Manager Parameter Store》文件,以及關於加密模式的 AWS 大數據部落格系列。AWS 安全部落格發布了關於資料湖加密和金鑰輪換模式的案例研究,展示了現實世界的部署情況。Skill Builder 的 DEA-C01 考試準備標準課程中有專門針對領域 4 加密與憑證管理的模組。AWS Well-Architected 安全支柱文檔則介紹了更廣泛的加密與金鑰管理最佳實踐,這些內容經常以情境題的形式出現在 DEA-C01 中。