資料工程面試:如何保護 Parquet 中的敏感欄位?
題幹與適用場景
資料湖中的 Parquet 檔案同時包含信箱、支付識別碼、地區與可公開統計指標。物件儲存、metadata 服務與計算叢集由不同團隊管理;授權工作需要只讀取必要欄位,未授權讀者不能看到敏感值或可推斷身分的 metadata。請設計欄位級加密與金鑰管理方案,說明 footer、欄位索引、謂詞下推、金鑰輪換、舊讀者相容與故障復原。
Apache Parquet 的 Modular Encryption 把檔案拆成 page、page header、column index、offset index、Bloom filter 與 footer 等模組分別保護,仍可保留欄位投影、謂詞下推、編碼與壓縮能力。強回答要區分「加密資料」「保護 metadata」「控制金鑰存取」與「證明讀寫正確」四個邊界。
面試官考察點
- 能否解釋欄位金鑰、footer 金鑰、資料金鑰與主金鑰的關係。
- 是否知道只加密敏感欄位仍可能暴露 schema、統計資訊或可推斷身分的 metadata。
- 能否在 encrypted footer 與 plaintext footer 之間說明安全性、相容性與遷移成本。
- 是否理解 AES-GCM 的完整性與 AAD 防替換作用,以及 CTR page 模式的限制。
- 是否能把 KMS、授權、輪換、備份、查詢失敗與稽核串成可執行方案。
普通回答會說「用 AES-256 加密檔案」;強回答會證明哪些 Parquet 模組受保護、誰能取得哪把金鑰,以及舊讀者與謂詞下推分別付出什麼代價。
回答前需要釐清的問題
- 需要隱藏整個 schema、列數與統計資訊,還是只需保護欄位值?這決定是否必須加密 footer。
- 哪些工作、租戶與欄位可以共同存取?這決定欄位金鑰分組與 KMS 授權邊界。
- 查詢引擎與 PyArrow/Parquet 函式庫版本是否支援 Modular Encryption?否則讀寫鏈路不能直接切換。
- 舊讀者是否必須繼續讀取未加密欄位?這決定是否採用 plaintext footer 過渡模式。
- 檔案是不變分區還是會被覆蓋、複製與回放?這決定 AAD 檔案身分、輪換與重播偵測。
30 秒回答框架
「我先決定是否保護 footer 與統計資訊,再按敏感欄位劃分存取域。檔案資料使用隨機 DEK,DEK 由 KMS 管理的 MEK 或 KEK 封裝;欄位 page、page header、索引與必要的欄位 metadata 使用欄位金鑰,footer 個別保護。預設優先 AES-GCM,因為它同時提供機密性與完整性,並用綁定檔案與模組身分的 AAD 防止跨檔案替換。若舊讀者必須存取公開欄位,可以短期使用 plaintext footer,但要說明它會暴露部分 metadata;敏感資料與高風險 schema 則使用 encrypted footer。上線前驗證 KMS 授權、金鑰輪換、謂詞下推、錯誤復原、舊讀者行為與竄改測試。」
分步驟深入解答
1. 先列出需要保護的 Parquet 模組
Parquet 不是只有資料區的黑盒。page 與 page header 承載欄位值,column index、offset index 與 Bloom filter 可能透露範圍或值分布,footer 還包含 schema、列數、排序、統計與 key-value metadata。只加密欄位 page 而留下所有 metadata,仍可能洩漏客戶類型或時間範圍。
file
├── row-group
│ └── column chunk
│ ├── dictionary/data pages
│ ├── page headers
│ ├── column index
│ ├── offset index
│ └── bloom-filter modules
└── footer / FileMetaData先按威脅模型決定保護集合:低敏欄位可保持可讀以支援舊工具;敏感欄位及其統計、schema 與檔案身分需要更嚴格的 footer 與欄位 metadata 保護。這個決策比單獨選擇 AES 金鑰長度更重要。
2. 設計信封加密與存取邊界
每個檔案或欄位使用隨機資料加密金鑰(DEK),由主金鑰(MEK)或金鑰加密金鑰(KEK)封裝。MEK 保留在組織的 KMS,工作只透過短期身分取得解封權限;物件儲存只保存密文與必要的 key metadata,不保存明文主金鑰。
authorized job -> KMS policy -> unwrap DEK -> decrypt footer/columns
object storage -> ciphertext + key metadata only按租戶、資料域或敏感等級劃分欄位金鑰,避免一個工作取得整張表的解密權限。key metadata 可以是 KMS key ID、封裝材料識別碼或外部參照;它不是秘密本身,但會影響稽核與輪換。輪換主金鑰時優先重新封裝 DEK;不可變檔案不應因換 MEK 就重寫全部資料 page。
3. 在 encrypted footer 與 plaintext footer 之間選擇
encrypted footer 隱藏 schema、列數、欄名、排序資訊與更多欄位 metadata,安全邊界完整,但所有讀取敏感檔案的讀者都必須支援模組加密。Parquet 檔案會使用 PARE magic bytes,讓舊讀者立即知道不能按普通 PAR1 檔案解析。
plaintext footer 仍允許舊版本讀者看到部分 metadata 並讀取未加密欄位;敏感欄位的資料 page 不能被舊讀者讀取,footer 還會以簽名方式保護完整性。它適合有明確遷移期限的過渡,不適合連統計資訊也視為敏感的場景。
遷移計畫應按讀者矩陣逐一驗證:查詢引擎是否能發現加密欄位、未授權存取是否失敗、只讀公開欄位是否仍能下推謂詞,以及舊讀者是否會把例外誤判為檔案損壞。
4. 選擇演算法並綁定 AAD
AES-GCM 同時提供加密與認證標籤;AAD 可把資料表、分區、檔案版本與模組位置綁定到密文,阻止攻擊者把同一金鑰下的舊檔案、其他分區或其他 row group 模組替換進目前檔案。隨機 nonce 必須對同一金鑰保持唯一,金鑰呼叫次數也要有跨 writer 的預算。
Parquet 也定義 AESGCMCTRV1:非 page 模組使用 GCM,而資料 page 使用 CTR 以換取吞吐;CTR page 本身不提供 GCM 的認證完整性。因此安全要求包含 page 竄改偵測時應優先 AESGCM_V1,不能只比較 CPU 速度。
5. 保留查詢能力並定義失敗路徑
加密發生在壓縮後的 page 與其他模組上,格式仍可表達欄位投影、謂詞下推、編碼與壓縮。查詢規劃器可以先讀取可見 footer 或索引,再只請求有權限的欄位;但如果 footer 或 column index 被加密,規劃器必須具備相應解密權限,不能假設「只查公開欄位」就完全不需要金鑰。
解密失敗、KMS 逾時、權限撤銷、AAD 不相符與認證標籤錯誤必須分別記錄。錯誤處理不能自動改用明文路徑,也不能把所有失敗都歸為檔案損壞。讀取服務應保留檔案 ID、key metadata、演算法版本與稽核主體,但不記錄 DEK、明文欄位值或完整金鑰材料。
6. 驗證輪換、竄改與災備
測試至少包括:未授權讀敏感欄位、授權讀公開欄位、授權讀敏感欄位、替換舊檔案、交換兩個 row group、修改密文 page、KMS 拒絕、金鑰輪換後回讀與跨區域災備。對每個測試記錄預期錯誤類型、是否讀到明文與稽核事件。
資料復原要同時備份加密檔案、key metadata、KMS 金鑰版本對映與 AAD 檔案身分。只復原物件儲存而沒有 KMS 權限會得到不可讀檔案;只復原 KMS 而遺失 AAD 前綴也可能無法驗證檔案身分。輪換工作要有舊金鑰保留窗口,等所有快照、回放與備份驗證完成後再銷毀。
高品質示範回答
「我會先釐清威脅模型:是否隱藏 schema、列數與統計,以及哪些工作可以存取哪些欄位。Parquet Modular Encryption 保護的不只是欄位 page,還可以保護 page header、column index、offset index、Bloom filter 與 footer。我會為檔案或欄位產生隨機 DEK,由 KMS 中的 MEK/KEK 封裝;工作只透過短期身分取得解封權限,檔案裡只保存可稽核的 key metadata。
安全邊界完整時使用 encrypted footer;若舊讀者必須讀取公開欄位,可以在有期限的遷移期使用 plaintext footer,但要明確它會暴露部分 metadata。演算法優先 AES-GCM,用 AAD 綁定資料表、分區、檔案版本與模組位置,防止密文替換;不會因 CTR page 更快就忽略它的 page 完整性限制。上線前我會驗證欄位投影與謂詞下推、KMS 拒絕、AAD 竄改、金鑰輪換、跨區域復原與舊讀者行為,並確認日誌沒有 DEK、明文或金鑰材料。這個方案把加密、授權、查詢與復原分成可測試的邊界。」
常見錯誤
- 只給 Parquet 檔案做儲存層加密 → 取得物件儲存權限的讀者仍能讀取所有欄位 → 按欄位、footer 與模組設計存取邊界。
- 只加密敏感 page,不管 footer → schema、統計與列數可能暴露敏感資訊 → 按威脅模型選擇 encrypted footer,或明確 plaintext footer 的洩漏範圍。
- 把 DEK 當成長期主金鑰 → 單一檔案外洩會擴大輪換與撤銷影響 → 用 KMS MEK/KEK 封裝隨機 DEK。
- 忽略 AAD → 同一金鑰下的舊檔案或其他分區可能被替換 → 綁定檔案與模組身分,並測試交換攻擊。
- 把 AESGCMCTR_V1 當成全量認證 → CTR page 可能沒有 GCM page 認證 → 按完整性需求選擇演算法並驗證竄改錯誤。
- 輪換後立即刪除舊金鑰 → 快照、備份與回放工作無法復原 → 保留版本對映與受控舊金鑰窗口。
追問與應對
公開欄位需要繼續支援舊版讀者,怎麼遷移?
先用 plaintext footer 保護敏感欄位資料 page,同時讓舊讀者只讀公開欄位;記錄它們暴露的 schema 與統計範圍。設定升級期限,完成新讀者覆蓋與回放測試後再切 encrypted footer,並保留回滾檔案版本。
如何防止把另一分區的密文 page 拷進目前檔案?
為檔案、資料表、分區、row group 與模組建立穩定的 AAD 身分。讀取時 AAD 不相符應觸發認證失敗;測試同一金鑰下交換舊版本、不同分區與不同欄位 page,確認全部被拒絕。
KMS 每次讀 page 都會產生延遲嗎?
不要把 KMS 呼叫放在每個 page 的熱路徑。使用 KMS 解封 DEK 或 KEK,再在受控程序內快取短生命週期材料;限制快取範圍與 TTL,輪換或權限撤銷時主動失效,並監控 KMS 錯誤與快取命中。
為什麼不能只使用 AES-CTR 取得更高吞吐?
CTR 不提供認證完整性,page 被修改時可能無法發現。若威脅模型要求偵測竄改,使用 AES-GCM;只有在明確接受完整性取捨且有外層校驗時,才評估 CTR 模式。
如何證明謂詞下推沒有繞過授權?
在授權與未授權身分下分別執行只查公開欄位、過濾敏感欄位與投影敏感欄位的查詢,檢查規劃器請求的模組與 KMS 權限。稽核應能關聯查詢、檔案、欄位、key metadata 與拒絕原因,不能只看最終返回列數。