系統設計面試:如何設計可稽核的 DNSSEC 金鑰輪換控制平面?
題目
為託管數萬個簽署區域的平台設計 DNSSEC 金鑰輪換控制平面,協調註冊商的 DS、權威伺服器的 DNSKEY/RRSIG 與租戶審批;輪換期間不能讓驗證型遞迴解析器看到信任鏈斷裂。
場景與限制
KSK 與 ZSK 生命週期不同,註冊商 API 有延遲和重複請求風險,權威節點跨區域部署。控制平面必須支援冪等重試、暫停單一租戶、稽核狀態轉換,部分步驟失敗時停止擴散。
核心考點
考察狀態機、時間不變量、外部副作用編排和可觀測性。答案要區分 DNSKEY 預發布、DS 發布、舊金鑰撤回與簽名覆蓋窗口,不能把「產生新金鑰」當成輪換完成。
參考解法
每個區域使用持久化狀態機:observe、prepublish、ds-submit、ds-visible、sign-with-both、retire-old、verify。每一步記錄期望版本、操作令牌、TTL 預算和證據快照。先將新 DNSKEY 發布至所有權威節點並等待 TTL,再透過註冊商提交 DS;確認父區 DS 在多個遞迴解析器可見後,讓新舊金鑰同時簽名安全窗口,最後撤回舊 DS 與舊 DNSKEY。
調度器按區域租約串行執行,外部呼叫使用冪等鍵和指數退避。驗證器出現 SERVFAIL、DS/DNSKEY 不匹配或 RRSIG 過期時,凍結該區域,保留舊材料並要求人工審批。
關鍵細節
控制平面資料庫保存期望狀態,DNS 查詢和註冊商回讀是事實來源;衝突時不能盲目覆蓋。時間計算要包含權威與遞迴快取 TTL、簽名有效期和傳播餘量。私密金鑰放在受控 KMS,日誌只記錄指紋、key tag、版本與操作者,不記錄私鑰。
常見誤區
跨租戶並行修改同一註冊商物件;只檢查權威節點而不檢查父區 DS;輪換失敗後立即刪除舊金鑰;把工作佇列重試當成冪等;沒有暫停和人工接管路徑。
評估標準
高品質答案能畫出控制平面、權威 DNS、註冊商、遞迴驗證器與稽核儲存的邊界,寫出至少三個安全不變量,並說明各狀態的進入、退出和回滾條件;也應給出成功率、SERVFAIL、傳播延遲與卡住租約指標。
追問
為什麼 DS 發布通常晚於 DNSKEY 預發布?
預發布讓權威節點和快取先擁有新 DNSKEY;父區 DS 隨後指向它,驗證器才沿新鏈驗證,降低 DS 已出現但 DNSKEY 尚不可見的窗口。
註冊商逾時但可能已成功,如何重試?
用區域版本和請求冪等鍵查詢註冊商目前 DS,再決定重試;不能依一次逾時直接提交第二個未知狀態的變更。
何時允許自動撤回舊 DS?
只有新 DS 在目標遞迴解析器集合持續可見、RRSIG 驗證通過且 TTL 與簽名窗口符合策略,才可自動進入撤回步驟,否則保持凍結。