プロンプトとスコープ
マルチテナントSaaS向けの権威DNSコントロールプレーンを設計します。ユーザーはA、AAAA、CNAME、TXTレコードを送信します。システムは競合を検証し、ゾーンバージョンを作成し、権威ノードに通知し、AXFR/IXFR、DNSSEC、ロールアウト、ロールバック、および監査をサポートします。
面接官が評価するポイント
- コントロールプレーン、権威配信プレーン、再帰リゾルバーの分離。
- イミュータブルなゾーンバージョンとアトミックな公開の使用。
- SOAシリアル、NOTIFY、AXFR、IXFRの連携。
- テナント分離、認可、DNSSEC鍵の保護、および不正リリースの防止。
- 遅延ノード、部分公開、ネガティブキャッシュ、およびロールバックへの対応。
最初に確認すべき明確化事項
ゾーン数、書き込みレート、伝播SLO、DNSSEC、ノードの地理的配置、認可および承認モデル、古いノードがAXFRのみをサポートしているかを確認します。指定がない場合は、分単位の可視性を持つグローバル分散型の権威クラスターを想定します。
30秒の回答フレームワーク
コントロールプレーンで正規化されたレコードを書き込み、イミュータブルなゾーンバージョンを作成して検証し、権威ノードをアトミックに切り替えます。SOAシリアルをインクリメントし、NOTIFYによってIXFRをトリガーし、フォールバックとしてAXFRを使用します。すべてのリリースには状態、監査証跡、ロールバックポインタが付与されます。DNSSEC、テナント認可、伝播モニタリングがリリースのゲートとなります。
ステップバイステップの詳細解説
1. プレーンの分離
コントロールプレーンはテナント、ゾーン、レコード、バージョンを保存します。配信プレーンは公開済みバージョンからのみ応答します。再帰リゾルバーは書き込みパスの外側にあり、TTLによって可視化の遅延が発生します。バージョンには正規ゾーンデータ、SOAシリアル、チェックサム、署名状態、およびターゲットが含まれます。
2. 書き込みと検証の設計
候補トランザクションを書き込み、名前、TTL、タイプ制約、CNAME競合、委任境界、テナントクォータを検証します。一括変更には冪等性IDとオプティミスティックバージョンを付与します。検証に失敗した変更が公開可能バージョンを作成することはありません。
3. アトミックな生成と公開
ゾーン構造を生成し、構文、委任、循環参照、DNSSECのチェックを実行します。検証済みのコンテンツアドレス指定オブジェクトとチェックサムを保存します。ノードはバージョンポインタをアトミックに切り替え、新旧の応答が混在するのを防ぎます。
4. 伝播と遅延ノード
プライマリはシリアルをインクリメントし、NOTIFYを送信します。セカンダリはIXFRを要求し、デルタチェーンが利用できない場合や検証に失敗した場合はAXFRにフォールバックします。ノードはシリアル、チェックサム、署名状態を報告します。遅延ノードはドレインされるか、検証済みの古いバージョンを配信します。空のゾーンをサイレントに配信してはなりません。
5. TTL、ネガティブキャッシュ、ロールバック
TTLは再帰キャッシュを制御し、NXDOMAIN応答はネガティブキャッシュされます。TTLを変更する前に新しいターゲットを準備します。権威レコードを削除しても、外部キャッシュが即座にクリアされるわけではありません。古いシリアルを再利用するのではなく、より高いシリアルを持つ検証済みの古いバージョンにロールバックします。
6. セキュリティとテナント分離
ゾーンスコープのRBAC、承認、デュアルコントロールを使用します。内部更新APIを認証し、リプレイを防止します。DNSSEC鍵はKMSまたはHSMに保持し、署名に失敗した場合はリリースをブロックします。テナントのシークレットを保存することなく、アクター、リクエスト、バージョン、シリアル、結果を監査します。
7. オブザーバビリティと訓練
公開レイテンシ、シリアルスキュー、IXFR/AXFR比率、署名失敗、SERVFAIL、NXDOMAINの変化、クエリ成功率、地域分布を監視します。プライマリ障害、ネットワーク分断、デルタ履歴の欠落、不正ゾーン、鍵ローテーション、ロールバックの訓練を行い、検証済みの古いバージョンが引き続き利用可能であることを確認します。
質の高い模範解答
私なら、コントロールプレーンでテナントごとに分離されたイミュータブルなゾーンバージョンを保持し、権威ノードには1つの検証済みバージョンのみを配信させます。名前、TTL、CNAME競合、委任、クォータを冪等な一括リクエストとオプティミスティックバージョンで検証します。正規ゾーンを生成し、構文、DNSSEC、チェックサムを検証した上で、ポインタをアトミックに切り替えます。
プライマリはシリアルをインクリメントしてNOTIFYを送信し、セカンダリはIXFRを優先してAXFRにフォールバックします。ノードはシリアル、チェックサム、署名状態を報告します。TTLとネガティブキャッシュが外部への反映タイミングを決定し、ロールバックには新しいシリアルを使用します。RBAC、承認、KMS/HSM、監査、SERVFAILおよびシリアルスキューのモニタリング、そして分断や鍵ローテーションの訓練をリリースのゲートとします。
よくある間違い
- 再帰キャッシュの遅延をコントロールプレーンの障害として扱う。
- 共有ゾーンファイルを直接編集し、部分的な書き込み内容を配信してしまう。
- NOTIFYの送信をもって伝播が完了したと思い込む。
- IXFR失敗後に空のゾーンを配信してしまう。
- ロールバック時に古いSOAシリアルを再利用する。
- テナントにDNSSEC秘密鍵への直接アクセスを許可する。
- NXDOMAINやSERVFAILのモニタリングを省略する。
フォローアップ質問と回答
フォローアップ1:なぜSOAシリアルを増加させなければならないのですか?
ノードとキャッシュは新しさを判断するためにシリアルを比較します。ロールバック時にも、古いバージョンと誤認されないよう、より高いシリアルが必要です。
フォローアップ2:IXFRで差分が見つからない場合はどうなりますか?
AXFRを要求します。転送が失敗した場合は、検証済みバージョンを維持してアラートを発報し、空のゾーンを配信することは絶対に避けます。
フォローアップ3:大幅に遅延しているノードはどう処理しますか?
シリアルとチェックサムを比較し、ドレインするか検証済みの古いバージョンを配信させたままにし、AXFRとサンプリングクエリによって追いつかせます。
フォローアップ4:DNSSEC署名に失敗した後、未署名データを公開してもよいですか?
ゾーン契約で署名が必須とされている場合は、公開をブロックし、鍵またはチェーンを修復します。サイレントにダウングレードしてはなりません。