DNS服務器的安全策略

DNS域名解析服務是網絡的基礎服務,承擔着將域名翻譯爲計算機可以識別的IP地址,以及尋找IP地址對應的逆向翻譯工作。一旦DNS服務出現故障,用戶就無法通過採用域名的方式進行互聯網訪問,相應的郵件服務器也會由於無法進行正常的域名解析而出現故障。
  由於DNS服務對於網絡非常重要,所以它成爲網絡***的重要目標。

正視安全隱患
  DNS服務面臨的安全隱患主要包括DNS欺騙(DNS Spoffing)、拒絕服務(Denial of service,DoS)***和緩衝區漏洞溢出***(Buffer Overflow)。
1.DNS欺騙
  DNS欺騙會使那些易受***的DNS服務器產生許多安全問題,例如:將用戶引導到錯誤的互聯網站點,或者發送一個電子郵件到一個未經授權的郵件服務器。


  DNS欺騙即域名信息欺騙,是最常見的DNS安全問題。當一個DNS服務器掉入陷阱,使用了來自一個惡意DNS服務器的錯誤信息,那麼該DNS服務器就被欺騙了。
  網絡***者通常通過兩種方法進行DNS欺騙。
  緩存感染。***會熟練地使用DNS請求,將數據放入一個沒有設防的DNS服務器的緩存當中。這些緩存信息會在客戶進行DNS訪問時返回給客戶,從而將客戶引導到***者所設置的運行***的Web服務器或郵件服務器上,然後***再從這些服務器上獲取用戶信息。
  DNS信息劫持。***者通過監聽客戶端和DNS服務器的對話,通過猜測服務器響應給客戶端的DNS查詢ID。每個DNS報文包括一個相關聯的16位ID號,DNS服務器根據這個ID號獲取請求源位置。***在DNS服務器之前將虛假的響應交給用戶,從而欺騙客戶端去訪問惡意的網站。
2.拒絕服務***
  ***主要利用一些DNS軟件的漏洞,如在BIND 9版本(版本9.2.0以前的 9系列)中,如果有人向運行BIND的設備發送特定的DNS數據包請求,BIND就會自動關閉。***者只能使BIND關閉,而無法在服務器上執行任意命令。
  如果得不到DNS服務,就會產生一場災難:由於網址不能解析爲IP地址,用戶將無方訪問互聯網。這樣,DNS產生的問題就好像是互聯網本身所產生的問題,這將導致大量的混亂。
3.緩衝區漏洞溢出***
  ***利用DNS服務器軟件存在漏洞,比如對特定的輸入沒有進行嚴格檢查,那麼有可能被***者利用,***者構造特殊的畸形數據包來對DNS服務器進行緩衝區溢出***。
  如果這一***成功,就會造成DNS服務停止,或者讓***者可以在DNS服務器上執行其設定的任意代碼。例如, 前一陣子針對Linux平臺的BIND的***(e.g. Lion worm)程序,就是利用某些版本的BIND漏洞,取得root權限,一旦***完成之後,***者就可以完全控制整個相關的網絡系統,影響非常嚴重。
  應對上述安全隱患的方法中有兩個非常有效:
  ◆ 保持運行最新沒有缺陷的DNS版本。大多數Linux和Unix、BSD操作系統運行的都是BIND(Berkeley Internet Name Domain)服務器。它的最新安全版本在其官方網站:http://www.isc.org/下載源代碼安裝即可。例如針對拒絕服務***,只要將Linux的BIND 9升級爲版本9.2.1即可。
  ◆ 保持DNS服務器配置正確、可靠。這一點相對困難。Linux上的域名服務由named守護進程控制,該進程從主文件:/etc/named.conf中獲取信息。它包括一組將主機名稱映射爲IP地址的各種文件,詳細內容參  見“named配置文件族”。
  可以看到,DNS配置文件是一個複雜的系統。伴隨DNS建立出現的許多問題都會引起相同的結果,但起因卻不同。但大多數問題是由於配置文件中的語法錯誤而導致的。
  DNS是一組文件構成的,所以需要不同工具檢查對應文件。

配置一個安全的BIND服務器
  下面以使用最爲廣泛的Unix類DNS軟件BIND爲例,介紹如何配置一個安全DNS服務器。本文以Redhat Linux 9.0爲工作平臺。
檢查DNS配置文件
  一個配置存在缺陷的DNS服務器會存在很大的安全漏洞。這裏可以通過一些工具如nslookup、dig、named-checkzone、host、named-checkconf、dlint等對DNS配置文件進行檢查。其中安裝BIND軟件包時自動安裝的工具包括nslookup、dig、named-checkzone、host、named-checkconf。
  工具推薦:dlint是一個專門檢查DNS配置文件開放源代碼軟件,可以在http://www.domtools.com/下載。它的功能如下:
  (1)首先檢查配置文件的拼寫錯誤。
  (2)有A(Address)記錄的主機名稱必須有PTR記錄。如果有A記錄的主機名稱沒有PTR,則配置文件不能通過。dlint可以在用戶配置文件中爲A記錄查找丟失的PTR記錄。
  (3)dlint會記錄in-addr.arpa區帶的每一條PTR記錄是否有對應的A記錄存在。
  (4)dlint會以遞歸的方式檢查子區帶,查找它們的配置問題。dlint軟件可以分析任何DNS區帶。
隱藏BIND的版本號
  通常軟件的BUG信息是和特定版本相關的,因此版本號對***來說是非常有價值的信息。
  ***使用dig命令可以查詢BIND的版本號,然後就可以知道這個軟件有哪些漏洞。因此,隨意公開版本號是不明智的。
  隱藏BIND版本號比較簡單,修改配置文件:/etc/named.conf,在option部分添加version聲明將BIND的版本號信息覆蓋。例如使用下面的配置聲明,當有人請求版本信息時,迫使nmaed顯示:“Unsupported on this      platform”。
  options {
  version “Unsupported on this platform”;
  };
