為域名添加 DNSSEC 驗證

2021.12.16

整個域名系統從設計之初就幾乎沒有加入任何的安全細節, 但在現今規模的互聯網下, 特別是 ISP 不可信愈演愈烈的情況下提高 DNS 安全性和可信性變得尤為重要. 除了針對請求側的 DoT 和 DoH 之外, 作為域名所有者和使用側的我們能夠做的便是 DNSSEC 了. 在這里簡要討論幾個常見的 DNSSEC 誤區, 並記錄 DNSSEC 的配置過程.

常見誤區

DNSSEC 是否包含加密?

DNSSEC 不包括加密. 這是剛剛接觸 DNSSEC 時常會出現的誤區, 實際上 DNSSEC 傳送 RRsets 和 RRSIG 的過程均不包含加密, 傳輸過程中依然會被中間人讀取. 但能被中間人讀取不代表能夠被偽造, 由於中間人沒有 DNS 伺服器的私鑰, 因此是無法偽造出受信任的 RRSIG 的.

DNSSEC 是否響應不存在的記錄?

DNSSEC 會明確響應不存在的記錄. 在 DNS 污染中除了響應錯誤的地址和本地地址之外, 常常還包括響應地址不存在, 這就會帶來這個地址是不是真的不存在的問題, 我們又該如何相信這個地址真的不存在? 在 DNSSEC 中針對這個問題特別引入了 NSEC 和 NSEC3 記錄來解決這個問題, 它們都能夠明確否認對不存在的地址的身份驗證.

DNSSEC 是否會降低解析效率?

整體而言, 不會. 為什麽是整體而言不會呢? 對於請求側而言, 相比起直接查詢 DNS 記錄, DNSSEC 的驗證需要額外請求一些記錄, 這樣看來對單個請求的完成來看是增加了延時和開銷的. 但實際上 DNSSEC 是工作在父級域而非每個子域名的, 這也就意味著對 DNSSEC 的緩存能夠極大地提升驗證效率, 因而從整體來看相比起 DNSSEC 帶來的可靠性提升其效率和延時開銷微乎其微.

DNSSEC 是完美的嗎?

DNSSEC 是絕佳的方案, 但並不完美. 實際上 DNSSEC 在很多方面都極大地提升了 DNS 系統的可靠性, 這是我們必須認可的, 域所有者也應該及時為記錄添加 DNSSEC 的支援. 同時它也並不完美, 一方面是它的普及程度, 另一方面是 DNSSEC 驗證失敗的場景會帶來一些問題, 需要指出的是 這兩點實際上都不是 DNSSEC 本身所導致 的. 普及程度上主要是大多數域所有者對 DNSSEC 的重視程度不足, 還有就是請求側的客戶端支援目前也比較少, 大多都比較集中在 DNS Server 的實現上. 而 DNSSEC 驗證失敗的場景帶來的問題就比較嚴重了, 對於請求側的客戶端而言這不僅意味著重大安全隱患, 也意味著重新驗證需要的更多延時, 這時的延時開銷就不是額外的多少毫秒了, 往往可能會需要等待幾秒才能完成解析, 如果這種驗證失敗普遍存在那麽對於名稱伺服器的負載而言也是比較大的災難.

配置流程

實際上 DNSSEC 的配置並不覆雜, 通常我們只需要添加 DigestKey Tag 到域名注冊商處, 並選擇對應的 Digest TypeAlgorithm 即可. 我在這里根據 Cloudflare 的引導添加了對應的記錄到注冊商處, 完成後透過向 DNS 伺服器查詢可以獲得解析結果, 這里透過向 Google Public DNS 查詢:

{
  "name": "fernvenue.com.",
  "type": 43,
  "TTL": 21600,
  "data": "2371 13 2 9BF907A98DBF43868743AD4317D1E555BB067B3110C8966743217C7F53E0BA5D"
}

這里便是我們的域對應的 DNSSEC 公鑰了, 可以和添加的記錄對比完成確認, 這樣便完成了 DNSSEC 的配置與驗證. 最後也整理了一下關於 DNSSEC 的標準文檔及規範, 供參考:

  • RFC 2535 Domain Name System Security Extensions
  • RFC 3833 A Threat Analysis of the Domain Name System
  • RFC 4033 DNS Security Introduction and Requirements (DNSSEC-bis)
  • RFC 4034 Resource Records for the DNS Security Extensions (DNSSEC-bis)
  • RFC 4035 Protocol Modifications for the DNS Security Extensions (DNSSEC-bis)
  • RFC 4398 Storing Certificates in the Domain Name System (DNS)
  • RFC 4470 Minimally Covering NSEC Records and DNSSEC On-line Signing
  • RFC 4509 Use of SHA-256 in DNSSEC Delegation Signer (DS) Resource Records (RRs)
  • RFC 5155 DNSSEC Hashed Authenticated Denial of Existence
  • RFC 6781 DNSSEC Operational Practices, Version 2