2022-04-06

防堵DNS快取中毒的核心技術 – DNSSEC

防堵DNS快取中毒的核心技術 – DNSSEC
前面的文章,我們已經介紹過有關DNS在網際網路世界中扮演的角色,DNS技術創立於1980年代,當時資訊安全並不是一項非常重要的議題,因此在那個年代創造出來的各種技術可能都存在許多先天的資安弱點,以DNS來說,在DNS的查詢與回應過程是不會進行加密的,若有駭客在其中假造了自己的DNS封包,將使用者原先要連到的網址替代成錯誤的IP導引到駭客的主機伺服器,再加上假的網站內容與真正的網站看起來一模一樣,就很容易讓使用者輸入隱私資料進到有心人士的資料庫,接下來我們就要來詳細介紹防止DNS中毒風險的關鍵技術「DNSSEC」。

DNSSEC是什麼?
DNSSEC全名Domain Name System Security Extensions,中文譯做網域名系統安全擴充,是一項於1999年提出、2005年成型的DNS解析技術,可藉由在DNS資訊中附加數位簽章(Digital Signature),藉此判斷資料獲取來源的網路名稱是否真實無虞,此功能可以保護我們不受假造DNS資料的威脅,讓使用者要求網址時不會取得其他被刻意誤導或惡意製作的網址,進而為我們的網域多加一層的安全防護,DNSSEC除了可以完全兼容於現行的DNS系統中,還額外提供三種資訊安全防護:
  1. 資料完整性(Data integrity)
  2. 來源可驗證性(Origin authentication of DNS data)
  3. 可驗證之不存在性(Authenticated denial of existence)
以上的三點資安防護都是使用了「雜湊函式Hash Function」與「非對稱式密碼學 Asymmetric cryptography」的技術。

什麼是雜湊函式?
所謂的雜湊函式是把資料壓縮成一組驗證值(Hash Value),使得資料量變小且固定。
雜湊函式是多對一的映射,簡單來說就是它無法透過輸出值來回頭計算出原本的輸入訊息,也因為多對一映射的特性,所以有許多訊息的映射值是相同的。



雜湊函式的特性會讓輸出值與輸入的資料息息相關,原資料有任何的的變動都會產生出極為不同的輸出結果;此演算法需確保有相同映射值,但訊息內容不同的機率極低,此機率一般是決定於映射值的長度,其位元數越多,可映射的範圍越大、重複的機率越低。

什麼是非對稱式加密?
非對稱式加密又被稱為公開金鑰加密加密(Public-key cryptography),這種加密方式的特色就是利用加密及解密時須使用「兩組」、「成對」的鍵值(鑰匙),我們通常會將其中的一組鍵值稱作公開鑰匙(Public Key),並公佈給所有人下載,另一組則稱為私有鑰匙(Private Key),這組私鑰需要由個人妥善保管。

我們舉例說明,當路人甲要傳送資料給路人乙時,甲可以先將資料用乙的公鑰加密,之後再傳給乙,乙收到之後再用自己的私鑰解密。
剛剛的舉例中,因為乙的公鑰是公開的,所以大家都可以用它把訊息加密之後再傳送給乙,但因為只有乙擁有私鑰,所以任何的第三方都無法解讀乙的資料。

另一種常見的公私鑰匙加密的應用則是數位簽章,例如A在撰寫完一封電子信件後,他可以以信件的內容透過雜湊函式產生一組驗證碼,接著以自己的私鑰對該驗證碼加密並產生一組數位簽章,並將該簽章附在信件作為附件再寄給B。

B收到信就有兩件事可以驗證:
  1. 用A的公鑰解開這份數位簽章,若可以順利解開,B就可以確定信件是來自A。
  2. 用同樣的雜湊函式計算該信的驗證碼,若與信件內容相同,表示該信內容未遭竄改
DNSSEC提供了哪些資訊安全技術:
  1. 資料完整性(data integrity):
在DNSSEC的狀況下,每一個紀錄都必定經過數位簽章做簽署的動作,所以在DNSSEC裡會有一項DNS 紀錄,這個紀錄就叫做 RRSIG(Resource Record Signature),它會附在DNS請求的回覆當中。所以當我們收到資料就可使用公鑰加上RRSIG的紀錄來驗證,我們收到的結果是否為原本詢問之RR紀錄,以此來驗證中間是否有被竄改。這把公鑰在DNSSEC架構中又被稱為DNSKEY。
  1. 來源可驗證性 (origin authentication of DNS data):
在我們個人或是公司的數位簽章中,通常需將公鑰交由公正的第三方加以驗證,就像是透過CA來驗證我們網站的真實性一樣。(延伸閱讀:我要怎麼知道SSL憑證可以保障我的網站安全?憑證頒發機構CA是什麼?)
所以,在DNSSEC架構中,我們可以依賴上一級網域的DNS紀錄,也就是DNS權威伺服器,把上一級憑證的公鑰放在那邊,這個叫做DS(Delegation Signer)紀錄,這這些紀錄中,只會記載「這個憑證的指紋(hash)」。
其中,我們還可以去確認使用的公鑰和上面的DS紀錄是一樣的,以及透過DNSKEY去計算出DS的數值,確認過這兩者間的關係,就可以保證DNSKEY紀錄的可靠性。
  1. 可驗證之不存在性(authenticated denial of existence)
當我們隨意輸入一個網址www.123456789.com ,系統回應「unknown host」說明找不到該網址的IP位置,我們也不一定能確定這個網址是真的不存在,還是中間有駭客假造回應不存在之封包訊息,故意讓我們連不上此網頁。

在DNSSEC架構中,有一種紀錄叫做NSEC(Next Secure),這個紀錄中也會同步記載「下一筆紀錄是什麼」,也就是當查詢到不存在的網址時,我們可以去比對NSEC 紀錄中前後對應的字母來確認是否真的不存在,這就是所謂的可驗證之不存在性。


DNSSEC的缺點:
  1. 隱密性
DNSSEC所傳遞的RR及RRSIG傳輸過程皆未加密,因此中間可能被有心人士的設備或程式讀取。但被讀取不代表能假造,因為駭客沒有之功要,因此無法假造出RRSIG的資料而不被發覺。
  1. 服務可用性
DNSSEC是一項服務,若遇到有心人士發動DDoS攻擊,不斷的詢問大量網址,可能會造成伺服器的負荷過重而無法正常運作。