現在很多服務都需要DNS 用來解析網域名稱及其對應IP,所以DNS佔的重要性可想而知

而現在的DNS是有弱點存在的

1。DNS cache poisoning

DNS的運作是用ID作為辨識認證,意思是我叫 cache server 去幫我查我要的domain,server跟server傳遞是靠ID,
只要cache server傳出去的ID回來了,cache server就會以為它就是我要查的,把它接收回給我,
如果攻擊者隨機的發送夾帶錯的解析的ID給cache server,我也就會收到這個錯誤的解析。
而聽說 DNSSEC 只是將ID亂數化 ?!!

2。man in the middle attack

就把它想成是假的 DNS Server

ref: 更具破壞力的DNS攻擊:中國最大搜尋網百度遭駭事件
http://www.isecutech.com.tw/article/article_detail.aspx?aid=5616#ixzz1QjyyU6rC

3。Domain hijacking

系統被入侵、直接竄改DNS資料

什麼是 DNSSEC

全名叫: DNS Security Extensions

它是現在DNS的延伸,只是用來補強安全性,非修改現在運作模式

它也只是驗證資料來源,並不是要用來加加密

DNSSEC = DNS RR + 數位簽章 (HASH雜湊+非對稱金鑰)

用 dig 來查的話,它回給你的會是叫作 RRSIG

而同樣的 fqdn / type 只會有一筆 RRSIG

DNSSEC 也增加四種 RR type (DNSKEY、RRSIG、DS、NSEC),跟 NS、A、MX是類似的東西

。DNSKEY – public key 公開金鑰
。RRSIG – 數位簽章 (hash + private key)
。DS – 上下層的DNSKEY驗證用,ref: http://phorum.study-area.org/index.php?topic=60268.0
。NSEC – 回應負面消息 =  Non-existent domain (NXDOMAIN),回應這個不存在的domain的上下domain來表示它不存在 (簽署時會排序)

而 NSEC 是有缺點的: 我如果一直批次掃不存在的domain,不就可以dump出整個ZONE裡的資料了

所以又延伸出NSEC3: 先把domain Hash後再排序,回應資料上下筆domain是不存在的

DNSSEC的驗證流程

1. 上圖的上半部代表 Server端,下半部代表 Client 端
2. Client 要查詢 ssorc.tw
3. Server 回應了 RRSIG (A記錄經過 hash 後,再用 私鑰 private key 打包產生)
4. Client 收到 RRSIG 後用 public key (DNSKEY) 解開得到 hash,public key 是用 dig DNSKEY ssorc.tw 查到的
5. Client 再去 dig ssorc.tw 的 A 記錄後自行 hash
5. 兩者 hash 值比對看是否match,match 對的話就是正確的來源記錄,可以稍作信任 (這邊說的稍作信任是key也是會有被破的一天,所以要固定時間更換key以策安全)

建置 DNSSEC – – 安裝新版 BIND

至 BIND 官網 http://www.isc.org/software/bind
下載 bind-9.8.0-P2.tar.gz
tar zxvf bind-9.8.0-P2.tar.gz
./configure –prefix=/usr –sysconfdir=/etc –localstatedir=/var –enable-threads –enable-ipv6
make ; make install

vi /etc/named.conf

zone "example.tw" {
        type master;
        file "example.tw”;
};

vi /var/named/run-root/var/example.tw

$TTL    86400

@       IN      SOA     ns1.example.tw. root.example.tw. (
                        1292483221      ; Serial
                        10800   ; Refresh
                        3600    ; Retry
                        604800  ; Expire
                        10800 ) ; Minimum

example.tw.              IN NS   ns1.example.tw.
example.tw.              IN NS   ns2.example.tw.
example.tw.              IN A    1.1.1.1
ns1.example.tw.          IN A    1.1.1.1
ns2.example.tw.          IN A    1.1.1.1
webmail.example.tw.              IN A    1.1.1.1
mail.example.tw.                 IN A    1.1.1.1
www.example.tw.          IN A    1.1.1.1
ftp.example.tw.          IN CNAME        example.tw.
example.tw.              IN MX  10 mail.example.tw.

