代表的な面接トピック

データエンジニアリング面接:Parquetの機密カラムをどのように保護するか?

データ難しい
Offer.cc 編集チーム公開日 更新日

質問

データレイクでは、顧客のメールアドレス、決済識別子、および公開メトリクスが同一のParquetファイル内に保存されています。オブジェクトストレージは複数のチームで共有されていますが、認可されたジョブのみが機密カラムを復号できるようにする必要があります。暗号化、鍵管理、メタデータ保護、クエリパフォーマンス、レガシーリーダーとの互換性を設計し、データ漏洩やデータの不整合が発生していないことをどのように検証するか説明してください。

問題とスコープ

データレイクでは、メールアドレス、決済識別子、リージョン、および公開集計値が同一のParquetファイルに保存されています。オブジェクトストレージ、メタデータサービス、コンピュートクラスターは異なるチームに属しています。認可されたジョブは必要なカラムのみを読み取るべきであり、認可されていないリーダーは機密性の高い値やアイデンティティを明らかにするメタデータを閲覧できてはなりません。カラムレベルの暗号化と鍵管理を設計し、フッター、インデックス、述語プッシュダウン(predicate pushdown)、ローテーション、レガシーリーダー、およびリカバリについて論述してください。

Apache Parquetのモジュラー暗号化(Modular Encryption)は、通常のカラムプロジェクション、述語プッシュダウン、エンコーディング、圧縮オプションを維持しながら、ページ、ページヘッダー、カラムインデックス、オフセットインデックス、Bloomフィルタ、フッターなどの個別にシリアライズされたモジュールを保護します。優れた回答では、暗号化データ、保護されたメタデータ、鍵の認可、そして読み書きが正しく行われていることの証明を明確に分離して説明します。

面接官が見ているポイント

  • カラムキー、フッターキー、データ暗号化キー(DEK)、マスターキーの関係性を説明できるか?
  • 機密カラムのみを暗号化しても、スキーマ、統計情報、またはアイデンティティの手がかりが露出する可能性があることを理解しているか?
  • セキュリティ、互換性、移行コストの観点から、暗号化フッターと平文フッターを比較できるか?
  • AES-GCMの整合性とAADバインディング、およびCTRページの制限を理解しているか?
  • KMS、認可、ローテーション、バックアップ、クエリ失敗時の処理、監査を実行可能な設計として統合できるか?

不十分な回答は「ファイルにAES-256を使用する」とだけ答えます。優れた回答は、どのParquetモジュールが保護されているか、どのジョブがどのキーを取得できるか、レガシーリーダーや述語プッシュダウンで何を妥協するかを論理的に示します。

最初に確認すべき明確化のための質問

  1. スキーマ、行数、統計情報も隠す必要があるか、それともカラム値のみでよいか?これにより、フッターを暗号化する必要があるかどうかが決まります。
  2. どのジョブ、テナント、カラムを一緒に読み取ることが許可されているか?これにより、カラムキーのドメインとKMSポリシーの境界が定義されます。
  3. クエリエンジンとそのPyArrow/Parquetライブラリはモジュラー暗号化をサポートしているか?サポートしていない場合、読み取り/書き込みパスを直接切り替えることはできません。
  4. レガシーリーダーは暗号化されていないカラムを引き続き読み取る必要があるか?これにより、平文フッターによる移行期間が許容されるかどうかが決まります。
  5. ファイルは不変のパーティションか、それとも上書き、コピー、リプレイされるか?これにより、AADの識別情報、ローテーション、およびリプレイ検知の方法が決まります。

30秒で答える要約

「まずフッターや統計情報が機密であるかどうかを判断し、次にカラムごとにアクセスドメインを定義します。各ファイルまたはカラムには、KMSで管理されたMEKまたはKEKによってラップされたランダムなDEKを割り当てます。カラムページ、ヘッダー、インデックス、必要なカラムメタデータにはカラムキーを使用し、フッターは個別に保護します。機密性と整合性の両方を提供するAES-GCMを優先し、ファイルの差し替えを防ぐためにAADを介してテーブル、パーティション、ファイルバージョン、モジュール識別情報をバインドします。レガシーリーダーが公開カラムを読み取る必要がある場合、平文フッターを期間限定の移行措置として使用できますが、一部のメタデータが露出します。スキーマの厳密な機密性が求められる機密データセットには、暗号化フッターを使用すべきです。ロールアウト前に、KMSの認可、ローテーション、述語プッシュダウン、エラーリカバリ、レガシーの動作、および改ざんケースを検証します。」

ステップ・バイ・ステップの思考プロセス

1. 保護が必要なParquetモジュールのリストアップ

Parquetはデータ領域のみを持つブラックボックスではありません。ページとページヘッダーは値を保持し、カラムインデックス、オフセットインデックス、Bloomフィルタは範囲や分布を明らかにする可能性があり、フッターにはスキーマ、行数、ソート情報、統計情報、Key-Valueメタデータが含まれています。カラムページのみを暗号化しても、顧客のカテゴリや時間枠が露出する可能性があります。

