2008年7月7日 星期一

DNS系統的強化與保護

前言:
  隨著網路服務的進步,DNS 伺服器管理與維護問題也愈來愈受到重視。DNS 運作主要
目的是將主機名稱 (hostname) 對應到 IP 位址,近年來 DNS 服務傳遞的資訊常發生被
竄改、惡意詐欺…等事件,可能造成使用者的重要資訊在不察的情況下被盜取。舉列而言
,像是透過 DNS Spoofing 技術,竄改正確的 DNS 名稱查詢服務回應,導致使用者權利
受損。

為避免上述情況發生,本文將以身為 DNS 管理者日常應如何維護 DNS 伺服器之介紹為主
,說明 DNS 系統查詢或 log 檔觀察所應注意的事項,另介紹 TSIG 的實作與 SIG 的簡
易說明。

一、DNS 管理者的日常工作
  做為 DNS 伺服器管理者,除了需注意查看 DNS 系統是否正常存活之外,仍需檢查系
統紀錄,可透過檢查系統紀錄中發現是否有些異常的事件發生,底下將教導以簡易的方式
來監看 DNS 伺服器的正常性與安全性。

1.查詢 DNS 系統是否正常:
  指令(一):nslookup,主要是用來查詢網域名稱與 IP 對應的偵錯模式。它隨附在
BIND 套件中發行,但由於 nslookup 有缺點存在,BIND 9 所流通的套件已將逐漸淘汰、
不再維護,但仍因其使用普遍,故仍以予介紹。
語法:nslookup [-option ...] [host-to-find | -[server]]
簡易範例:
[root@dns root]# nslookup
Note: nslookup is deprecated and may be removed from future releases.
Consider using the 'dig' or 'host' programs instead. Run nslookup with
the '-sil[ent]' option to prevent this message from appearing.

查看目前的 DNS 系統是哪一台:
>server
Default server: 168.95.1.1
Address: 168.95.1.1#53

將目前的 DNS 系統轉移到要查詢的 DNS 系統上:
> server dns.mis.stu.edu.tw
Default server: dns.mis.stu.edu.tw
Address: 210.71.14.66#53

指定要查詢 DNS 系統底下的某一特定 domain name:
> www.mis.stu.edu.tw
Server: dns.mis.stu.edu.tw
Address: 210.71.14.66#53

Name: www.mis.stu.edu.tw
Address: 210.71.14.65
>

以上是透過使用 nslookup 指令來查詢 DNS 系統是否有異常,若查詢到 domain name 與
IP 沒對應時,則管理者需注意查看 DNS 系統設定是否有誤或是可能被入侵…等問題。

指令(二):dig,藉由對 DNS 伺服器來對 domain name 做查詢。
語法:dig @dns_server domain
簡易範例:
[root@backup root]# dig @dns.mis.stu.edu.tw www.mis.stu.edu.tw
; <<>> DiG 9.2.2-P3 <<>> @dns.mis.stu.edu.tw www.mis.stu.edu.tw
;; global options: printcmd
;; Got answer:
……
;; QUESTION SECTION:
;www.mis.stu.edu.tw.      IN   A
;; ANSWER SECTION:
www.mis.stu.edu.tw.  3600   IN   A   210.71.14.65
以下結果將省略

當查詢結果中若沒”ANSWER SECTION”的話,即欲查詢的 domain name 是不存在的。

2.檢查系統紀錄:
以 Linux 系統為列,事件紀錄檔通常存於 /var/log 底下,當系統管理者要做一般日常
工作檢查時,需檢查的 log 檔如 corn、messages、secure 這三個檔案。corn 作用在
於紀錄定時起動的事件,messages 作用在於系統紀錄檔,secure 作用在於登入者資訊。
定期的檢查事件紀錄檔能有助於回溯事發狀態。

(1).corn Log:用來紀錄crontab 例行服務的內容。
(2).messages Log檔:是系統中最重要的紀錄檔,系統發生的錯誤訊息或重要資訊都將記
錄在此檔案中。此外,此檔需經設定,否則光伺服器的啟動、使用者狀態等等紀錄相加起
來是個很龐大的檔案。
(3).secure Log:作用在於記錄並統計使者用者登入系統存取資料、服務相關的訊息,如
telnet、ssh、ftp 等都將被紀錄在此檔案中,從此檔案可觀察出是否有不正常之登入情
況。

二、一般強化功能
1.ACLs:存取控制清單 (Access Control Lists),主要目的在於產生具名的位址配對清
單。在此也介紹位址匹對清單,其是一份設定項清單,可包含單一的 IP 位址、IP prefix
或一個具名的 ACLs。
語法:acl “name” { address_match_list };
   address_match_list:位址匹對清單。
