代表性面试主题

数据工程面试:如何设计 Parquet Modular Encryption 的密钥与读取边界?

数据中等
Offer.cc 编辑团队发布 更新

题干

数据湖需要保护敏感列,同时保留列式读取能力。请解释 Parquet Modular Encryption 的 footer 与列加密模式,设计密钥托管、查询性能、旧读者失败和密钥轮换方案。

题干与适用场景

数据湖中的 Parquet 文件包含公开列和敏感列。团队希望加密敏感数据及元数据,同时继续利用列投影、谓词下推和压缩。请设计 footer 加密、列密钥、密钥托管、读取授权、旧读者兼容和轮换恢复。

题目讨论 Parquet Modular Encryption 规范能力,不假设所有查询引擎或语言绑定都支持相同的密钥配置。

面试官考察点

  • 能否区分加密 footer、加密列和仅加密页面的保护范围。
  • 能否把 KEK、DEK、密钥元数据与 KMS 权限分层,而不是把密钥写进文件。
  • 能否理解加密 footer 对 schema、统计信息、谓词下推和旧读者的影响。
  • 能否设计密钥轮换、撤销、重写和无法解密时的可观测错误。

回答前需要澄清的问题

  1. 哪些列属于敏感数据,是否还要隐藏 schema、行组和统计信息?
  2. 查询引擎需要哪些列,是否支持列级密钥与 footer 解密?
  3. KMS 是集中服务、云 HSM,还是调用方注入密钥?
  4. 文件是否跨账户、跨区域复制,备份如何获取解密权限?
  5. 轮换目标是新写文件、历史重写,还是立即撤销旧密钥?

30 秒回答框架

“Parquet 模块化加密可以保护文件数据和元数据,并保留列式功能,但 footer 加密会让没有密钥的读者无法获得 schema 和行组信息。我要把 KMS 中的主密钥与文件或列使用的密钥分离,授权读取者按列获取密钥;旧读者遇到加密 footer 应明确失败而不是把文件当损坏。轮换通过新写文件和受控重写完成,记录密钥版本、文件 ID 与失败原因,并用能力矩阵验证查询引擎是否仍能做谓词下推。”

分步骤深入解答

1. 选择保护范围

加密 footer 会保护 FileMetaData 及其中的行组、列块等元数据;列加密可针对敏感列使用不同密钥。若 footer 保持明文,读者可能看到 schema 或统计信息,即使无法读取列页面。先按威胁模型决定是否需要隐藏元数据。

2. 分离密钥职责

KMS 或 HSM 保存密钥加密密钥,文件写入时生成或取得数据加密密钥,并把受保护的 key metadata 写入文件。读取器由授权服务解析元数据、向 KMS 请求解包权限;文件本身不应携带可直接解密的主密钥。

3. 评估查询能力

Apache Parquet 文档说明模块化加密可在加密与认证数据、元数据的同时保留列投影、谓词下推、编码和压缩能力,但实际查询引擎仍要先取得相应密钥。加密 footer 可能阻止无密钥扫描器读取 schema 和统计信息,测试必须覆盖只读公开列、敏感列过滤和混合投影。

text
KMS KEK -> wraps file/column DEK -> protected key metadata
reader authorization -> unwrap allowed DEK -> decrypt footer/pages

4. 处理文件识别与旧读者

加密 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 文件。

公开来源

同类题目