text
file
├── row-group
│   └── column chunk
│       ├── dictionary/data pages
│       ├── page headers
│       ├── column index
│       ├── offset index
│       └── bloom-filter modules
└── footer / FileMetaData

脅威モデルを使用して保護対象のセットを選択します。機密性の低いカラムはレガシーツールが読み取れる状態のままにしておくことができますが、機密カラムとその統計情報、スキーマ、ファイル識別情報には、フッターとカラムメタデータのより強力な保護が必要です。この判断は、単にAESの鍵長を選択することよりも重要です。

2. エンベロープ暗号化とアクセス境界の設計

各ファイルまたはカラムにランダムなデータ暗号化キー(DEK)を割り当て、マスター暗号化キー(MEK)またはキー暗号化キー(KEK)でラップします。MEKは組織のKMSで保持します。ジョブは短期間のみ有効なアイデンティティを通じてアンラップ権限を受け取ります。オブジェクトストレージには暗号文と必要な鍵メタデータのみが含まれ、平文のマスターキーは含まれません。

text
authorized job -> KMS policy -> unwrap DEK -> decrypt footer/columns
object storage  -> ciphertext + key metadata only

テナント、データドメイン、または機密性レベルごとにカラムキーを分離し、1つのジョブがテーブル全体への権限を取得しないようにします。鍵メタデータは、KMSキーID、ラップされたマテリアルの識別子、または外部参照などにできます。これはシークレット自体ではありませんが、監査やローテーションに影響を与えます。マスターキーのローテーション中は、まずDEKを再ラップします。MEKが変更されたからといって、不変のデータページをすべて書き直す必要はありません。

3. 暗号化フッターと平文フッターの選択

暗号化フッターは、スキーマ、行数、カラム名、ソート情報、およびより詳細なカラムメタデータを隠します。これにより強固な境界が提供されますが、機密ファイルを読み取るすべてのリーダーがモジュラー暗号化をサポートしている必要があります。Parquetは暗号化フッターを持つファイルに PARE マジックバイトを使用するため、PAR1 を想定しているレガシーリーダーはそのフォーマットを即座に拒否できます。

平文フッターを使用すると、古いリーダーでも一部のメタデータを参照し、暗号化されていないカラムを読み取ることができます。暗号化されたカラムデータを読み取ることはできませんが、フッターは整合性のために署名されます。これは期間限定の移行モードとして利用できますが、統計情報が機密である場合の恒久的なセキュリティ代替手段にはなりません。

リーダーのマトリクスをテストします:エンジンが暗号化カラムを検出できるか、不正アクセスが失敗するか、公開カラムのみのクエリで述語プッシュダウンが引き続き機能するか、レガシーリーダーがファイルを破損として扱うのではなく、サポートされていない暗号化であるという明示的なエラーを報告するかを確認します。

4. アルゴリズムの選択とAADのバインド

AES-GCMは暗号化と認証タグを提供します。AAD(追加認証データ)は、テーブル、パーティション、ファイルバージョン、モジュール位置を暗号文にバインドし、攻撃者が同一のキーで現在のファイル、別のパーティション、または別の行グループ(Row Group)を置き換えるのを防ぎます。ランダムなノンスは同一の鍵に対して一意であり続ける必要があり、キーの呼び出しバジェットはライター間で管理される必要があります。

Parquetは AESGCMCTRV1 も定義しています。スループット向上のため、ページ以外のモジュールはGCMを使用し、データページはCTRを使用します。CTRページにはGCMのような認証付きの整合性がありません。脅威モデルでページの改ざん検知が必要な場合は、CPU速度だけで選択するのではなく、AESGCM_V1 を優先します。

5. クエリ機能の維持と障害パスの定義

暗号化は圧縮されたページやその他のモジュールに適用されるため、フォーマットはプロジェクション、述語プッシュダウン、エンコーディング、圧縮を引き続き表現できます。プランナーは可視フッターまたはインデックスを読み取り、認可されたカラムのみを要求できます。ただし、フッターまたはカラムインデックスが暗号化されている場合、プランナーには対応する復号権限が必要です。「公開カラムのみをクエリする」からといって、自動的に「鍵が不要である」とは限りません。

復号の失敗、KMSのタイムアウト、権限の取り消し、AADの不一致、および認証タグの失敗を個別に記録します。平文へ暗黙的にフォールバックすることは絶対に避け、すべての障害を一括してファイル破損として扱わないようにします。ファイルID、鍵メタデータ、アルゴリズムバージョン、監査プリンシパルを保持しますが、DEK、平文の値、または完全な鍵マテリアルは絶対にログに記録しないでください。

6. ローテーション、改ざん、ディザスタリカバリの検証

機密カラムの不正読み取り、認可された公開カラムの読み取り、認可された機密データの読み取り、古いファイルの差し替え、行グループの交換、暗号文ページの編集、KMSの拒否、ローテーション後の読み取り、およびクロスリージョンリカバリをテストします。各テストについて、期待されるエラー、平文が返されたかどうか、および監査イベントを記録します。