範例:acl “mis”{192.168.200.15,192.168.143.192/26};

2.Forwarders:代詢伺服器機制,它將自己無法解析的查詢轉送到某特定的伺服器。
語法:forwarders ip_address_liest
範例:以下是建議的 forwarders 設定(在/etc/named.conf中)
   orwarders { // 指定提供查詢的上層 DNS。
   www.twnic.net.tw ; // 到上層 (twnic) 的 DNS 查詢。
   };
需注意的是通常我們指定的是到本身上一層 dns,但也可能因 dns cache 有誤而轉送到
錯誤的伺服器上。盡可能的讓上一層指向到像 twnic 或較正常組織比較安全的 dns 上,
這樣的指定較有公信力,不要讓伺服器隨便指到另一台伺服器上面。

3.allow-transfer:目的在於只允許授權的網域主機能更新、讀取 DNS 轄區內的記錄。
語法:allow-transfer { <address_match_list> };
   address_match_list:允許進行 DNS 轄區資料傳輸主機的 IP 列表。

4.allow-update:目的在於指定能向本 dns 伺服器提交動態 dns 更新的主機
語法:allow-update { <address_match_list> };
   address_match_list:允許能向本 DNS 伺服器提交動態 DNS 更新的主機 IP 列表

5.allow-query:目的在於限制對 DNS 伺服器進行域名查詢的主機,也就是允許在 IP 列
表中的主機才能對 DNS 伺服器進行域名查詢。
語法:allow-query { <address_match_list> };
   address_match_list:允許進行域名查詢的主機 IP 列表。

範列:在 /etc/named.conf 中設定 allow-transfer、allow-update 與 allow-query,
可以讓資料資料更安全,不輕易的外洩。
zone "wsl.sinica.edu.tw" {
type master;
file "/dbfile/db.wsl";
allow-transfer { 192.168.0/24; 192.168.1.1; };
// zone transfer 的時候,只限於 192.168.0/24; 192.168.1.1; 這些 ip 可以進行
zone transfer 的動作
allow-query { 192.168.200/16;};
allow-update {192.168.143.152};
};

三、進階保護功能
  動態 DNS 的金鑰選擇分為 TSIG (transaction signature) 與 SIG0 (SIGnature)
兩種。該如何選擇金鑰呢? 首先,要先判斷 client 與 server 間的信任關係為何,若是
可信任者,可選擇對稱式金鑰的 TSIG。TSIG 只有一組密碼,並無公開/私密金鑰之分;
若是非完全信任者,可選擇非對稱式金鑰的 SIG0,雖有公開/私密金鑰之分,相對的,設
定上也較複雜。至於要選用哪種較適合,就由自己來判斷。在此將詳述 TSIG 的實作;至
於 SIG0,因設定上較複雜,故在此只簡介何謂 SIG0。

1.TSIG技術
  交易簽章 (TSIG;RFC 2845),是為了保護 DNS 訊息安全而發展的。BIND 8.2 導入
了 TSIG 機制,其驗證 DNS 訊息方式是使用共享金鑰 (Secret Key) 及單向雜湊函式
(One-way hash function) 來提供訊息的驗證和資料的完整性。主要針對 ZONE Transfer
進行保護的作用,利用密碼學編碼方式為通訊傳輸資訊加密以保證 DNS 訊息的安全,特
別是回應與更新的訊息資料。也就是說在DNS伺服器之間進行轄區傳送時所提供保護的機
制,以確保傳輸資料不被竊取及監聽。

範例 (以 BIND 為例):
在開始之前,必須為 master DNS 與 slave DNS 進行時間同步化的設定,否則會造成
Zone Transfer 的失敗。

步驟一:執行 dnssec-keygen function 產生加密金鑰,一個為 public key 檔,另一個
為 private key 檔
‧產生加密金鑰:
dnssec-keygen –a hmac-md5 –b 512 –n ZONE dns.ca
‧公開金鑰- -kdns.ca.key:
$cat Kdns.ca.+157+06543.key
Dns.ca. IN KEY 256 3 157
cuernF5WpC81bs6phLbraw7VjSzX4OGoEfLNj1NjLzjkxE/S/Qxr3NksFMA
GlQJC00DRPXveoDvTBeLwdQ/Rsq9LQ= =
‧私密金鑰- -kdns.ca.private:
$cat Kdns.ca.+157+06543.private
Private-key-format: v1.2
Algorithm: 157 (HMAC_MD5)
Key: FPQCxP1e4ZJH4M6DBFkBEw= =
cuernF5WpC81bs6phLbraw7VjSzX4OGoEfLNj1NjLzjkxE/S/Qxr3NksFMA
GlQJC00DRPXveoDvTBeLwdQ/Rsq9LQ= =