建置 DNSSEC – – 建立 DNSKEY

mkdir /root/dnskey;cd /root/dnskey
dnssec-keygen -r /dev/urandom -n ZONE example.tw
dnssec-keygen -r /dev/urandom -f KSK -n ZONE example.tw

會產生兩個檔案,一個是私鑰、一個是公鑰

-rw-r–r–  1 root root  429 Jun 30 17:00 Kexample.tw.+005+32415.key
-rw——-  1 root root 1010 Jun 30 17:00 Kexample.tw.+005+32415.private
-rw-r–r–  1 root root  603 Jun 30 17:02 Kexample.tw.+005+44701.key
-rw——-  1 root root 1774 Jun 30 17:02 Kexample.tw.+005+44701.private

格式說明:
K(domain).+(演算法)+(key id).key
K(domain).+(演算法)+(key id).private

key還有分兩個: (用 257及 256區分誰是誰)
KSK – 是上下層驗證用的,257 , 2048bits
ZSK – 是client跟server驗證用的,256 , 1024bits

建置 DNSSEC – – 匯入/簽署

cat K*.key >> /var/named/run-root/var/example.tw
dnssec-signzone -o example.tw -k  Kexample.tw.+005+44701.key /var/named/run-root/var/example.tw  Kexample.tw.+005+32415.key

這個動作會產生 example.tw.signed 檔,再來就到 named.conf修改為 example.tw.signed

建置 DNSSEC – – 修改 ZONE

vi /etc/named.conf

zone "example.tw" {
        type master;
        file "example.tw.signed”;
};

建置 DNSSEC – – restart BIND

service named restart

more /var/log/messages

Jun 30 17:13:36 lo135 named[19910]: zone example.tw/IN: loaded serial 1292483221 (DNSSEC signed)

可以看到 DNSSEC signed 的字串,表示成功讓DNS有DNSSEC功能了

測試

dig +dnssec @localhost example.tw

example.tw.             86400   IN      RRSIG   A 5 2 86400 20110730085040 20110630085040 32415 example.tw. Z7VZCIKBv09BZz8Js20v4FDQcHRX1APsgtswlUMyTkZYJ8ggIQB8izNk kfbM6F2ZE6Ukbw5NA7s+VawVzsoQgKjo8LR+tdx68WdXqR+K5T7VKWSi uTfDbVRec7HfXVSw87JICz5wPt2S2SLzb5d0WF8R1cXWIJ7HkMJY5KkN 5yg=

格式說明:
domain TTL IN RRSIG A 演算法 ? 原本的TTL 到期日 啟始日 keyid dmoain 簽章

如果要查 public key

dig example.tw @localhost DNSKEY

FireFox 有一外掛套件 DNSSEC Validator,可以檢測瀏覽的網站是否有DNSSEC

http://www.dnssec-validator.cz/

 有DNSSEC,但是ip可能不是原本的,或簽章有問題
 有DNSSEC,但是DNS server的無法驗證簽章
 有DNSSEC,高可信任的 (www.root-dnssec.org)
 正在驗證DNSSEC
 沒有作DNSSEC

後續

Key rollover – key是有有效期限的,需固定時間更換才行,這樣子才能盡量防止 key被破解而被竄改 DNS記錄 (應該吧)
子網域簽署 – 子網域怎麼授權
DDNS – 動態 DNS又是怎麼運作的
Slaver DNS – 怎麼同步到 slave 伺服器

ref:
http://phorum.study-area.org/index.php?topic=60268.0
http://www.myhome.net.tw/2011_04/p13.htm
http://dns-security.twnic.net.tw/SEC100/files/50.pptx

 

最後修改日期: 2011 年 09 月 16 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。