数据工程面试:如何设计 Parquet Modular Encryption 的密钥与读取边界?
题干与适用场景
数据湖中的 Parquet 文件包含公开列和敏感列。团队希望加密敏感数据及元数据,同时继续利用列投影、谓词下推和压缩。请设计 footer 加密、列密钥、密钥托管、读取授权、旧读者兼容和轮换恢复。
题目讨论 Parquet Modular Encryption 规范能力,不假设所有查询引擎或语言绑定都支持相同的密钥配置。
面试官考察点
- 能否区分加密 footer、加密列和仅加密页面的保护范围。
- 能否把 KEK、DEK、密钥元数据与 KMS 权限分层,而不是把密钥写进文件。
- 能否理解加密 footer 对 schema、统计信息、谓词下推和旧读者的影响。
- 能否设计密钥轮换、撤销、重写和无法解密时的可观测错误。
回答前需要澄清的问题
- 哪些列属于敏感数据,是否还要隐藏 schema、行组和统计信息?
- 查询引擎需要哪些列,是否支持列级密钥与 footer 解密?
- KMS 是集中服务、云 HSM,还是调用方注入密钥?
- 文件是否跨账户、跨区域复制,备份如何获取解密权限?
- 轮换目标是新写文件、历史重写,还是立即撤销旧密钥?
30 秒回答框架
“Parquet 模块化加密可以保护文件数据和元数据,并保留列式功能,但 footer 加密会让没有密钥的读者无法获得 schema 和行组信息。我要把 KMS 中的主密钥与文件或列使用的密钥分离,授权读取者按列获取密钥;旧读者遇到加密 footer 应明确失败而不是把文件当损坏。轮换通过新写文件和受控重写完成,记录密钥版本、文件 ID 与失败原因,并用能力矩阵验证查询引擎是否仍能做谓词下推。”
分步骤深入解答
1. 选择保护范围
加密 footer 会保护 FileMetaData 及其中的行组、列块等元数据;列加密可针对敏感列使用不同密钥。若 footer 保持明文,读者可能看到 schema 或统计信息,即使无法读取列页面。先按威胁模型决定是否需要隐藏元数据。
2. 分离密钥职责
KMS 或 HSM 保存密钥加密密钥,文件写入时生成或取得数据加密密钥,并把受保护的 key metadata 写入文件。读取器由授权服务解析元数据、向 KMS 请求解包权限;文件本身不应携带可直接解密的主密钥。
3. 评估查询能力
Apache Parquet 文档说明模块化加密可在加密与认证数据、元数据的同时保留列投影、谓词下推、编码和压缩能力,但实际查询引擎仍要先取得相应密钥。加密 footer 可能阻止无密钥扫描器读取 schema 和统计信息,测试必须覆盖只读公开列、敏感列过滤和混合投影。
KMS KEK -> wraps file/column DEK -> protected key metadata
reader authorization -> unwrap allowed DEK -> decrypt footer/pages4. 处理文件识别与旧读者
加密 footer 文件使用不同的 magic bytes,Apache Parquet 文档列出 PARE,明文文件使用 PAR1。旧读者可能把加密文件视为不支持的格式;平台应在能力探测或注册表中提前标注,而不是等查询中途才报模糊的损坏错误。
5. 设计轮换与撤销
轮换优先影响新文件:新 DEK 由新 KEK 包装,旧文件按保留策略逐步重写。需要立即撤销时,KMS 拒绝解包会使读取失败;平台必须保留待重写文件清单、密钥版本和恢复流程。重写应使用临时文件与原子替换,避免生成半加密文件。
6. 观测和故障分层
记录文件 ID、footer/列密钥版本、授权主体、KMS 延迟、解密失败类型和查询中的列集合,禁止记录明文密钥或敏感值。区分权限拒绝、密钥不存在、认证标签失败、旧读者不支持和文件损坏,分别告警与处理。
高质量示范回答
“我先按威胁模型决定是否隐藏 footer。模块化加密可保护 footer、列和页面;footer 加密会让无密钥读者看不到 schema 与统计信息,而列密钥可限制敏感列。KMS 保存 KEK,文件或列 DEK 以受保护元数据关联,读取者通过授权服务解包。能力矩阵要验证公开列投影、敏感列过滤和谓词下推。加密文件的 PARE 与明文 PAR1 让平台可提前识别旧读者风险。轮换采用新写文件、批量重写和原子替换,记录密钥版本与失败类型,撤销时走 KMS 拒绝并保留恢复清单。”
常见错误
- 把 KEK 直接写进文件 → 拿到文件即可解密 → 只存受保护 key metadata。
- 只加密列不评估 footer → schema 和统计信息仍可能泄露 → 按威胁模型选择 footer 模式。
- 假设所有引擎支持列级密钥 → 生产查询才发现能力缺口 → 建立引擎与绑定版本矩阵。
- 轮换时原地覆盖文件 → 中断会留下不可读或半完成文件 → 临时写入后原子替换。
- 把认证失败当坏文件 → 排障方向错误 → 区分 KMS、授权、认证标签和格式错误。
追问及应对
加密 footer 会不会让谓词下推失效?
不必然。取得 footer 与所需列密钥后,格式仍可保留列式读取和谓词下推;没有 footer 密钥的扫描器无法读取统计信息,实际能力取决于查询引擎的加密支持。
为什么需要列级密钥?
不同主体可能只应读取部分列。列级密钥把授权边界从整个文件细化到敏感列,减少授予读取公开列时的密钥暴露范围。
旧读者遇到 PARE 应如何处理?
应明确报告不支持模块化加密并指导使用兼容读者或解密重写流程,不能把 PARE 文件静默当成损坏的 PAR1 文件。