步驟二:TSIG 金鑰,master DNS 與 slave DNS 之設定檔皆需加入 TSIG 金鑰
‧primary master的named.conf設定:
key dns.ca. {
  algorithm hmac-md5;
secret “cuernF5WpC81bs6phLbraw7VJsZx4ogOeF1nJlZJKXe/s/
Qxr3NksFMAGlQJC00DRPXveoDvTBeLwdQ/Rsq9LQ= =”;
};

步驟三:設定allow-transfer清單
‧設定master DNS的named.conf:
zone "dns.ca" IN {
  type master;
  file "master";
  allow-transfer { key dns.ca.; };
  notify yes;
};

步驟四:設定allow-transfer清單
‧設定slave DNS 的named.conf:
server 192.168.1.10 {
  keys { dns.ca.; };
};

zone “dns.ca" IN{
type slave;
file "/var/named/slave";
masters { 192.168.1.10; };
};

步驟五:再次啟動與載入設定檔並檢查是否有錯誤
‧使用 ndc reconfig nameserver,先停止再重新啟動。
‧查看 system log 檔是否有 warnings 或 error 的發生。

為確保安全性的問題,TSIG 可確認 DNS 之資訊是由某特定 DNS Server 所提供。通常
TSIG 應用於 DNS 間的 ZONE Transfer,確保資料不會被篡改或產生 dns spoofing。

2.SIG0 技術
SIG0,March 1999 由 IBM D. Eastlake 提出成為標準。其是利用公開金鑰機制為轄區資
料進行數位簽章的動作,以保證每筆傳輸的 source record 具有可驗證性與不可否認性。
實際上 SIG0 才是防止 DNS Spoofing 發生最主要的技術,SIG0 是使用公開金鑰加密法,
讓轄區管理者為其轄區資料加上數位簽章,由此證明轄區資料的可信賴性。除此之外,
SIG0 保有是否選擇認證機制的彈性,以及可靈活地配合自訂的安全機制。

以下是利用 SIG0 技術加上數位簽章後的部分轄區資料:

mails.apacer.dnssec.test.edu.tw. 3600 IN A 210.71.14.x
3600 RRSIG A 5 7 3600 20050206095648 (
  20050107095648 51176 apacer.dnssec.teset.stu.edu.tw.
  TR1V0WXczhNg3034/JNR+SgE6SZtRskR5JHV
  fp1Shemp1heTB0dbnZC0DeOBg+ACsbn5/KG4
  F6THmRYejoY+Ag== )
  3600 NSEC apacer.dnssec.mis.stu.edu.tw. A RRSIG NSEC
3600 RRSIG NSEC 5 7 3600 20050206095648 (
  20050107095648 51176 apacer.dnssec.test.stu.edu.tw.
  dQd7HZ9IUFcS9IR/NFTJ/Em4zy03qxvVkAvO
  vbzb8rC0YFjQknjd/5r6+AJIe7RH/T6mQRKp
  P3uJGDH8O9jtlA== )

因 SIG0 技術的設定並啟動,其複雜性並非一般管理者所能接受並使用。除非該 DNS 伺
服器內有極為重要的資訊,如金融機構的 IP 位址,才有必要利用 DNSSEC 機制來保護相
關訊息。

四、結論
  相信許多人期待在日新月異的網際網路中看到創新的網路技術,並能提供更好的網路
應用服務。重要的一點,我們不能忽略基礎網路服務的重要性,而 DNS 服務就是這些基
礎網路服務中最重要之一,持續維持 DNS 服務的運作並讓 DNS 服務所提供的資訊是正確
的。本文除了提供 DNS 管理者能簡易的維護 DNS 伺服器之外,也期許能降低一般管理者
進入 DNSSEC 的門檻。透過對 DNS 伺服器的維護與管理,不但能強化 DNS 伺服器所提供
的資訊的安全,也有助於減少 DNS Spoofing 攻擊的發生,增進網路使用者對網際網路使
用的信任,杜絕資訊系統遭受入侵與攻擊的產生。

五、參考文獻
[1]Paul Albitz & Circket Liu 著,蔣大偉 編譯,DNS and BIND管理 4/e,2003年4月。
[2]陳威安,DNS 安全研討會-DNS 安全機制實作,
http://cu.nsysu.edu.tw/1000112970/93-01/pdfdoc/DNS_vulnerability4.pdf
[3]鄭進興、陳威安、林敬皇、陳嘉玫,DNSSEC 安全機制實作研究,TANET2004

沒有留言: