前陣子在看 Cloudflare一些相關設定,剛好看到 DNSSEC這個技術名詞,以下是認識後的筆記。
參考資料:
https://www.cloudflare.com/dns/dnssec/how-dnssec-works/
http://www.cc.ntu.edu.tw/chinese/epaper/0022/20120920_2206.html
DNS與DNSSEC
DNS,域名系統,用來將人類好記憶的文字域名轉換為 ip位置,就好像電腦世界的電話簿一般;
但是DNS最大問題在於,取得紀錄後卻沒有驗證紀錄是否正確或是被竄改的方法,這也是 DNSSEC(Domain Name System Security Extensions) 的出現。
數位簽章
DNSSEC是透過數位簽章的方式,確保DNS查詢的紀錄沒有被竄改,所以先來簡單介紹什麼是數位簽章。
簽章,是為了確保消息不被竄改性
與不可誣賴性
,像是契約要一試兩份,雙方確認好內容,最終簽字畫押;
假設某天甲方竄改了契約內容,乙方可以拿出當初保留的契約反駁;
又或是乙方想要否認契約,但是甲方同樣可以拿出契約中的乙方簽章證明。
甲 –> 自己產生公鑰與私鑰,公鑰可以讓所有人取得,私鑰要保護好
今天甲要給乙一份文件 Doc,為了比對用 hash產生雜湊值H
接著甲將雜湊值H用私鑰加密成 H_encrypted,H_encrypted 也就是數位簽章
甲將 {Doc,H_encrypted} 交由丙轉交給乙,此時丙偷改了 Doc
乙收到後,將 Doc依照約定的hash產生出雜湊值 H’
接著用甲的公鑰解開 H_encrypted => H,發現H’ != H,發現內容被竄改了!
-————–
假設剛才 Doc沒有被竄改,乙方驗證並確認收到甲傳遞的訊息
但是某日甲想要反悔說沒有簽署過該份合約
此時乙一樣拿甲的公鑰解密數位簽章,接著比對 Doc透過hash的雜湊值,發現是一樣的,因為公鑰/私鑰是獨一無二(非常難碰撞),只有公鑰可以解開私鑰加密的內容(反之亦然),所以篤定 Doc是甲簽署的。
DNSSEC
1.DNS紀錄有多種型別,假設是宣告AAAA型別,也就是將域名對應IPv6的紀錄,每一筆記錄縮寫為RR;
而在簽署過程,會把同樣型別的紀錄整合為一組,也就是這邊看到的RRset
。
2. 接著將RRset產生數位簽章,也就是RRSIG,接著回覆DNS紀錄時,總共要給三樣東西{RRset / RRSIG / Public ZSK}
Public ZSK也就是DNS Server的公鑰。
用戶就可以拿 Public ZSK解開 RRSIG,比對 RRset,就可知道該RRset是否真的來自DNS Server
如何確保 Public ZSK是沒有被竄改
這又可以套用數位簽章了,子DNS Server會向父 DNS Server 提交他的 Public ZSK;
父DNS Server就當作 {子DNS Server → Public ZSK}
當作是一筆 RRSet(又稱DS,Delegation Signer)
接著一樣用自己的公鑰(Public KSK)簽署數位簽章
但問題還是在,要如何在確保 Public KSK是正確的呢?
這會無限遞迴數位簽章直到 DNS Root Server,這也是信任鍊(Chain of Trust)。
有興趣看dns解析會走過些路徑可以用下列工具,像是 google.com,會先到 root dns server -> .com dns server -> google.com dns server -> return AA record
那我們可以全盤相信 Root Server嗎?
這篇文章說明了整個Root Server在發布公鑰/私鑰的嚴謹性,頂級域名商(.com, .edu, .org …)他們的專業維護整個網路安全的可靠性與可信度。