リカバリには、暗号化ファイル、鍵メタデータ、KMSキーバージョンのマッピング、およびAADのファイル識別情報が必要です。KMSの権限なしにストレージを復元すると読み取り不可能なファイルが生成され、AADプレフィックスなしにKMSを復元するとファイル識別情報の検証ができなくなる可能性があります。破棄する前に、スナップショット、リプレイ、およびバックアップの検証ウィンドウ全体を通じて古いキーバージョンを保持してください。

質の高い回答例

「私はまず脅威モデルを定義することから始めます。スキーマ、行数、統計情報を隠す必要があるか、そしてどのジョブがどのカラムを読み取れるかを明確にします。Parquetモジュラー暗号化は、カラムページだけでなく、ページヘッダー、カラムインデックス、オフセットインデックス、Bloomフィルタ、フッターも保護できます。ファイルまたはカラム用にランダムなDEKを生成し、KMS内のMEK/KEKでラップします。ジョブは短期間有効なアイデンティティを通じてアンラップ権限を取得し、ファイルには監査可能な鍵メタデータのみが含まれます。

完全なセキュリティ境界を確保するために、暗号化フッターを使用します。レガシーリーダーが公開カラムにアクセスする必要がある場合は、期間限定の平文フッター移行を採用し、露出するメタデータを文書化します。テーブル、パーティション、ファイルバージョン、モジュール識別情報をバインドするAADを備えたAES-GCMを優先し、CTRページの方が高速であるという理由だけでページの整合性を妥協しません。ロールアウト前に、プロジェクションと述語プッシュダウン、KMSのアクセス拒否、AAD改ざん、キーローテーション、クロスリージョンリカバリ、およびレガシーの動作をテストします。ログにはDEK、平文、鍵マテリアルを含めません。この設計により、暗号化、認可、クエリ動作、リカバリを個別にテスト可能にします。」

よくある間違い

  • ストレージ層の暗号化のみを使用する → オブジェクトアクセス権を持つ全員がすべてのカラムを読み取れる → カラム、フッター、モジュール単位で境界を設計する。
  • 機密ページのみを暗号化し、フッターを暗号化しない → スキーマ、統計情報、行数が漏洩する可能性がある → 暗号化フッターを選択するか、平文フッターによる露出を明示的に規定する。
  • DEKを長期マスターキーとして扱う → 1つのファイル漏洩がローテーションと失効の影響を拡大させる → ランダムなDEKをKMSのMEKまたはKEKでラップする。
  • AADを無視する → 同一の鍵の下で古いファイルや他のパーティションに差し替えられる可能性がある → ファイルとモジュールのアイデンティティをバインドし、スワップテストを実施する。
  • AESGCMCTR_V1を完全認証済みと呼ぶ → CTRページにはGCMページ認証がない場合がある → 整合性要件に基づいて選択し、改ざんテストを実施する。
  • ローテーション直後に古いキーを削除する → スナップショット、バックアップ、リプレイジョブが復元できなくなる → バージョンマッピングと管理された旧キー保持期間を維持する。

フォローアップの質問と回答

レガシーリーダーが公開カラムを引き続き読み取る必要があります。どのように移行しますか?

機密カラムのデータページを暗号化しながら一時的に平文フッターを使用し、レガシーリーダーが公開カラムにのみアクセスできるようにします。露出するスキーマと統計情報を評価し、アップグレードの期限を設定した上で、新しいリーダーの対応とリプレイテストに合格した後に暗号化フッターへ移行します。ロールバック用のファイルバージョンを保持します。

他のパーティションのページがこのファイルにコピーされるのをどのように防ぎますか?

ファイル、テーブル、パーティション、行グループ、モジュールから安定したAADアイデンティティを構築します。不一致がある場合は認証に失敗する必要があります。同一キーでの旧バージョン、パーティション間、カラム間のスワップをテストし、すべて拒否されることを検証します。

ページの読み取りごとにKMSのラウンドトリップが必要ですか?

いいえ。KMSを介してDEKまたはKEKをアンラップし、管理されたプロセス内に短期間のみ鍵マテリアルをキャッシュします。キャッシュのスコープとTTLを制限し、ローテーションや失効時に無効化し、KMSのエラーとキャッシュヒット率を監視します。ページのホットパスにKMS呼び出しを配置してはなりません。

スループットを高めるためにAES-CTRのみを使用しないのはなぜですか?

CTRは整合性を認証しないため、変更されたページが検出されない可能性があります。脅威モデルで改ざん検知が必要な場合はAES-GCMを使用します。整合性のトレードオフが明確であり、外部の整合性メカニズムが検証されている場合にのみCTRを検討してください。

述語プッシュダウンが認可をバイパスしないことをどのように証明しますか?

認可されたアイデンティティと認可されていないアイデンティティの下で、公開のみ、機密フィルタ、機密プロジェクションのクエリを実行します。要求されたモジュールとKMSの権限を検査します。監査ログにはクエリ、ファイル、カラム、鍵メタデータ、拒否理由を関連付ける必要があり、単なる最終行数の確認だけでは不十分です。

公開情報ソース

関連する質問