質問とシナリオ
複数のマイクロサービスが、テナント、実験、リクエスト元のコンテキストにW3C baggageヘッダーを使用しています。一部のサービスは企業やデータドメインの境界を越えるため、個人データや内部識別子が信頼されていないダウンストリームシステムに侵入しないようにしつつ、OpenTelemetryの相関関係を維持する必要があります。
面接官がテストしていること
- BaggageとTrace Contextを分離し、任意のキー・バリュー伝播を認識できているか。
- 盲目的な転送の代わりに、信頼境界のアローリスト、サイズ制限、墨消し(リダクション)、削除を適用できるか。
- オブザーバビリティ、互換性、グレースフルデグラデーション、監査証跡のバランスを取れるか。
回答前の明確化のための質問
どのサービスが信頼ドメインを共有しているか、許可フィールドカタログ、最大ヘッダーサイズ、ブラウザまたはキューのエントリポイント、テレメトリの保持期間、およびダウンストリームシステムがBaggageを永続化するかどうかを明確にします。目的が機密キーのブロックなのか、ドメイン間伝播の制限なのか、カスタムヘッダーの移行なのかを明確にします。
30秒の回答フレームワーク
私はBaggageを信頼できない入力として扱います。入力(ingress)時にパースして正規化し、送信元、送信先の信頼ドメイン、およびポリシーに基づいてフィールドを保持、名前変更、ハッシュ化、または削除します。ゲートウェイはキー/バリューおよび合計サイズを制限し、生(raw)の値をログやユーザーレスポンスに決してコピーせず、ドメイン間送信(egress)時にはアローリストとポリシーバージョンを使用します。Traceparentは個別に処理されます。フィルタリングに失敗した場合は、オプションのフィールドを破棄してコアリクエストを続行し、監査可能なポリシーアクションを記録します。
ステップごとの詳細な回答
- バージョン管理されたフィールドカタログを維持する:目的、データクラス、許可された送信元・送信先ドメイン、最大長、ロギング権限。
- 入力時に標準フォーマットをパースし、無効なキー、制御文字、サイズ超過の値、重複による競合を拒否する。機密ヘッダーではなく、リクエストダイジェストを保持する。
- 同一の信頼ドメイン内ではアローリストを伝播させる。ドメインを越える場合は、最小化された公開キー、不可逆なテナントエイリアス、または短期間有効な署名付き参照のみを送信する。
- 自動計装がすべてのBaggageアイテムをスパン、ログ、メトリクス属性にコピーしないよう、OpenTelemetry注入ポイントに明示的なフィルタリングを追加する。
- 合計バイト数、アイテム数、ホップ数を制限する。オーバーフロー時は、優先度の低いフィールドを削除し、機密データをエコーバックせずに内部ポリシーイベントを発行する。
- 各送信時にポリシーを再評価する。キューや非同期ジョブにもカタログを再利用する。Baggageを認可クレデンシャルとして決して使用しない。
- 元の値ではなく、フィールド名、ポリシーバージョン、アクション、送信先を監査する。合成データによる漏洩テスト、サイズ攻撃、マルチホップ蓄積をテストする。
incoming baggage: tenant=acme,experiment=A,pii_email=alice@example.org
same-trust output: tenant=acme,experiment=A
cross-trust output: tenant_ref=hash:v3:...,experiment=A質の高い模範解答
まず、Baggageは認証や認可のキャリアではなく、すべての値は信頼できないものであると述べます。バージョン管理されたフィールドカタログが入力をパースして制限を適用し、アローリストが同一ドメイン内の伝播を管理します。信頼境界を越える際は、最小化されたエイリアスまたは短期間有効な参照のみを送信します。OpenTelemetryのトレースコンテキストは個別に処理し、自動注入をフィルタリングして、生の値を決してログに記録しません。オーバーフローや未知のポリシーが発生した場合は、オプションのフィールドを破棄し、コアリクエストを続行して、フィールド名、アクション、ポリシーバージョンを記録します。マルチホップの合成テスト、キュー境界テスト、監査クエリにより、健全なトレースの背後に隠すことなくプライバシーリスクを低減できていることを検証します。
よくある間違い
- Baggageを信頼できるアイデンティティ、認可、テナント分離として扱う。
- 信頼境界を越えて任意のキーを許可したり、文字列のブラックリストのみに依存したりする。
- ヘッダー全体をログ、トレース、エラーレスポンスに書き込む。
- HTTPは統制しているが、キュー、リトライ、非同期ジョブを忘れている。
- オプションフィールドのオーバーフローに対して4xxを返したり、監査イベントを出さずにデータをサイレントに破棄したりする。
フォローアップの質問と回答
BaggageとTrace Contextの違いは何ですか?
Trace Contextは分散トレーシングに必要な標準メタデータを運びます。Baggageはアプリケーション定義のキー・バリューセットであり、独立して動作できるため、そのセマンティクスとプライバシーリスクはアプリケーションに帰属します。
なぜブラックリストよりもアローリストを選ぶのですか?
Baggageキーには固定のビジネスセマンティクスがなく、時間の経過とともに新しいフィールドが登場します。アローリストはデフォルトで未知のデータを拒否するため、新しいサービスやベンダーが機密値を誤って拡散するのを防ぎます。
フィルタリングの失敗によってリクエストをブロックすべきですか?
フィールドが観測目的のみである場合は、破棄して続行します。ビジネスフローで必要な場合は、値をエコーバックせずに認識可能なポリシーエラーを返します。カタログでどのフィールドがクリティカルかをマークしておく必要があります。
生の値がテレメトリに入らないことをどのように証明しますか?
CollectorとSDKの両方で墨消しテストを実行し、ログ、スパン属性、メトリクスラベルをスキャンし、値ではなく名前とポリシーバージョンを記録し、合成カナリアでアラートを設定します。