有了HTTPS 還需要 DNSSEC 嗎?

#ca #dns #dnssec #https #tls

最近跟資安專家開會討論新專案,他們提問:「你要怎麼確定 User 連上的真的是你的網站?」
同事則問「有 HTTPS 不就夠了嗎?」
他們兩個問的都是好問題 😂
深入挖掘之後我認為 HTTPS 只是基本,還需要搭配 DNSSEC

這篇文章是我個人的研究、推測,並不保證正確性。

DNS 有什麼問題?

iThome 的這篇報導裏面提到 DNS 通常使用 UDP 溝通,但 UDP 是不安全的,因此容易被攻擊。

Cloudflare 這篇文章介紹了真實的攻擊案例。

HTTPS 有什麼問題?

根據 wikipedia 對 HTTPS 的描述:

也就是說 HTTPS 依靠憑證練確保:使用者正在跟正確的 server 連線。

假設 CA 不會出問題,使用者不會安裝來路不明的根憑證到電腦上,
而且憑證鍊上的每一張憑證都沒有問題,
那應該連線就是絕對安全的?

濫發憑證

但是 CA 有可能誤發(或者濫發)憑證,比如賽門鐵克的案例
也就是說,在滿足下列的條件時,使用者可能完全不會發覺自己已經連上駭客假冒的網站:

  1. 有 CA 正在濫發憑證
  2. DNS 汙染

仿冒網站 + 被濫發的憑證 + DNS汙染 = 使用者不會發現連到駭客架設的網站

駭客需要做的事情是,向該 CA 申請了一張受害網站的憑證,
然後汙染 DNS,讓 DNS 查詢指向駭客架設的假網站
則使用者進入該網站時,會透過被汙染的 DNS 拿到假網站的 IP,並從假網站拿到一張被濫發的憑證,
然後成功建立 HTTPS 連線。

可能的解法?

CA 濫發憑證的解法

進一步確保使用者只跟正確的 Server 做 HTTPS 連線

詳細解釋這些解法

DNSCAA

這是在自己的 DNS zone 上加入 CAA record。
但因為 DNS 查詢有被汙染的可能,還是需要加上 DNSSEC 保護。

DNSSEC

透過類似 HTTPS 憑證鍊的方式確保 DNS 紀錄不受竄改,
而且 DNS 本身就有層級關係,不像 HTTPS 的設計:每一家 CA 都有能力為每個網站簽發憑證,
所以 DNSSEC 不像 HTTPS 需要額外的監管機制(CT等等)。

當使用者在 parent zone 查找我們網域的 DS record 時便能知道是否啟用 DNSSEC

佈署時如果發生問題,可以看看 Cloudflare 的分享
成功佈署之後,用 dnsviz 應該會看到類似的結果:

Certificate Transparency

在申請憑證時,CA 會主動把憑證提交到 CT logs,並且在憑證中加入 SCT 紀錄。
但還需要瀏覽器主動檢查 CT logs,根據 MDN 的說明:firefox 並不會主動檢查 CT logs,
所以我們還需要額外設定 Expect-CT header

可以透過 https://crt.sh/ 察看 CT logs