避免透露服務器信息
  和版本號一樣,也不要輕易透露服務器的其他信息。爲了讓潛在的***更難得手,建議不要在DNS配置文件中使用HINFO和TXT這兩個資源記錄。
關閉glue fetching選項
  當DNS服務器返回一個域的域名服務器紀錄,並且域名服務器紀錄中沒有A紀錄時,DNS服務器會嘗試獲取一個紀錄,稱爲glue fetching。***者可以利用它進行DNS欺騙。關閉glue fetching是一個好方法,修改配置文件/etc/named.conf,加入一行:
  options no-fetch-glue
使用非root權限運行BIND
  在Linux內核2.3.99以後的版本中,可以以-u選項以非root權限運行BIND。命令如下:
  /usr/local/sbin/named -u nobody
  說明:上面的命令表示以nobody用戶身份運行BIND。使用nobody身份運行能夠降低緩衝區溢出***所帶來的危險。
控制區域(zone)傳輸
  默認情況下BIND的區域(zone)傳輸是全部開放的,如果沒有限制,那麼DNS服務器允許對任何人都進行區域傳輸的話,網絡架構中的主機名、主機IP列表、路由器名和路由IP列表,甚至包括各主機所在的位置和硬件配置等情況都很容易被***者得到。因此,要對區域傳輸進行必要的限制。可以通過在/etc/named.conf文件當中添加以下語句來限制區域傳輸:
  acl “zero-transfer” {192.168.0.52;192.168.0.109;};
  zone “yourdomain.com”{
  type master;
  file “yourdomain.com”;
  allow-rtransfer {zero-transfer;};};
  這樣只有IP地址爲192.168.0.52到192.168.0.109之間的主機能夠同DNS服務器進行區域傳輸。
請求限制
  如果任何人都可以對DNS服務器發出請求,這是不能接受的。限制DNS服務器的服務範圍很重要,可以把許多***者拒之門外。
  修改BIND的配置文件/etc/named.conf,加入以下內容:
  options {
  allow-query {168.192.1.0/24;};
  };
  zone “yourdomain.com” {
  type master;
  file “yourdomain.com”;
  allow-query {any;};
  };
  zone “1.168.192.in-addr.arpa” {
  type master;
  file “db.192.168.1”;
  allow-query {any;};};
  這樣,所有的用戶都可以訪問yourdomain.com的DNS服務器,但是隻有168.192.1.0網段的主機用戶可以請求DNS服務器的任意服務。
  另外,也不要允許其他網段的主機進行遞歸詢問,在上面文件最後加入下面一行即可:
  allow-recursion {192.168.1.0/24;};
  爲BIND創建chroot


  chroot是指更改某個進程所能看到的根目錄,即將某進程限制在指定目錄中,保證該進程只能對該目錄及其子目錄的文件有所動作,從而保證整個服務器的安全。
  BIND9.x系列版本簡化了chroot的步驟,下面是創建chroot步驟:
  (1)爲BIND端口監督程序創建一個用戶。BIND端口監督程序將由用戶dns 來運行。
  useradd dns -d /home/dns
  (2)建立目錄:
  mkdir -p /home/dns/var/log;mkdir -p /home/dns/var/run
  mkdir -p /home/dns/var/named;mkdir -p /home/dns/etc
  (3)拷貝文件:
  cp /etc/named.conf /home/dns/etc/
  cp -r /var/named/* /home/dns/var/named/
  (4)設定相應權限:
  chown -R dns:dns /home/dns
  (5)用dns身份運行域名服務器:
  /usr/local/sbin/named -t /home/dns -u dns
使用DNSSEC
  DNS欺騙spoofing對目前網絡應用的最大沖擊在於冒名者藉着提供假的網域名稱與網址的對照信息,可以將不知情用戶的網頁聯機,引導到錯誤的網站,原本屬於用戶的電子郵件也可能因而遺失,甚而進一步空開成爲阻斷服務的***。所幸,目前較新的BIND版本針對這一類問題已經加入了許多改進的方法。不過真正的解決方案則有賴封包認證機制的建立與推動。
  DNSSEC就是試圖解決這一類問題的全新機制,BIND9 已經完整加以設計並完成。DNSSEC引入兩個全新的資源記錄類型KEY和SIG,允許客戶端和域名服務器對任何DNS數據的來源進行密碼驗證。
  DNSSEC主要依靠公鑰技術對於包含在DNS中的信息創建密碼簽名。密碼簽名通過計算出一個密碼hash數來提供DNS中數據的完整性,並將該hash數封裝進行保護。私/公鑰對中的私鑰用來封裝hash數,然後可以用公鑰把hash數譯出來。如果這個譯出的hash值匹配接收者剛剛計算出來的hash數,那麼表明數據是完整的。
  不管譯出來的hash數和計算出來的hash數是否匹配,對於密碼簽名這種認證方式都是絕對正確的,因爲公鑰僅僅用於解密合法的hash數,所以只有私鑰的擁有者可以加密這些信息。
其他安全建議
  儘量採用最新版本的BIND,並定時注意任何相關的安全通報,採用適當的補丁(patch)。域名服務器只提供單一DNS服務器的服務,降低因爲其他服務漏洞可能造成的威脅。隨時察看日誌文件(log),檢查有無異狀。早期發現早期治療。

  編後語:DNS是網絡服務的基礎建設,要長期不斷地保持其正常運作,每一個DNS服務器都應該定期檢測。綜合使用多種手段才能保障DNS服務器的安全。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章